diff options
Diffstat (limited to 'drivers')
1856 files changed, 10261 insertions, 7359 deletions
diff --git a/drivers/accel/habanalabs/common/memory.c b/drivers/accel/habanalabs/common/memory.c index 3348ad12c237..601fdbe70179 100644 --- a/drivers/accel/habanalabs/common/memory.c +++ b/drivers/accel/habanalabs/common/memory.c @@ -14,7 +14,7 @@  #include <linux/vmalloc.h>  #include <linux/pci-p2pdma.h> -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  #define HL_MMU_DEBUG	0 diff --git a/drivers/accel/ivpu/ivpu_gem.c b/drivers/accel/ivpu/ivpu_gem.c index d8e97a760fbc..16178054e629 100644 --- a/drivers/accel/ivpu/ivpu_gem.c +++ b/drivers/accel/ivpu/ivpu_gem.c @@ -409,7 +409,7 @@ static void ivpu_bo_print_info(struct ivpu_bo *bo, struct drm_printer *p)  	mutex_lock(&bo->lock);  	drm_printf(p, "%-9p %-3u 0x%-12llx %-10lu 0x%-8x %-4u", -		   bo, bo->ctx->id, bo->vpu_addr, bo->base.base.size, +		   bo, bo->ctx ? bo->ctx->id : 0, bo->vpu_addr, bo->base.base.size,  		   bo->flags, kref_read(&bo->base.base.refcount));  	if (bo->base.pages) diff --git a/drivers/accel/ivpu/ivpu_mmu_context.c b/drivers/accel/ivpu/ivpu_mmu_context.c index 891967a95bc3..0af614dfb6f9 100644 --- a/drivers/accel/ivpu/ivpu_mmu_context.c +++ b/drivers/accel/ivpu/ivpu_mmu_context.c @@ -612,18 +612,22 @@ int ivpu_mmu_reserved_context_init(struct ivpu_device *vdev)  	if (!ivpu_mmu_ensure_pgd(vdev, &vdev->rctx.pgtable)) {  		ivpu_err(vdev, "Failed to allocate root page table for reserved context\n");  		ret = -ENOMEM; -		goto unlock; +		goto err_ctx_fini;  	}  	ret = ivpu_mmu_cd_set(vdev, vdev->rctx.id, &vdev->rctx.pgtable);  	if (ret) {  		ivpu_err(vdev, "Failed to set context descriptor for reserved context\n"); -		goto unlock; +		goto err_ctx_fini;  	} -unlock:  	mutex_unlock(&vdev->rctx.lock);  	return ret; + +err_ctx_fini: +	mutex_unlock(&vdev->rctx.lock); +	ivpu_mmu_context_fini(vdev, &vdev->rctx); +	return ret;  }  void ivpu_mmu_reserved_context_fini(struct ivpu_device *vdev) diff --git a/drivers/accel/ivpu/ivpu_pm.c b/drivers/accel/ivpu/ivpu_pm.c index dbc0711e28d1..949f4233946c 100644 --- a/drivers/accel/ivpu/ivpu_pm.c +++ b/drivers/accel/ivpu/ivpu_pm.c @@ -378,6 +378,7 @@ void ivpu_pm_init(struct ivpu_device *vdev)  	pm_runtime_use_autosuspend(dev);  	pm_runtime_set_autosuspend_delay(dev, delay); +	pm_runtime_set_active(dev);  	ivpu_dbg(vdev, PM, "Autosuspend delay = %d\n", delay);  } @@ -392,7 +393,6 @@ void ivpu_pm_enable(struct ivpu_device *vdev)  {  	struct device *dev = vdev->drm.dev; -	pm_runtime_set_active(dev);  	pm_runtime_allow(dev);  	pm_runtime_mark_last_busy(dev);  	pm_runtime_put_autosuspend(dev); diff --git a/drivers/accel/qaic/qaic_drv.c b/drivers/accel/qaic/qaic_drv.c index 3575e0c984d6..4ddf89308ff5 100644 --- a/drivers/accel/qaic/qaic_drv.c +++ b/drivers/accel/qaic/qaic_drv.c @@ -32,7 +32,7 @@  #include "qaic_timesync.h"  #include "sahara.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  #define PCI_DEV_AIC080			0xa080  #define PCI_DEV_AIC100			0xa100 diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index d65cd08ba8e1..d81b55f5068c 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig @@ -135,10 +135,10 @@ config ACPI_REV_OVERRIDE_POSSIBLE  config ACPI_EC  	bool "Embedded Controller"  	depends on HAS_IOPORT -	default X86 +	default X86 || LOONGARCH  	help  	  This driver handles communication with the microcontroller -	  on many x86 laptops and other machines. +	  on many x86/LoongArch laptops and other machines.  config ACPI_EC_DEBUGFS  	tristate "EC read/write access through /sys/kernel/debug/ec" diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c index 8274a17872ed..a972831dbd66 100644 --- a/drivers/acpi/acpi_video.c +++ b/drivers/acpi/acpi_video.c @@ -610,16 +610,28 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,  	return 0;  } +/** + * acpi_video_device_EDID() - Get EDID from ACPI _DDC + * @device: video output device (LCD, CRT, ..) + * @edid: address for returned EDID pointer + * @length: _DDC length to request (must be a multiple of 128) + * + * Get EDID from ACPI _DDC. On success, a pointer to the EDID data is written + * to the @edid address, and the length of the EDID is returned. The caller is + * responsible for freeing the edid pointer. + * + * Return the length of EDID (positive value) on success or error (negative + * value). + */  static int -acpi_video_device_EDID(struct acpi_video_device *device, -		       union acpi_object **edid, int length) +acpi_video_device_EDID(struct acpi_video_device *device, void **edid, int length)  { -	int status; +	acpi_status status;  	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };  	union acpi_object *obj;  	union acpi_object arg0 = { ACPI_TYPE_INTEGER };  	struct acpi_object_list args = { 1, &arg0 }; - +	int ret;  	*edid = NULL; @@ -636,16 +648,17 @@ acpi_video_device_EDID(struct acpi_video_device *device,  	obj = buffer.pointer; -	if (obj && obj->type == ACPI_TYPE_BUFFER) -		*edid = obj; -	else { +	if (obj && obj->type == ACPI_TYPE_BUFFER) { +		*edid = kmemdup(obj->buffer.pointer, obj->buffer.length, GFP_KERNEL); +		ret = *edid ? obj->buffer.length : -ENOMEM; +	} else {  		acpi_handle_debug(device->dev->handle,  				 "Invalid _DDC data for length %d\n", length); -		status = -EFAULT; -		kfree(obj); +		ret = -EFAULT;  	} -	return status; +	kfree(obj); +	return ret;  }  /* bus */ @@ -1435,9 +1448,7 @@ int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,  {  	struct acpi_video_bus *video;  	struct acpi_video_device *video_device; -	union acpi_object *buffer = NULL; -	acpi_status status; -	int i, length; +	int i, length, ret;  	if (!device || !acpi_driver_data(device))  		return -EINVAL; @@ -1477,16 +1488,10 @@ int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,  		}  		for (length = 512; length > 0; length -= 128) { -			status = acpi_video_device_EDID(video_device, &buffer, -							length); -			if (ACPI_SUCCESS(status)) -				break; +			ret = acpi_video_device_EDID(video_device, edid, length); +			if (ret > 0) +				return ret;  		} -		if (!length) -			continue; - -		*edid = buffer->buffer.pointer; -		return length;  	}  	return -ENODEV; diff --git a/drivers/acpi/acpica/evxfregn.c b/drivers/acpi/acpica/evxfregn.c index 95f78383bbdb..bff2d099f469 100644 --- a/drivers/acpi/acpica/evxfregn.c +++ b/drivers/acpi/acpica/evxfregn.c @@ -232,8 +232,6 @@ acpi_remove_address_space_handler(acpi_handle device,  			/* Now we can delete the handler object */ -			acpi_os_release_mutex(handler_obj->address_space. -					      context_mutex);  			acpi_ut_remove_reference(handler_obj);  			goto unlock_and_exit;  		} diff --git a/drivers/acpi/apei/einj-cxl.c b/drivers/acpi/apei/einj-cxl.c index a4e709937236..78da9ae543a2 100644 --- a/drivers/acpi/apei/einj-cxl.c +++ b/drivers/acpi/apei/einj-cxl.c @@ -45,7 +45,7 @@ int einj_cxl_available_error_type_show(struct seq_file *m, void *v)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(einj_cxl_available_error_type_show, CXL); +EXPORT_SYMBOL_NS_GPL(einj_cxl_available_error_type_show, "CXL");  static int cxl_dport_get_sbdf(struct pci_dev *dport_dev, u64 *sbdf)  { @@ -83,7 +83,7 @@ int einj_cxl_inject_rch_error(u64 rcrb, u64 type)  	return einj_cxl_rch_error_inject(type, 0x2, rcrb, GENMASK_ULL(63, 0),  					 0, 0);  } -EXPORT_SYMBOL_NS_GPL(einj_cxl_inject_rch_error, CXL); +EXPORT_SYMBOL_NS_GPL(einj_cxl_inject_rch_error, "CXL");  int einj_cxl_inject_error(struct pci_dev *dport, u64 type)  { @@ -104,10 +104,10 @@ int einj_cxl_inject_error(struct pci_dev *dport, u64 type)  	return einj_error_inject(type, 0x4, 0, 0, 0, param4);  } -EXPORT_SYMBOL_NS_GPL(einj_cxl_inject_error, CXL); +EXPORT_SYMBOL_NS_GPL(einj_cxl_inject_error, "CXL");  bool einj_cxl_is_initialized(void)  {  	return einj_initialized;  } -EXPORT_SYMBOL_NS_GPL(einj_cxl_is_initialized, CXL); +EXPORT_SYMBOL_NS_GPL(einj_cxl_is_initialized, "CXL"); diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index a2491905f165..07789f0b59bc 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -726,7 +726,7 @@ int cxl_cper_register_work(struct work_struct *work)  	cxl_cper_work = work;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_cper_register_work, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_cper_register_work, "CXL");  int cxl_cper_unregister_work(struct work_struct *work)  { @@ -737,13 +737,13 @@ int cxl_cper_unregister_work(struct work_struct *work)  	cxl_cper_work = NULL;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_work, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_work, "CXL");  int cxl_cper_kfifo_get(struct cxl_cper_work_data *wd)  {  	return kfifo_get(&cxl_cper_fifo, wd);  } -EXPORT_SYMBOL_NS_GPL(cxl_cper_kfifo_get, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_cper_kfifo_get, "CXL");  static bool ghes_do_proc(struct ghes *ghes,  			 const struct acpi_hest_generic_status *estatus) diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c index 1f7e4c691d9e..98759d6199d3 100644 --- a/drivers/acpi/arm64/iort.c +++ b/drivers/acpi/arm64/iort.c @@ -1716,6 +1716,8 @@ static struct acpi_platform_list pmcg_plat_info[] __initdata = {  	/* HiSilicon Hip09 Platform */  	{"HISI  ", "HIP09   ", 0, ACPI_SIG_IORT, greater_than_or_equal,  	 "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, +	{"HISI  ", "HIP09A  ", 0, ACPI_SIG_IORT, greater_than_or_equal, +	 "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09},  	/* HiSilicon Hip10/11 Platform uses the same SMMU IP with Hip09 */  	{"HISI  ", "HIP10   ", 0, ACPI_SIG_IORT, greater_than_or_equal,  	 "Erratum #162001900", IORT_SMMU_V3_PMCG_HISI_HIP09}, diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index 5429ec9ef06f..a5d47819b3a4 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -454,8 +454,13 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,  	if (cmd_rc)  		*cmd_rc = -EINVAL; -	if (cmd == ND_CMD_CALL) +	if (cmd == ND_CMD_CALL) { +		if (!buf || buf_len < sizeof(*call_pkg)) +			return -EINVAL; +  		call_pkg = buf; +	} +  	func = cmd_to_func(nfit_mem, cmd, call_pkg, &family);  	if (func < 0)  		return func; diff --git a/drivers/acpi/numa/hmat.c b/drivers/acpi/numa/hmat.c index 1a902a02390f..80a3481c0470 100644 --- a/drivers/acpi/numa/hmat.c +++ b/drivers/acpi/numa/hmat.c @@ -151,7 +151,7 @@ int acpi_get_genport_coordinates(u32 uid,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(acpi_get_genport_coordinates, CXL); +EXPORT_SYMBOL_NS_GPL(acpi_get_genport_coordinates, "CXL");  static __init void alloc_memory_initiator(unsigned int cpu_pxm)  { diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c index 7fe842dae1ec..90aaec923889 100644 --- a/drivers/acpi/resource.c +++ b/drivers/acpi/resource.c @@ -250,6 +250,9 @@ static bool acpi_decode_space(struct resource_win *win,  	switch (addr->resource_type) {  	case ACPI_MEMORY_RANGE:  		acpi_dev_memresource_flags(res, len, wp); + +		if (addr->info.mem.caching == ACPI_PREFETCHABLE_MEMORY) +			res->flags |= IORESOURCE_PREFETCH;  		break;  	case ACPI_IO_RANGE:  		acpi_dev_ioresource_flags(res, len, iodec, @@ -265,9 +268,6 @@ static bool acpi_decode_space(struct resource_win *win,  	if (addr->producer_consumer == ACPI_PRODUCER)  		res->flags |= IORESOURCE_WINDOW; -	if (addr->info.mem.caching == ACPI_PREFETCHABLE_MEMORY) -		res->flags |= IORESOURCE_PREFETCH; -  	return !(res->flags & IORESOURCE_DISABLED);  } @@ -441,6 +441,13 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {  		},  	},  	{ +		/* Asus Vivobook X1504VAP */ +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), +			DMI_MATCH(DMI_BOARD_NAME, "X1504VAP"), +		}, +	}, +	{  		/* Asus Vivobook X1704VAP */  		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), @@ -646,6 +653,17 @@ static const struct dmi_system_id irq1_edge_low_force_override[] = {  			DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),  		},  	}, +	{ +		/* +		 * TongFang GM5HG0A in case of the SKIKK Vanaheim relabel the +		 * board-name is changed, so check OEM strings instead. Note +		 * OEM string matches are always exact matches. +		 * https://bugzilla.kernel.org/show_bug.cgi?id=219614 +		 */ +		.matches = { +			DMI_EXACT_MATCH(DMI_OEM_STRING, "GM5HG0A"), +		}, +	},  	{ }  }; @@ -671,11 +689,11 @@ static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,  	for (i = 0; i < ARRAY_SIZE(override_table); i++) {  		const struct irq_override_cmp *entry = &override_table[i]; -		if (dmi_check_system(entry->system) && -		    entry->irq == gsi && +		if (entry->irq == gsi &&  		    entry->triggering == triggering &&  		    entry->polarity == polarity && -		    entry->shareable == shareable) +		    entry->shareable == shareable && +		    dmi_check_system(entry->system))  			return entry->override;  	} diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 6671537cb4b7..95982c098d5b 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c @@ -1082,7 +1082,7 @@ static void __exit acpi_thermal_exit(void)  module_init(acpi_thermal_init);  module_exit(acpi_thermal_exit); -MODULE_IMPORT_NS(ACPI_THERMAL); +MODULE_IMPORT_NS("ACPI_THERMAL");  MODULE_AUTHOR("Paul Diefenbaugh");  MODULE_DESCRIPTION("ACPI Thermal Zone Driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/acpi/thermal_lib.c b/drivers/acpi/thermal_lib.c index 6214d6ebe1fa..f81591927e86 100644 --- a/drivers/acpi/thermal_lib.c +++ b/drivers/acpi/thermal_lib.c @@ -53,25 +53,25 @@ int acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)  	return acpi_trip_temp(adev, obj_name, ret_temp);  } -EXPORT_SYMBOL_NS_GPL(acpi_active_trip_temp, ACPI_THERMAL); +EXPORT_SYMBOL_NS_GPL(acpi_active_trip_temp, "ACPI_THERMAL");  int acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)  {  	return acpi_trip_temp(adev, "_PSV", ret_temp);  } -EXPORT_SYMBOL_NS_GPL(acpi_passive_trip_temp, ACPI_THERMAL); +EXPORT_SYMBOL_NS_GPL(acpi_passive_trip_temp, "ACPI_THERMAL");  int acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)  {  	return acpi_trip_temp(adev, "_HOT", ret_temp);  } -EXPORT_SYMBOL_NS_GPL(acpi_hot_trip_temp, ACPI_THERMAL); +EXPORT_SYMBOL_NS_GPL(acpi_hot_trip_temp, "ACPI_THERMAL");  int acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)  {  	return acpi_trip_temp(adev, "_CRT", ret_temp);  } -EXPORT_SYMBOL_NS_GPL(acpi_critical_trip_temp, ACPI_THERMAL); +EXPORT_SYMBOL_NS_GPL(acpi_critical_trip_temp, "ACPI_THERMAL");  static int thermal_temp(int error, int temp_decik, int *ret_temp)  { diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c index b1b40e9551de..c8c817c51230 100644 --- a/drivers/ata/sata_highbank.c +++ b/drivers/ata/sata_highbank.c @@ -348,6 +348,7 @@ static int highbank_initialize_phys(struct device *dev, void __iomem *addr)  			phy_nodes[phy] = phy_data.np;  			cphy_base[phy] = of_iomap(phy_nodes[phy], 0);  			if (cphy_base[phy] == NULL) { +				of_node_put(phy_data.np);  				return 0;  			}  			phy_count += 1; diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c index cb00f8244e41..4fea1149e003 100644 --- a/drivers/atm/fore200e.c +++ b/drivers/atm/fore200e.c @@ -2569,7 +2569,7 @@ static struct platform_driver fore200e_sba_driver = {  		.of_match_table = fore200e_sba_match,  	},  	.probe		= fore200e_sba_probe, -	.remove_new	= fore200e_sba_remove, +	.remove		= fore200e_sba_remove,  };  #endif diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 21545ffba065..8934e6ad5772 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig @@ -489,7 +489,7 @@ config IMG_ASCII_LCD  config HT16K33  	tristate "Holtek Ht16K33 LED controller with keyscan" -	depends on FB && I2C && INPUT +	depends on FB && I2C && INPUT && BACKLIGHT_CLASS_DEVICE  	select FB_SYSMEM_HELPERS  	select INPUT_MATRIXKMAP  	select FB_BACKLIGHT diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c index 2b74dabe7e17..24baf6b2c587 100644 --- a/drivers/auxdisplay/cfag12864bfb.c +++ b/drivers/auxdisplay/cfag12864bfb.c @@ -108,7 +108,7 @@ static void cfag12864bfb_remove(struct platform_device *device)  static struct platform_driver cfag12864bfb_driver = {  	.probe	= cfag12864bfb_probe, -	.remove_new = cfag12864bfb_remove, +	.remove = cfag12864bfb_remove,  	.driver = {  		.name	= CFAG12864BFB_NAME,  	}, diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c index 025dc6855cb2..0526f0d90a79 100644 --- a/drivers/auxdisplay/hd44780.c +++ b/drivers/auxdisplay/hd44780.c @@ -339,7 +339,7 @@ MODULE_DEVICE_TABLE(of, hd44780_of_match);  static struct platform_driver hd44780_driver = {  	.probe = hd44780_probe, -	.remove_new = hd44780_remove, +	.remove = hd44780_remove,  	.driver		= {  		.name	= "hd44780",  		.of_match_table = hd44780_of_match, diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c index 09deb864b27a..0b8ba754b343 100644 --- a/drivers/auxdisplay/ht16k33.c +++ b/drivers/auxdisplay/ht16k33.c @@ -780,5 +780,5 @@ module_i2c_driver(ht16k33_driver);  MODULE_DESCRIPTION("Holtek HT16K33 driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LINEDISP); +MODULE_IMPORT_NS("LINEDISP");  MODULE_AUTHOR("Robin van der Gracht <robin@protonic.nl>"); diff --git a/drivers/auxdisplay/img-ascii-lcd.c b/drivers/auxdisplay/img-ascii-lcd.c index 9ba132dc6143..a802678a6f74 100644 --- a/drivers/auxdisplay/img-ascii-lcd.c +++ b/drivers/auxdisplay/img-ascii-lcd.c @@ -291,11 +291,11 @@ static struct platform_driver img_ascii_lcd_driver = {  		.of_match_table	= img_ascii_lcd_matches,  	},  	.probe	= img_ascii_lcd_probe, -	.remove_new = img_ascii_lcd_remove, +	.remove = img_ascii_lcd_remove,  };  module_platform_driver(img_ascii_lcd_driver);  MODULE_DESCRIPTION("Imagination Technologies ASCII LCD Display");  MODULE_AUTHOR("Paul Burton <paul.burton@mips.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LINEDISP); +MODULE_IMPORT_NS("LINEDISP"); diff --git a/drivers/auxdisplay/line-display.c b/drivers/auxdisplay/line-display.c index 731ffdfafc4e..fcec77f100ce 100644 --- a/drivers/auxdisplay/line-display.c +++ b/drivers/auxdisplay/line-display.c @@ -381,7 +381,7 @@ out_put_device:  	put_device(&linedisp->dev);  	return err;  } -EXPORT_SYMBOL_NS_GPL(linedisp_register, LINEDISP); +EXPORT_SYMBOL_NS_GPL(linedisp_register, "LINEDISP");  /**   * linedisp_unregister - unregister a character line display @@ -394,7 +394,7 @@ void linedisp_unregister(struct linedisp *linedisp)  	del_timer_sync(&linedisp->timer);  	put_device(&linedisp->dev);  } -EXPORT_SYMBOL_NS_GPL(linedisp_unregister, LINEDISP); +EXPORT_SYMBOL_NS_GPL(linedisp_unregister, "LINEDISP");  MODULE_DESCRIPTION("Character line display core support");  MODULE_LICENSE("GPL"); diff --git a/drivers/auxdisplay/max6959.c b/drivers/auxdisplay/max6959.c index 5519c014bd29..962488197b9e 100644 --- a/drivers/auxdisplay/max6959.c +++ b/drivers/auxdisplay/max6959.c @@ -191,4 +191,4 @@ module_i2c_driver(max6959_i2c_driver);  MODULE_DESCRIPTION("MAX6958/6959 7-segment LED controller");  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LINEDISP); +MODULE_IMPORT_NS("LINEDISP"); diff --git a/drivers/auxdisplay/seg-led-gpio.c b/drivers/auxdisplay/seg-led-gpio.c index 183ab3011cbb..f10c25e6bf12 100644 --- a/drivers/auxdisplay/seg-led-gpio.c +++ b/drivers/auxdisplay/seg-led-gpio.c @@ -97,7 +97,7 @@ MODULE_DEVICE_TABLE(of, seg_led_of_match);  static struct platform_driver seg_led_driver = {  	.probe = seg_led_probe, -	.remove_new = seg_led_remove, +	.remove = seg_led_remove,  	.driver = {  		.name = "seg-led-gpio",  		.of_match_table = seg_led_of_match, @@ -108,4 +108,4 @@ module_platform_driver(seg_led_driver);  MODULE_AUTHOR("Chris Packham <chris.packham@alliedtelesis.co.nz>");  MODULE_DESCRIPTION("7 segment LED driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LINEDISP); +MODULE_IMPORT_NS("LINEDISP"); diff --git a/drivers/base/arch_numa.c b/drivers/base/arch_numa.c index e18701676426..c99f2ab105e5 100644 --- a/drivers/base/arch_numa.c +++ b/drivers/base/arch_numa.c @@ -208,6 +208,10 @@ static int __init numa_register_nodes(void)  {  	int nid; +	/* Check the validity of the memblock/node mapping */ +	if (!memblock_validate_numa_coverage(0)) +		return -EINVAL; +  	/* Finally register nodes. */  	for_each_node_mask(nid, numa_nodes_parsed) {  		unsigned long start_pfn, end_pfn; diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index 609935ad5091..cf0d455209d7 100644 --- a/drivers/base/cacheinfo.c +++ b/drivers/base/cacheinfo.c @@ -58,7 +58,7 @@ bool last_level_cache_is_valid(unsigned int cpu)  {  	struct cacheinfo *llc; -	if (!cache_leaves(cpu)) +	if (!cache_leaves(cpu) || !per_cpu_cacheinfo(cpu))  		return false;  	llc = per_cpu_cacheinfo_idx(cpu, cache_leaves(cpu) - 1); @@ -458,11 +458,9 @@ int __weak populate_cache_leaves(unsigned int cpu)  	return -ENOENT;  } -static inline -int allocate_cache_info(int cpu) +static inline int allocate_cache_info(int cpu)  { -	per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu), -					 sizeof(struct cacheinfo), GFP_ATOMIC); +	per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu), sizeof(struct cacheinfo), GFP_ATOMIC);  	if (!per_cpu_cacheinfo(cpu)) {  		cache_leaves(cpu) = 0;  		return -ENOMEM; @@ -534,7 +532,11 @@ static inline int init_level_allocate_ci(unsigned int cpu)  	 */  	ci_cacheinfo(cpu)->early_ci_levels = false; -	if (cache_leaves(cpu) <= early_leaves) +	/* +	 * Some architectures (e.g., x86) do not use early initialization. +	 * Allocate memory now in such case. +	 */ +	if (cache_leaves(cpu) <= early_leaves && per_cpu_cacheinfo(cpu))  		return 0;  	kfree(per_cpu_cacheinfo(cpu)); diff --git a/drivers/base/firmware_loader/builtin/main.c b/drivers/base/firmware_loader/builtin/main.c index a065c3150897..d36befebb1b9 100644 --- a/drivers/base/firmware_loader/builtin/main.c +++ b/drivers/base/firmware_loader/builtin/main.c @@ -61,7 +61,7 @@ bool firmware_request_builtin(struct firmware *fw, const char *name)  	return false;  } -EXPORT_SYMBOL_NS_GPL(firmware_request_builtin, TEST_FIRMWARE); +EXPORT_SYMBOL_NS_GPL(firmware_request_builtin, "TEST_FIRMWARE");  /**   * firmware_request_builtin_buf() - load builtin firmware into optional buffer diff --git a/drivers/base/firmware_loader/fallback_table.c b/drivers/base/firmware_loader/fallback_table.c index 8432ab2c3b3c..ddb70e29eb42 100644 --- a/drivers/base/firmware_loader/fallback_table.c +++ b/drivers/base/firmware_loader/fallback_table.c @@ -22,7 +22,7 @@ struct firmware_fallback_config fw_fallback_config = {  	.loading_timeout = 60,  	.old_timeout = 60,  }; -EXPORT_SYMBOL_NS_GPL(fw_fallback_config, FIRMWARE_LOADER_PRIVATE); +EXPORT_SYMBOL_NS_GPL(fw_fallback_config, "FIRMWARE_LOADER_PRIVATE");  #ifdef CONFIG_SYSCTL  static struct ctl_table firmware_config_table[] = { @@ -56,13 +56,13 @@ int register_firmware_config_sysctl(void)  		return -ENOMEM;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(register_firmware_config_sysctl, FIRMWARE_LOADER_PRIVATE); +EXPORT_SYMBOL_NS_GPL(register_firmware_config_sysctl, "FIRMWARE_LOADER_PRIVATE");  void unregister_firmware_config_sysctl(void)  {  	unregister_sysctl_table(firmware_config_sysct_table_header);  	firmware_config_sysct_table_header = NULL;  } -EXPORT_SYMBOL_NS_GPL(unregister_firmware_config_sysctl, FIRMWARE_LOADER_PRIVATE); +EXPORT_SYMBOL_NS_GPL(unregister_firmware_config_sysctl, "FIRMWARE_LOADER_PRIVATE");  #endif /* CONFIG_SYSCTL */ diff --git a/drivers/base/firmware_loader/sysfs.h b/drivers/base/firmware_loader/sysfs.h index 2060add8ef81..1cabea544a40 100644 --- a/drivers/base/firmware_loader/sysfs.h +++ b/drivers/base/firmware_loader/sysfs.h @@ -6,7 +6,7 @@  #include "firmware.h" -MODULE_IMPORT_NS(FIRMWARE_LOADER_PRIVATE); +MODULE_IMPORT_NS("FIRMWARE_LOADER_PRIVATE");  extern struct firmware_fallback_config fw_fallback_config;  extern struct device_attribute dev_attr_loading; diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 53131a7ede0a..5962ea1230a1 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -598,6 +598,17 @@ int regmap_attach_dev(struct device *dev, struct regmap *map,  }  EXPORT_SYMBOL_GPL(regmap_attach_dev); +static int dev_get_regmap_match(struct device *dev, void *res, void *data); + +static int regmap_detach_dev(struct device *dev, struct regmap *map) +{ +	if (!dev) +		return 0; + +	return devres_release(dev, dev_get_regmap_release, +			      dev_get_regmap_match, (void *)map->name); +} +  static enum regmap_endian regmap_get_reg_endian(const struct regmap_bus *bus,  					const struct regmap_config *config)  { @@ -1052,13 +1063,13 @@ skip_format_initialization:  		/* Sanity check */  		if (range_cfg->range_max < range_cfg->range_min) { -			dev_err(map->dev, "Invalid range %d: %d < %d\n", i, +			dev_err(map->dev, "Invalid range %d: %u < %u\n", i,  				range_cfg->range_max, range_cfg->range_min);  			goto err_range;  		}  		if (range_cfg->range_max > map->max_register) { -			dev_err(map->dev, "Invalid range %d: %d > %d\n", i, +			dev_err(map->dev, "Invalid range %d: %u > %u\n", i,  				range_cfg->range_max, map->max_register);  			goto err_range;  		} @@ -1445,6 +1456,7 @@ void regmap_exit(struct regmap *map)  {  	struct regmap_async *async; +	regmap_detach_dev(map->dev, map);  	regcache_exit(map);  	regmap_debugfs_exit(map); diff --git a/drivers/base/topology.c b/drivers/base/topology.c index cf160dd2c27b..b962da263eee 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c @@ -27,9 +27,17 @@ static ssize_t name##_read(struct file *file, struct kobject *kobj,		\  			   loff_t off, size_t count)				\  {										\  	struct device *dev = kobj_to_dev(kobj);                                 \ +	cpumask_var_t mask;							\ +	ssize_t n;								\  										\ -	return cpumap_print_bitmask_to_buf(buf, topology_##mask(dev->id),	\ -					   off, count);                         \ +	if (!alloc_cpumask_var(&mask, GFP_KERNEL))				\ +		return -ENOMEM;							\ +										\ +	cpumask_copy(mask, topology_##mask(dev->id));				\ +	n = cpumap_print_bitmask_to_buf(buf, mask, off, count);			\ +	free_cpumask_var(mask);							\ +										\ +	return n;								\  }										\  										\  static ssize_t name##_list_read(struct file *file, struct kobject *kobj,	\ @@ -37,9 +45,17 @@ static ssize_t name##_list_read(struct file *file, struct kobject *kobj,	\  				loff_t off, size_t count)			\  {										\  	struct device *dev = kobj_to_dev(kobj);					\ +	cpumask_var_t mask;							\ +	ssize_t n;								\ +										\ +	if (!alloc_cpumask_var(&mask, GFP_KERNEL))				\ +		return -ENOMEM;							\ +										\ +	cpumask_copy(mask, topology_##mask(dev->id));				\ +	n = cpumap_print_list_to_buf(buf, mask, off, count);			\ +	free_cpumask_var(mask);							\  										\ -	return cpumap_print_list_to_buf(buf, topology_##mask(dev->id),		\ -					off, count);				\ +	return n;								\  }  define_id_show_func(physical_package_id, "%d"); diff --git a/drivers/bcma/host_soc.c b/drivers/bcma/host_soc.c index 8ae0b918e740..20b1816c570b 100644 --- a/drivers/bcma/host_soc.c +++ b/drivers/bcma/host_soc.c @@ -261,7 +261,7 @@ static struct platform_driver bcma_host_soc_driver = {  		.of_match_table = bcma_host_soc_of_match,  	},  	.probe		= bcma_host_soc_probe, -	.remove_new	= bcma_host_soc_remove, +	.remove		= bcma_host_soc_remove,  };  int __init bcma_host_soc_register_driver(void) diff --git a/drivers/block/rnull.rs b/drivers/block/rnull.rs index 5de7223beb4d..9cca05dcf772 100644 --- a/drivers/block/rnull.rs +++ b/drivers/block/rnull.rs @@ -28,6 +28,7 @@ module! {      type: NullBlkModule,      name: "rnull_mod",      author: "Andreas Hindborg", +    description: "Rust implementation of the C null block driver",      license: "GPL v2",  } diff --git a/drivers/block/swim.c b/drivers/block/swim.c index 126f151c4f2c..be4ac58afe41 100644 --- a/drivers/block/swim.c +++ b/drivers/block/swim.c @@ -944,7 +944,7 @@ static void swim_remove(struct platform_device *dev)  static struct platform_driver swim_driver = {  	.probe  = swim_probe, -	.remove_new = swim_remove, +	.remove = swim_remove,  	.driver   = {  		.name	= CARDNAME,  	}, diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c index d4aed12dd436..934ab9332c80 100644 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@ -1618,6 +1618,21 @@ static void ublk_unquiesce_dev(struct ublk_device *ub)  	blk_mq_kick_requeue_list(ub->ub_disk->queue);  } +static struct gendisk *ublk_detach_disk(struct ublk_device *ub) +{ +	struct gendisk *disk; + +	/* Sync with ublk_abort_queue() by holding the lock */ +	spin_lock(&ub->lock); +	disk = ub->ub_disk; +	ub->dev_info.state = UBLK_S_DEV_DEAD; +	ub->dev_info.ublksrv_pid = -1; +	ub->ub_disk = NULL; +	spin_unlock(&ub->lock); + +	return disk; +} +  static void ublk_stop_dev(struct ublk_device *ub)  {  	struct gendisk *disk; @@ -1631,14 +1646,7 @@ static void ublk_stop_dev(struct ublk_device *ub)  		ublk_unquiesce_dev(ub);  	}  	del_gendisk(ub->ub_disk); - -	/* Sync with ublk_abort_queue() by holding the lock */ -	spin_lock(&ub->lock); -	disk = ub->ub_disk; -	ub->dev_info.state = UBLK_S_DEV_DEAD; -	ub->dev_info.ublksrv_pid = -1; -	ub->ub_disk = NULL; -	spin_unlock(&ub->lock); +	disk = ublk_detach_disk(ub);  	put_disk(disk);   unlock:  	mutex_unlock(&ub->mutex); @@ -2336,7 +2344,7 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd)  out_put_cdev:  	if (ret) { -		ub->dev_info.state = UBLK_S_DEV_DEAD; +		ublk_detach_disk(ub);  		ublk_put_device(ub);  	}  	if (ret) diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index c0cdba71f436..3efe378f1386 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -1586,9 +1586,12 @@ static void virtblk_remove(struct virtio_device *vdev)  static int virtblk_freeze(struct virtio_device *vdev)  {  	struct virtio_blk *vblk = vdev->priv; +	struct request_queue *q = vblk->disk->queue;  	/* Ensure no requests in virtqueues before deleting vqs. */ -	blk_mq_freeze_queue(vblk->disk->queue); +	blk_mq_freeze_queue(q); +	blk_mq_quiesce_queue_nowait(q); +	blk_mq_unfreeze_queue(q);  	/* Ensure we don't receive any more interrupts */  	virtio_reset_device(vdev); @@ -1612,8 +1615,8 @@ static int virtblk_restore(struct virtio_device *vdev)  		return ret;  	virtio_device_ready(vdev); +	blk_mq_unquiesce_queue(vblk->disk->queue); -	blk_mq_unfreeze_queue(vblk->disk->queue);  	return 0;  }  #endif diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 3dee026988dc..7903a4da40ac 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -614,6 +614,12 @@ static ssize_t backing_dev_store(struct device *dev,  	}  	nr_pages = i_size_read(inode) >> PAGE_SHIFT; +	/* Refuse to use zero sized device (also prevents self reference) */ +	if (!nr_pages) { +		err = -EINVAL; +		goto out; +	} +  	bitmap_sz = BITS_TO_LONGS(nr_pages) * sizeof(long);  	bitmap = kvzalloc(bitmap_sz, GFP_KERNEL);  	if (!bitmap) { @@ -1438,12 +1444,16 @@ static void zram_meta_free(struct zram *zram, u64 disksize)  	size_t num_pages = disksize >> PAGE_SHIFT;  	size_t index; +	if (!zram->table) +		return; +  	/* Free all pages that are still in this zram device */  	for (index = 0; index < num_pages; index++)  		zram_free_page(zram, index);  	zs_destroy_pool(zram->mem_pool);  	vfree(zram->table); +	zram->table = NULL;  }  static bool zram_meta_alloc(struct zram *zram, u64 disksize) @@ -1458,6 +1468,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize)  	zram->mem_pool = zs_create_pool(zram->disk->disk_name);  	if (!zram->mem_pool) {  		vfree(zram->table); +		zram->table = NULL;  		return false;  	} @@ -2320,11 +2331,6 @@ static void zram_reset_device(struct zram *zram)  	zram->limit_pages = 0; -	if (!init_done(zram)) { -		up_write(&zram->init_lock); -		return; -	} -  	set_capacity_and_notify(zram->disk, 0);  	part_stat_set_all(zram->disk->part0, 0); diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c index 8a3f7c3fcfec..224eafc27dbe 100644 --- a/drivers/bluetooth/btmtk.c +++ b/drivers/bluetooth/btmtk.c @@ -395,6 +395,7 @@ int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)  {  	struct btmtk_data *data = hci_get_priv(hdev);  	int err; +	bool complete = false;  	if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) {  		kfree_skb(skb); @@ -416,19 +417,22 @@ int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)  		fallthrough;  	case HCI_DEVCOREDUMP_ACTIVE:  	default: +		/* Mediatek coredump data would be more than MTK_COREDUMP_NUM */ +		if (data->cd_info.cnt >= MTK_COREDUMP_NUM && +		    skb->len > MTK_COREDUMP_END_LEN) +			if (!memcmp((char *)&skb->data[skb->len - MTK_COREDUMP_END_LEN], +				    MTK_COREDUMP_END, MTK_COREDUMP_END_LEN - 1)) +				complete = true; +  		err = hci_devcd_append(hdev, skb);  		if (err < 0)  			break;  		data->cd_info.cnt++; -		/* Mediatek coredump data would be more than MTK_COREDUMP_NUM */ -		if (data->cd_info.cnt > MTK_COREDUMP_NUM && -		    skb->len > MTK_COREDUMP_END_LEN) -			if (!memcmp((char *)&skb->data[skb->len - MTK_COREDUMP_END_LEN], -				    MTK_COREDUMP_END, MTK_COREDUMP_END_LEN - 1)) { -				bt_dev_info(hdev, "Mediatek coredump end"); -				hci_devcd_complete(hdev); -			} +		if (complete) { +			bt_dev_info(hdev, "Mediatek coredump end"); +			hci_devcd_complete(hdev); +		}  		break;  	} @@ -1468,10 +1472,15 @@ EXPORT_SYMBOL_GPL(btmtk_usb_setup);  int btmtk_usb_shutdown(struct hci_dev *hdev)  { +	struct btmtk_data *data = hci_get_priv(hdev);  	struct btmtk_hci_wmt_params wmt_params;  	u8 param = 0;  	int err; +	err = usb_autopm_get_interface(data->intf); +	if (err < 0) +		return err; +  	/* Disable the device */  	wmt_params.op = BTMTK_WMT_FUNC_CTRL;  	wmt_params.flag = 0; @@ -1482,9 +1491,11 @@ int btmtk_usb_shutdown(struct hci_dev *hdev)  	err = btmtk_usb_hci_wmt_sync(hdev, &wmt_params);  	if (err < 0) {  		bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); +		usb_autopm_put_interface(data->intf);  		return err;  	} +	usb_autopm_put_interface(data->intf);  	return 0;  }  EXPORT_SYMBOL_GPL(btmtk_usb_shutdown); diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c index 569f5b7d6e46..1230045d78a5 100644 --- a/drivers/bluetooth/btnxpuart.c +++ b/drivers/bluetooth/btnxpuart.c @@ -1381,6 +1381,7 @@ static void btnxpuart_tx_work(struct work_struct *work)  	while ((skb = nxp_dequeue(nxpdev))) {  		len = serdev_device_write_buf(serdev, skb->data, skb->len); +		serdev_device_wait_until_sent(serdev, 0);  		hdev->stat.byte_tx += len;  		skb_pull(skb, len); diff --git a/drivers/bluetooth/btqcomsmd.c b/drivers/bluetooth/btqcomsmd.c index 88dbb2f3fabf..c0eb71d6ffd3 100644 --- a/drivers/bluetooth/btqcomsmd.c +++ b/drivers/bluetooth/btqcomsmd.c @@ -216,7 +216,7 @@ MODULE_DEVICE_TABLE(of, btqcomsmd_of_match);  static struct platform_driver btqcomsmd_driver = {  	.probe = btqcomsmd_probe, -	.remove_new = btqcomsmd_remove, +	.remove = btqcomsmd_remove,  	.driver  = {  		.name  = "btqcomsmd",  		.of_match_table = btqcomsmd_of_match, diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c index 521b785f2908..9684eb16059b 100644 --- a/drivers/bluetooth/hci_bcm.c +++ b/drivers/bluetooth/hci_bcm.c @@ -1498,7 +1498,7 @@ static const struct dev_pm_ops bcm_pm_ops = {  static struct platform_driver bcm_driver = {  	.probe = bcm_probe, -	.remove_new = bcm_remove, +	.remove = bcm_remove,  	.driver = {  		.name = "hci_bcm",  		.acpi_match_table = ACPI_PTR(bcm_acpi_match), diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c index 999ccd5bb4f2..811f33701f84 100644 --- a/drivers/bluetooth/hci_intel.c +++ b/drivers/bluetooth/hci_intel.c @@ -1206,7 +1206,7 @@ static void intel_remove(struct platform_device *pdev)  static struct platform_driver intel_driver = {  	.probe = intel_probe, -	.remove_new = intel_remove, +	.remove = intel_remove,  	.driver = {  		.name = "hci_intel",  		.acpi_match_table = ACPI_PTR(intel_acpi_match), diff --git a/drivers/bus/mhi/host/pci_generic.c b/drivers/bus/mhi/host/pci_generic.c index 07645ce2119a..56ba4192c89c 100644 --- a/drivers/bus/mhi/host/pci_generic.c +++ b/drivers/bus/mhi/host/pci_generic.c @@ -917,7 +917,7 @@ static int mhi_pci_claim(struct mhi_controller *mhi_cntrl,  		return err;  	} -	mhi_cntrl->regs = pcim_iomap_region(pdev, 1 << bar_num, pci_name(pdev)); +	mhi_cntrl->regs = pcim_iomap_region(pdev, bar_num, pci_name(pdev));  	if (IS_ERR(mhi_cntrl->regs)) {  		err = PTR_ERR(mhi_cntrl->regs);  		dev_err(&pdev->dev, "failed to map pci region: %d\n", err); diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 6a99a459b80b..51745ed1bbab 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -1106,7 +1106,7 @@ int open_for_data(struct cdrom_device_info *cdi)  		}  	} -	cd_dbg(CD_OPEN, "all seems well, opening the devicen"); +	cd_dbg(CD_OPEN, "all seems well, opening the device\n");  	/* all seems well, we can open the device */  	ret = cdo->open(cdi, 0); /* open for data */ diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c index 71cfe7a85913..64b097e830d4 100644 --- a/drivers/cdrom/gdrom.c +++ b/drivers/cdrom/gdrom.c @@ -847,7 +847,7 @@ static void remove_gdrom(struct platform_device *devptr)  static struct platform_driver gdrom_driver = {  	.probe = probe_gdrom, -	.remove_new = remove_gdrom, +	.remove = remove_gdrom,  	.driver = {  			.name = GDROM_DEV_NAME,  	}, diff --git a/drivers/cdx/Makefile b/drivers/cdx/Makefile index 749a3295c2bd..3ca7068a3052 100644 --- a/drivers/cdx/Makefile +++ b/drivers/cdx/Makefile @@ -5,7 +5,7 @@  # Copyright (C) 2022-2023, Advanced Micro Devices, Inc.  # -ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=CDX_BUS +ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"CDX_BUS"'  obj-$(CONFIG_CDX_BUS) += cdx.o controller/ diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index 316bd89a95ca..76eac3653b1c 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -868,7 +868,7 @@ fail:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cdx_device_add, CDX_BUS_CONTROLLER); +EXPORT_SYMBOL_NS_GPL(cdx_device_add, "CDX_BUS_CONTROLLER");  struct device *cdx_bus_add(struct cdx_controller *cdx, u8 bus_num)  { @@ -915,7 +915,7 @@ device_add_fail:  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(cdx_bus_add, CDX_BUS_CONTROLLER); +EXPORT_SYMBOL_NS_GPL(cdx_bus_add, "CDX_BUS_CONTROLLER");  int cdx_register_controller(struct cdx_controller *cdx)  { @@ -940,7 +940,7 @@ int cdx_register_controller(struct cdx_controller *cdx)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cdx_register_controller, CDX_BUS_CONTROLLER); +EXPORT_SYMBOL_NS_GPL(cdx_register_controller, "CDX_BUS_CONTROLLER");  void cdx_unregister_controller(struct cdx_controller *cdx)  { @@ -955,7 +955,7 @@ void cdx_unregister_controller(struct cdx_controller *cdx)  	mutex_unlock(&cdx_controller_lock);  } -EXPORT_SYMBOL_NS_GPL(cdx_unregister_controller, CDX_BUS_CONTROLLER); +EXPORT_SYMBOL_NS_GPL(cdx_unregister_controller, "CDX_BUS_CONTROLLER");  static int __init cdx_bus_init(void)  { diff --git a/drivers/cdx/cdx_msi.c b/drivers/cdx/cdx_msi.c index e55f1716cfcb..06d723978232 100644 --- a/drivers/cdx/cdx_msi.c +++ b/drivers/cdx/cdx_msi.c @@ -189,4 +189,4 @@ struct irq_domain *cdx_msi_domain_init(struct device *dev)  	return cdx_msi_domain;  } -EXPORT_SYMBOL_NS_GPL(cdx_msi_domain_init, CDX_BUS_CONTROLLER); +EXPORT_SYMBOL_NS_GPL(cdx_msi_domain_init, "CDX_BUS_CONTROLLER"); diff --git a/drivers/cdx/controller/cdx_controller.c b/drivers/cdx/controller/cdx_controller.c index 201f9a6fbde7..d623f9c7517a 100644 --- a/drivers/cdx/controller/cdx_controller.c +++ b/drivers/cdx/controller/cdx_controller.c @@ -250,7 +250,7 @@ static struct platform_driver cdx_pdriver = {  		   .of_match_table = cdx_match_table,  		   },  	.probe = xlnx_cdx_probe, -	.remove_new = xlnx_cdx_remove, +	.remove = xlnx_cdx_remove,  };  static int __init cdx_controller_init(void) @@ -275,4 +275,4 @@ module_exit(cdx_controller_exit);  MODULE_AUTHOR("AMD Inc.");  MODULE_DESCRIPTION("CDX controller for AMD devices");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CDX_BUS_CONTROLLER); +MODULE_IMPORT_NS("CDX_BUS_CONTROLLER"); diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c index b8b9c07d3b5d..009e32033b17 100644 --- a/drivers/char/ipmi/bt-bmc.c +++ b/drivers/char/ipmi/bt-bmc.c @@ -481,7 +481,7 @@ static struct platform_driver bt_bmc_driver = {  		.of_match_table = bt_bmc_match,  	},  	.probe = bt_bmc_probe, -	.remove_new = bt_bmc_remove, +	.remove = bt_bmc_remove,  };  module_platform_driver(bt_bmc_driver); diff --git a/drivers/char/ipmi/ipmi_powernv.c b/drivers/char/ipmi/ipmi_powernv.c index c59a86eb58c7..4a2efafcd1f8 100644 --- a/drivers/char/ipmi/ipmi_powernv.c +++ b/drivers/char/ipmi/ipmi_powernv.c @@ -302,7 +302,7 @@ static struct platform_driver powernv_ipmi_driver = {  		.of_match_table	= ipmi_powernv_match,  	},  	.probe	= ipmi_powernv_probe, -	.remove_new = ipmi_powernv_remove, +	.remove = ipmi_powernv_remove,  }; diff --git a/drivers/char/ipmi/ipmi_si_platform.c b/drivers/char/ipmi/ipmi_si_platform.c index 96ba85648120..550cabd43ae6 100644 --- a/drivers/char/ipmi/ipmi_si_platform.c +++ b/drivers/char/ipmi/ipmi_si_platform.c @@ -445,7 +445,7 @@ struct platform_driver ipmi_platform_driver = {  		.acpi_match_table = ACPI_PTR(acpi_ipmi_match),  	},  	.probe		= ipmi_probe, -	.remove_new	= ipmi_remove, +	.remove		= ipmi_remove,  	.id_table       = si_plat_ids  }; diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index d04b391048fb..506d9988721e 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c @@ -2114,7 +2114,7 @@ static struct platform_driver ipmi_driver = {  		.name = DEVICE_NAME,  	},  	.probe		= ssif_platform_probe, -	.remove_new	= ssif_platform_remove, +	.remove		= ssif_platform_remove,  	.id_table       = ssif_plat_ids  }; diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c index 227bf06c7ca4..c03bc1ec593a 100644 --- a/drivers/char/ipmi/kcs_bmc_aspeed.c +++ b/drivers/char/ipmi/kcs_bmc_aspeed.c @@ -672,7 +672,7 @@ static struct platform_driver ast_kcs_bmc_driver = {  		.of_match_table = ast_kcs_bmc_match,  	},  	.probe  = aspeed_kcs_probe, -	.remove_new = aspeed_kcs_remove, +	.remove = aspeed_kcs_remove,  };  module_platform_driver(ast_kcs_bmc_driver); diff --git a/drivers/char/ipmi/kcs_bmc_npcm7xx.c b/drivers/char/ipmi/kcs_bmc_npcm7xx.c index 07710198233a..4808a61bf273 100644 --- a/drivers/char/ipmi/kcs_bmc_npcm7xx.c +++ b/drivers/char/ipmi/kcs_bmc_npcm7xx.c @@ -241,7 +241,7 @@ static struct platform_driver npcm_kcs_bmc_driver = {  		.of_match_table	= npcm_kcs_bmc_match,  	},  	.probe	= npcm7xx_kcs_probe, -	.remove_new = npcm7xx_kcs_remove, +	.remove = npcm7xx_kcs_remove,  };  module_platform_driver(npcm_kcs_bmc_driver); diff --git a/drivers/char/tpm/tpm_ftpm_tee.c b/drivers/char/tpm/tpm_ftpm_tee.c index 2ea4882251cf..139556b21cc6 100644 --- a/drivers/char/tpm/tpm_ftpm_tee.c +++ b/drivers/char/tpm/tpm_ftpm_tee.c @@ -366,7 +366,7 @@ static struct platform_driver ftpm_tee_plat_driver = {  	},  	.shutdown = ftpm_plat_tee_shutdown,  	.probe = ftpm_plat_tee_probe, -	.remove_new = ftpm_plat_tee_remove, +	.remove = ftpm_plat_tee_remove,  };  /* UUID of the fTPM TA */ diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 2f7326d297ad..9aa230a63616 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c @@ -356,7 +356,7 @@ MODULE_DEVICE_TABLE(of, tis_of_platform_match);  static struct platform_driver tis_drv = {  	.probe = tpm_tis_plat_probe, -	.remove_new = tpm_tis_plat_remove, +	.remove = tpm_tis_plat_remove,  	.driver = {  		.name		= "tpm_tis",  		.pm		= &tpm_tis_pm, diff --git a/drivers/char/tpm/tpm_tis_synquacer.c b/drivers/char/tpm/tpm_tis_synquacer.c index 0621ebec530b..4927714d277a 100644 --- a/drivers/char/tpm/tpm_tis_synquacer.c +++ b/drivers/char/tpm/tpm_tis_synquacer.c @@ -152,7 +152,7 @@ MODULE_DEVICE_TABLE(acpi, tpm_synquacer_acpi_tbl);  static struct platform_driver tis_synquacer_drv = {  	.probe = tpm_tis_synquacer_probe, -	.remove_new = tpm_tis_synquacer_remove, +	.remove = tpm_tis_synquacer_remove,  	.driver = {  		.name		= "tpm_tis_synquacer",  		.pm		= &tpm_tis_synquacer_pm, diff --git a/drivers/clk/clk-en7523.c b/drivers/clk/clk-en7523.c index e52c5460e927..495c0d607c7d 100644 --- a/drivers/clk/clk-en7523.c +++ b/drivers/clk/clk-en7523.c @@ -87,6 +87,7 @@ static const u32 slic_base[] = { 100000000, 3125000 };  static const u32 npu_base[] = { 333000000, 400000000, 500000000 };  /* EN7581 */  static const u32 emi7581_base[] = { 540000000, 480000000, 400000000, 300000000 }; +static const u32 bus7581_base[] = { 600000000, 540000000 };  static const u32 npu7581_base[] = { 800000000, 750000000, 720000000, 600000000 };  static const u32 crypto_base[] = { 540000000, 480000000 }; @@ -222,8 +223,8 @@ static const struct en_clk_desc en7581_base_clks[] = {  		.base_reg = REG_BUS_CLK_DIV_SEL,  		.base_bits = 1,  		.base_shift = 8, -		.base_values = bus_base, -		.n_base_values = ARRAY_SIZE(bus_base), +		.base_values = bus7581_base, +		.n_base_values = ARRAY_SIZE(bus7581_base),  		.div_bits = 3,  		.div_shift = 0, @@ -503,6 +504,8 @@ static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_dat  	u32 rate;  	int i; +	clk_data->num = EN7523_NUM_CLOCKS; +  	for (i = 0; i < ARRAY_SIZE(en7523_base_clks); i++) {  		const struct en_clk_desc *desc = &en7523_base_clks[i];  		u32 reg = desc->div_reg ? desc->div_reg : desc->base_reg; @@ -524,8 +527,6 @@ static void en7523_register_clocks(struct device *dev, struct clk_hw_onecell_dat  	hw = en7523_register_pcie_clk(dev, np_base);  	clk_data->hws[EN7523_CLK_PCIE] = hw; - -	clk_data->num = EN7523_NUM_CLOCKS;  }  static int en7523_clk_hw_init(struct platform_device *pdev, diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index bdc6e5b90da5..9b45fa005030 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2530,7 +2530,7 @@ static int clk_core_set_rate_nolock(struct clk_core *core,  	rate = clk_core_req_round_rate_nolock(core, req_rate);  	/* bail early if nothing to do */ -	if (rate == clk_core_get_rate_recalc(core)) +	if (rate == clk_core_get_rate_nolock(core))  		return 0;  	/* fail on a direct rate set of a protected provider */ diff --git a/drivers/clk/imx/clk-imx8mp-audiomix.c b/drivers/clk/imx/clk-imx8mp-audiomix.c index b2cb157703c5..c409fc7e0618 100644 --- a/drivers/clk/imx/clk-imx8mp-audiomix.c +++ b/drivers/clk/imx/clk-imx8mp-audiomix.c @@ -278,7 +278,8 @@ static int clk_imx8mp_audiomix_reset_controller_register(struct device *dev,  #else /* !CONFIG_RESET_CONTROLLER */ -static int clk_imx8mp_audiomix_reset_controller_register(struct clk_imx8mp_audiomix_priv *priv) +static int clk_imx8mp_audiomix_reset_controller_register(struct device *dev, +							 struct clk_imx8mp_audiomix_priv *priv)  {  	return 0;  } diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig index febb5d7348ff..be2e3a5f8336 100644 --- a/drivers/clk/meson/Kconfig +++ b/drivers/clk/meson/Kconfig @@ -106,7 +106,7 @@ config COMMON_CLK_AXG_AUDIO  	select COMMON_CLK_MESON_SCLK_DIV  	select COMMON_CLK_MESON_CLKC_UTILS  	select REGMAP_MMIO -	depends on RESET_MESON_AUX +	select RESET_CONTROLLER  	help  	  Support for the audio clock controller on AmLogic A113D devices,  	  aka axg, Say Y if you want audio subsystem to work. diff --git a/drivers/clk/meson/a1-peripherals.c b/drivers/clk/meson/a1-peripherals.c index 7aa6abb2eb1f..36489e0f948a 100644 --- a/drivers/clk/meson/a1-peripherals.c +++ b/drivers/clk/meson/a1-peripherals.c @@ -2246,4 +2246,4 @@ MODULE_DESCRIPTION("Amlogic A1 Peripherals Clock Controller driver");  MODULE_AUTHOR("Jian Hu <jian.hu@amlogic.com>");  MODULE_AUTHOR("Dmitry Rokosov <ddrokosov@sberdevices.ru>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/a1-pll.c b/drivers/clk/meson/a1-pll.c index 8e5a42d1afbb..8d7c7b4493c4 100644 --- a/drivers/clk/meson/a1-pll.c +++ b/drivers/clk/meson/a1-pll.c @@ -360,4 +360,4 @@ MODULE_DESCRIPTION("Amlogic S4 PLL Clock Controller driver");  MODULE_AUTHOR("Jian Hu <jian.hu@amlogic.com>");  MODULE_AUTHOR("Dmitry Rokosov <ddrokosov@sberdevices.ru>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/axg-aoclk.c b/drivers/clk/meson/axg-aoclk.c index 1dabc81535a6..f44091ffb57d 100644 --- a/drivers/clk/meson/axg-aoclk.c +++ b/drivers/clk/meson/axg-aoclk.c @@ -342,4 +342,4 @@ module_platform_driver(axg_aoclkc_driver);  MODULE_DESCRIPTION("Amlogic AXG Always-ON Clock Controller driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c index 7714bde5ffc0..9df627b142f8 100644 --- a/drivers/clk/meson/axg-audio.c +++ b/drivers/clk/meson/axg-audio.c @@ -15,8 +15,6 @@  #include <linux/reset-controller.h>  #include <linux/slab.h> -#include <soc/amlogic/reset-meson-aux.h> -  #include "meson-clkc-utils.h"  #include "axg-audio.h"  #include "clk-regmap.h" @@ -1680,6 +1678,84 @@ static struct clk_regmap *const sm1_clk_regmaps[] = {  	&sm1_earcrx_dmac_clk,  }; +struct axg_audio_reset_data { +	struct reset_controller_dev rstc; +	struct regmap *map; +	unsigned int offset; +}; + +static void axg_audio_reset_reg_and_bit(struct axg_audio_reset_data *rst, +					unsigned long id, +					unsigned int *reg, +					unsigned int *bit) +{ +	unsigned int stride = regmap_get_reg_stride(rst->map); + +	*reg = (id / (stride * BITS_PER_BYTE)) * stride; +	*reg += rst->offset; +	*bit = id % (stride * BITS_PER_BYTE); +} + +static int axg_audio_reset_update(struct reset_controller_dev *rcdev, +				unsigned long id, bool assert) +{ +	struct axg_audio_reset_data *rst = +		container_of(rcdev, struct axg_audio_reset_data, rstc); +	unsigned int offset, bit; + +	axg_audio_reset_reg_and_bit(rst, id, &offset, &bit); + +	regmap_update_bits(rst->map, offset, BIT(bit), +			assert ? BIT(bit) : 0); + +	return 0; +} + +static int axg_audio_reset_status(struct reset_controller_dev *rcdev, +				unsigned long id) +{ +	struct axg_audio_reset_data *rst = +		container_of(rcdev, struct axg_audio_reset_data, rstc); +	unsigned int val, offset, bit; + +	axg_audio_reset_reg_and_bit(rst, id, &offset, &bit); + +	regmap_read(rst->map, offset, &val); + +	return !!(val & BIT(bit)); +} + +static int axg_audio_reset_assert(struct reset_controller_dev *rcdev, +				unsigned long id) +{ +	return axg_audio_reset_update(rcdev, id, true); +} + +static int axg_audio_reset_deassert(struct reset_controller_dev *rcdev, +				unsigned long id) +{ +	return axg_audio_reset_update(rcdev, id, false); +} + +static int axg_audio_reset_toggle(struct reset_controller_dev *rcdev, +				unsigned long id) +{ +	int ret; + +	ret = axg_audio_reset_assert(rcdev, id); +	if (ret) +		return ret; + +	return axg_audio_reset_deassert(rcdev, id); +} + +static const struct reset_control_ops axg_audio_rstc_ops = { +	.assert = axg_audio_reset_assert, +	.deassert = axg_audio_reset_deassert, +	.reset = axg_audio_reset_toggle, +	.status = axg_audio_reset_status, +}; +  static struct regmap_config axg_audio_regmap_cfg = {  	.reg_bits	= 32,  	.val_bits	= 32, @@ -1690,14 +1766,16 @@ struct audioclk_data {  	struct clk_regmap *const *regmap_clks;  	unsigned int regmap_clk_num;  	struct meson_clk_hw_data hw_clks; +	unsigned int reset_offset; +	unsigned int reset_num;  	unsigned int max_register; -	const char *rst_drvname;  };  static int axg_audio_clkc_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	const struct audioclk_data *data; +	struct axg_audio_reset_data *rst;  	struct regmap *map;  	void __iomem *regs;  	struct clk_hw *hw; @@ -1756,11 +1834,22 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)  	if (ret)  		return ret; -	/* Register auxiliary reset driver when applicable */ -	if (data->rst_drvname) -		ret = devm_meson_rst_aux_register(dev, map, data->rst_drvname); +	/* Stop here if there is no reset */ +	if (!data->reset_num) +		return 0; + +	rst = devm_kzalloc(dev, sizeof(*rst), GFP_KERNEL); +	if (!rst) +		return -ENOMEM; + +	rst->map = map; +	rst->offset = data->reset_offset; +	rst->rstc.nr_resets = data->reset_num; +	rst->rstc.ops = &axg_audio_rstc_ops; +	rst->rstc.of_node = dev->of_node; +	rst->rstc.owner = THIS_MODULE; -	return ret; +	return devm_reset_controller_register(dev, &rst->rstc);  }  static const struct audioclk_data axg_audioclk_data = { @@ -1780,8 +1869,9 @@ static const struct audioclk_data g12a_audioclk_data = {  		.hws = g12a_audio_hw_clks,  		.num = ARRAY_SIZE(g12a_audio_hw_clks),  	}, +	.reset_offset = AUDIO_SW_RESET, +	.reset_num = 26,  	.max_register = AUDIO_CLK_SPDIFOUT_B_CTRL, -	.rst_drvname = "rst-g12a",  };  static const struct audioclk_data sm1_audioclk_data = { @@ -1791,8 +1881,9 @@ static const struct audioclk_data sm1_audioclk_data = {  		.hws = sm1_audio_hw_clks,  		.num = ARRAY_SIZE(sm1_audio_hw_clks),  	}, +	.reset_offset = AUDIO_SM1_SW_RESET0, +	.reset_num = 39,  	.max_register = AUDIO_EARCRX_DMAC_CLK_CTRL, -	.rst_drvname = "rst-sm1",  };  static const struct of_device_id clkc_match_table[] = { @@ -1821,4 +1912,4 @@ module_platform_driver(axg_audio_driver);  MODULE_DESCRIPTION("Amlogic AXG/G12A/SM1 Audio Clock driver");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/axg.c b/drivers/clk/meson/axg.c index 1b08daf579b2..448eece246ca 100644 --- a/drivers/clk/meson/axg.c +++ b/drivers/clk/meson/axg.c @@ -2181,4 +2181,4 @@ module_platform_driver(axg_driver);  MODULE_DESCRIPTION("Amlogic AXG Main Clock Controller driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/c3-peripherals.c b/drivers/clk/meson/c3-peripherals.c index 7dcbf4ebee07..2075668ed306 100644 --- a/drivers/clk/meson/c3-peripherals.c +++ b/drivers/clk/meson/c3-peripherals.c @@ -2364,4 +2364,4 @@ module_platform_driver(c3_peripherals_driver);  MODULE_DESCRIPTION("Amlogic C3 Peripherals Clock Controller driver");  MODULE_AUTHOR("Chuan Liu <chuan.liu@amlogic.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/c3-pll.c b/drivers/clk/meson/c3-pll.c index 35fda31a19e2..ed4bc495862e 100644 --- a/drivers/clk/meson/c3-pll.c +++ b/drivers/clk/meson/c3-pll.c @@ -746,4 +746,4 @@ module_platform_driver(c3_pll_driver);  MODULE_DESCRIPTION("Amlogic C3 PLL Clock Controller driver");  MODULE_AUTHOR("Chuan Liu <chuan.liu@amlogic.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/clk-cpu-dyndiv.c b/drivers/clk/meson/clk-cpu-dyndiv.c index 6c1f58826e24..cb043b52b65d 100644 --- a/drivers/clk/meson/clk-cpu-dyndiv.c +++ b/drivers/clk/meson/clk-cpu-dyndiv.c @@ -65,9 +65,9 @@ const struct clk_ops meson_clk_cpu_dyndiv_ops = {  	.determine_rate = meson_clk_cpu_dyndiv_determine_rate,  	.set_rate = meson_clk_cpu_dyndiv_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_cpu_dyndiv_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_cpu_dyndiv_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic CPU Dynamic Clock divider");  MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/clk-dualdiv.c b/drivers/clk/meson/clk-dualdiv.c index 913bf25d3771..c896cf29b318 100644 --- a/drivers/clk/meson/clk-dualdiv.c +++ b/drivers/clk/meson/clk-dualdiv.c @@ -130,15 +130,15 @@ const struct clk_ops meson_clk_dualdiv_ops = {  	.determine_rate	= meson_clk_dualdiv_determine_rate,  	.set_rate	= meson_clk_dualdiv_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_dualdiv_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_dualdiv_ops, "CLK_MESON");  const struct clk_ops meson_clk_dualdiv_ro_ops = {  	.recalc_rate	= meson_clk_dualdiv_recalc_rate,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_dualdiv_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_dualdiv_ro_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic dual divider driver");  MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c index aa9abd06ae65..ee91e32b4050 100644 --- a/drivers/clk/meson/clk-mpll.c +++ b/drivers/clk/meson/clk-mpll.c @@ -154,7 +154,7 @@ const struct clk_ops meson_clk_mpll_ro_ops = {  	.recalc_rate	= mpll_recalc_rate,  	.determine_rate	= mpll_determine_rate,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_mpll_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_mpll_ro_ops, "CLK_MESON");  const struct clk_ops meson_clk_mpll_ops = {  	.recalc_rate	= mpll_recalc_rate, @@ -162,9 +162,9 @@ const struct clk_ops meson_clk_mpll_ops = {  	.set_rate	= mpll_set_rate,  	.init		= mpll_init,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_mpll_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_mpll_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic MPLL driver");  MODULE_AUTHOR("Michael Turquette <mturquette@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/clk-phase.c b/drivers/clk/meson/clk-phase.c index c1526fbfb6c4..701211120610 100644 --- a/drivers/clk/meson/clk-phase.c +++ b/drivers/clk/meson/clk-phase.c @@ -61,7 +61,7 @@ const struct clk_ops meson_clk_phase_ops = {  	.get_phase	= meson_clk_phase_get_phase,  	.set_phase	= meson_clk_phase_set_phase,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_phase_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_phase_ops, "CLK_MESON");  /*   * This is a special clock for the audio controller. @@ -123,7 +123,7 @@ const struct clk_ops meson_clk_triphase_ops = {  	.get_phase	= meson_clk_triphase_get_phase,  	.set_phase	= meson_clk_triphase_set_phase,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_triphase_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_triphase_ops, "CLK_MESON");  /*   * This is a special clock for the audio controller. @@ -178,9 +178,9 @@ const struct clk_ops meson_sclk_ws_inv_ops = {  	.get_phase	= meson_sclk_ws_inv_get_phase,  	.set_phase	= meson_sclk_ws_inv_set_phase,  }; -EXPORT_SYMBOL_NS_GPL(meson_sclk_ws_inv_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_sclk_ws_inv_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic phase driver");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c index 89f0f04a16ab..e8e53855b00a 100644 --- a/drivers/clk/meson/clk-pll.c +++ b/drivers/clk/meson/clk-pll.c @@ -474,7 +474,7 @@ const struct clk_ops meson_clk_pcie_pll_ops = {  	.enable		= meson_clk_pcie_pll_enable,  	.disable	= meson_clk_pll_disable  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_pcie_pll_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_pcie_pll_ops, "CLK_MESON");  const struct clk_ops meson_clk_pll_ops = {  	.init		= meson_clk_pll_init, @@ -485,16 +485,16 @@ const struct clk_ops meson_clk_pll_ops = {  	.enable		= meson_clk_pll_enable,  	.disable	= meson_clk_pll_disable  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_pll_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_pll_ops, "CLK_MESON");  const struct clk_ops meson_clk_pll_ro_ops = {  	.recalc_rate	= meson_clk_pll_recalc_rate,  	.is_enabled	= meson_clk_pll_is_enabled,  }; -EXPORT_SYMBOL_NS_GPL(meson_clk_pll_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_pll_ro_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic PLL driver");  MODULE_AUTHOR("Carlo Caione <carlo@endlessm.com>");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/clk-regmap.c b/drivers/clk/meson/clk-regmap.c index 07f7e441b916..f3e504f67571 100644 --- a/drivers/clk/meson/clk-regmap.c +++ b/drivers/clk/meson/clk-regmap.c @@ -49,12 +49,12 @@ const struct clk_ops clk_regmap_gate_ops = {  	.disable = clk_regmap_gate_disable,  	.is_enabled = clk_regmap_gate_is_enabled,  }; -EXPORT_SYMBOL_NS_GPL(clk_regmap_gate_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(clk_regmap_gate_ops, "CLK_MESON");  const struct clk_ops clk_regmap_gate_ro_ops = {  	.is_enabled = clk_regmap_gate_is_enabled,  }; -EXPORT_SYMBOL_NS_GPL(clk_regmap_gate_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(clk_regmap_gate_ro_ops, "CLK_MESON");  static unsigned long clk_regmap_div_recalc_rate(struct clk_hw *hw,  						unsigned long prate) @@ -125,13 +125,13 @@ const struct clk_ops clk_regmap_divider_ops = {  	.determine_rate = clk_regmap_div_determine_rate,  	.set_rate = clk_regmap_div_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(clk_regmap_divider_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(clk_regmap_divider_ops, "CLK_MESON");  const struct clk_ops clk_regmap_divider_ro_ops = {  	.recalc_rate = clk_regmap_div_recalc_rate,  	.determine_rate = clk_regmap_div_determine_rate,  }; -EXPORT_SYMBOL_NS_GPL(clk_regmap_divider_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(clk_regmap_divider_ro_ops, "CLK_MESON");  static u8 clk_regmap_mux_get_parent(struct clk_hw *hw)  { @@ -174,14 +174,14 @@ const struct clk_ops clk_regmap_mux_ops = {  	.set_parent = clk_regmap_mux_set_parent,  	.determine_rate = clk_regmap_mux_determine_rate,  }; -EXPORT_SYMBOL_NS_GPL(clk_regmap_mux_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(clk_regmap_mux_ops, "CLK_MESON");  const struct clk_ops clk_regmap_mux_ro_ops = {  	.get_parent = clk_regmap_mux_get_parent,  }; -EXPORT_SYMBOL_NS_GPL(clk_regmap_mux_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(clk_regmap_mux_ro_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic regmap backed clock driver");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/g12a-aoclk.c b/drivers/clk/meson/g12a-aoclk.c index f0a18d8c9fc2..71c758ffa493 100644 --- a/drivers/clk/meson/g12a-aoclk.c +++ b/drivers/clk/meson/g12a-aoclk.c @@ -477,4 +477,4 @@ module_platform_driver(g12a_aoclkc_driver);  MODULE_DESCRIPTION("Amlogic G12A Always-ON Clock Controller driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c index d3539fe9f7af..cfffd434e998 100644 --- a/drivers/clk/meson/g12a.c +++ b/drivers/clk/meson/g12a.c @@ -5610,4 +5610,4 @@ module_platform_driver(g12a_driver);  MODULE_DESCRIPTION("Amlogic G12/SM1 Main Clock Controller driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/gxbb-aoclk.c b/drivers/clk/meson/gxbb-aoclk.c index 83b034157b35..43940232f718 100644 --- a/drivers/clk/meson/gxbb-aoclk.c +++ b/drivers/clk/meson/gxbb-aoclk.c @@ -303,4 +303,4 @@ module_platform_driver(gxbb_aoclkc_driver);  MODULE_DESCRIPTION("Amlogic GXBB Always-ON Clock Controller driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c index 262c318edbd5..8575b8485385 100644 --- a/drivers/clk/meson/gxbb.c +++ b/drivers/clk/meson/gxbb.c @@ -3565,4 +3565,4 @@ module_platform_driver(gxbb_driver);  MODULE_DESCRIPTION("Amlogic GXBB Main Clock Controller driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/meson-aoclk.c b/drivers/clk/meson/meson-aoclk.c index 053940ee8940..995be51987f4 100644 --- a/drivers/clk/meson/meson-aoclk.c +++ b/drivers/clk/meson/meson-aoclk.c @@ -88,8 +88,8 @@ int meson_aoclkc_probe(struct platform_device *pdev)  	return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, (void *)&data->hw_clks);  } -EXPORT_SYMBOL_NS_GPL(meson_aoclkc_probe, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_aoclkc_probe, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic Always-ON Clock Controller helpers");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/meson-clkc-utils.c b/drivers/clk/meson/meson-clkc-utils.c index a8cd2c21fab7..6937d1482719 100644 --- a/drivers/clk/meson/meson-clkc-utils.c +++ b/drivers/clk/meson/meson-clkc-utils.c @@ -20,8 +20,8 @@ struct clk_hw *meson_clk_hw_get(struct of_phandle_args *clkspec, void *clk_hw_da  	return data->hws[idx];  } -EXPORT_SYMBOL_NS_GPL(meson_clk_hw_get, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_clk_hw_get, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic Clock Controller Utilities");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/meson-eeclk.c b/drivers/clk/meson/meson-eeclk.c index 66f79e384fe5..3053ee7425eb 100644 --- a/drivers/clk/meson/meson-eeclk.c +++ b/drivers/clk/meson/meson-eeclk.c @@ -57,8 +57,8 @@ int meson_eeclkc_probe(struct platform_device *pdev)  	return devm_of_clk_add_hw_provider(dev, meson_clk_hw_get, (void *)&data->hw_clks);  } -EXPORT_SYMBOL_NS_GPL(meson_eeclkc_probe, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_eeclkc_probe, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic Main Clock Controller Helpers");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/s4-peripherals.c b/drivers/clk/meson/s4-peripherals.c index c930cf0614a0..8a4037377787 100644 --- a/drivers/clk/meson/s4-peripherals.c +++ b/drivers/clk/meson/s4-peripherals.c @@ -3814,4 +3814,4 @@ module_platform_driver(s4_driver);  MODULE_DESCRIPTION("Amlogic S4 Peripherals Clock Controller driver");  MODULE_AUTHOR("Yu Tu <yu.tu@amlogic.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/s4-pll.c b/drivers/clk/meson/s4-pll.c index d8e621e79428..f9cc05a506e3 100644 --- a/drivers/clk/meson/s4-pll.c +++ b/drivers/clk/meson/s4-pll.c @@ -872,4 +872,4 @@ module_platform_driver(s4_driver);  MODULE_DESCRIPTION("Amlogic S4 PLL Clock Controller driver");  MODULE_AUTHOR("Yu Tu <yu.tu@amlogic.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/sclk-div.c b/drivers/clk/meson/sclk-div.c index ae03b048182f..9c4945234f26 100644 --- a/drivers/clk/meson/sclk-div.c +++ b/drivers/clk/meson/sclk-div.c @@ -247,9 +247,9 @@ const struct clk_ops meson_sclk_div_ops = {  	.set_duty_cycle = sclk_div_set_duty_cycle,  	.init		= sclk_div_init,  }; -EXPORT_SYMBOL_NS_GPL(meson_sclk_div_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_sclk_div_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic Sample divider driver");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/vclk.c b/drivers/clk/meson/vclk.c index 36f637d2d01b..6a167ebdc8d7 100644 --- a/drivers/clk/meson/vclk.c +++ b/drivers/clk/meson/vclk.c @@ -49,7 +49,7 @@ const struct clk_ops meson_vclk_gate_ops = {  	.disable = meson_vclk_gate_disable,  	.is_enabled = meson_vclk_gate_is_enabled,  }; -EXPORT_SYMBOL_NS_GPL(meson_vclk_gate_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_vclk_gate_ops, "CLK_MESON");  /* The VCLK Divider has supplementary reset & enable bits */ @@ -134,9 +134,9 @@ const struct clk_ops meson_vclk_div_ops = {  	.disable = meson_vclk_div_disable,  	.is_enabled = meson_vclk_div_is_enabled,  }; -EXPORT_SYMBOL_NS_GPL(meson_vclk_div_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_vclk_div_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic vclk clock driver");  MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/meson/vid-pll-div.c b/drivers/clk/meson/vid-pll-div.c index 486cf68fc97a..965ed7281f57 100644 --- a/drivers/clk/meson/vid-pll-div.c +++ b/drivers/clk/meson/vid-pll-div.c @@ -92,9 +92,9 @@ static unsigned long meson_vid_pll_div_recalc_rate(struct clk_hw *hw,  const struct clk_ops meson_vid_pll_div_ro_ops = {  	.recalc_rate	= meson_vid_pll_div_recalc_rate,  }; -EXPORT_SYMBOL_NS_GPL(meson_vid_pll_div_ro_ops, CLK_MESON); +EXPORT_SYMBOL_NS_GPL(meson_vid_pll_div_ro_ops, "CLK_MESON");  MODULE_DESCRIPTION("Amlogic video pll divider driver");  MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CLK_MESON); +MODULE_IMPORT_NS("CLK_MESON"); diff --git a/drivers/clk/microchip/clk-mpfs.c b/drivers/clk/microchip/clk-mpfs.c index 28ec0da88cb3..c22632a7439c 100644 --- a/drivers/clk/microchip/clk-mpfs.c +++ b/drivers/clk/microchip/clk-mpfs.c @@ -443,4 +443,4 @@ MODULE_DESCRIPTION("Microchip PolarFire SoC Clock Driver");  MODULE_AUTHOR("Padmarao Begari <padmarao.begari@microchip.com>");  MODULE_AUTHOR("Daire McNamara <daire.mcnamara@microchip.com>");  MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>"); -MODULE_IMPORT_NS(MCHP_CLK_MPFS); +MODULE_IMPORT_NS("MCHP_CLK_MPFS"); diff --git a/drivers/clk/sunxi-ng/ccu-sun20i-d1-r.c b/drivers/clk/sunxi-ng/ccu-sun20i-d1-r.c index 4084714adb15..44b2ebdebdac 100644 --- a/drivers/clk/sunxi-ng/ccu-sun20i-d1-r.c +++ b/drivers/clk/sunxi-ng/ccu-sun20i-d1-r.c @@ -137,6 +137,6 @@ static struct platform_driver sun20i_d1_r_ccu_driver = {  };  module_platform_driver(sun20i_d1_r_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner D1/R528/T113 PRCM CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun20i-d1.c b/drivers/clk/sunxi-ng/ccu-sun20i-d1.c index c80ac2dfbb60..bb66c906ebbb 100644 --- a/drivers/clk/sunxi-ng/ccu-sun20i-d1.c +++ b/drivers/clk/sunxi-ng/ccu-sun20i-d1.c @@ -1406,6 +1406,6 @@ static struct platform_driver sun20i_d1_ccu_driver = {  };  module_platform_driver(sun20i_d1_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner D1/R528/T113 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c index 54c794c50828..409feb085021 100644 --- a/drivers/clk/sunxi-ng/ccu-sun4i-a10.c +++ b/drivers/clk/sunxi-ng/ccu-sun4i-a10.c @@ -1493,6 +1493,6 @@ static struct platform_driver sun4i_a10_ccu_driver = {  };  module_platform_driver(sun4i_a10_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A10/A20 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c index cdd9721f9e7d..cb0f8d110c32 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c @@ -214,6 +214,6 @@ static struct platform_driver sun50i_a100_r_ccu_driver = {  };  module_platform_driver(sun50i_a100_r_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A100 PRCM CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a100.c b/drivers/clk/sunxi-ng/ccu-sun50i-a100.c index 1b6a49bc7184..7133377d4163 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a100.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a100.c @@ -1276,6 +1276,6 @@ static struct platform_driver sun50i_a100_ccu_driver = {  };  module_platform_driver(sun50i_a100_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A100 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c index 82d7dcbca1cc..3a7d61c81667 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-a64.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-a64.c @@ -994,6 +994,6 @@ static struct platform_driver sun50i_a64_ccu_driver = {  };  module_platform_driver(sun50i_a64_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A64 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c index d0ce2779c550..acb4e8b9b1ba 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c @@ -256,6 +256,6 @@ static struct platform_driver sun50i_h6_r_ccu_driver = {  };  module_platform_driver(sun50i_h6_r_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner H6 and H616 PRCM CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c index bd6fc3df911d..7fccda96d444 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c @@ -1286,6 +1286,6 @@ static struct platform_driver sun50i_h6_ccu_driver = {  };  module_platform_driver(sun50i_h6_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner H6 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h616.c b/drivers/clk/sunxi-ng/ccu-sun50i-h616.c index b001d0c03534..1086669b91da 100644 --- a/drivers/clk/sunxi-ng/ccu-sun50i-h616.c +++ b/drivers/clk/sunxi-ng/ccu-sun50i-h616.c @@ -1185,6 +1185,6 @@ static struct platform_driver sun50i_h616_ccu_driver = {  };  module_platform_driver(sun50i_h616_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner H616 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c index c2ad1209633e..bab65cfe9501 100644 --- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c +++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c @@ -1283,6 +1283,6 @@ static struct platform_driver sun6i_a31_ccu_driver = {  };  module_platform_driver(sun6i_a31_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A31/A31s CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-rtc.c b/drivers/clk/sunxi-ng/ccu-sun6i-rtc.c index 724b202863a8..0536e880b80f 100644 --- a/drivers/clk/sunxi-ng/ccu-sun6i-rtc.c +++ b/drivers/clk/sunxi-ng/ccu-sun6i-rtc.c @@ -381,6 +381,6 @@ int sun6i_rtc_ccu_probe(struct device *dev, void __iomem *reg)  	return devm_sunxi_ccu_probe(dev, reg, &sun6i_rtc_ccu_desc);  } -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner H616/R329 RTC CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c index 9433dbac038e..78cf3818ab09 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-a23.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-a23.c @@ -763,6 +763,6 @@ static struct platform_driver sun8i_a23_ccu_driver = {  };  module_platform_driver(sun8i_a23_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A23 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c index 1ffc5ab9bc3c..b039d419512c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c @@ -835,6 +835,6 @@ static struct platform_driver sun8i_a33_ccu_driver = {  };  module_platform_driver(sun8i_a33_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A33 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c b/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c index a51fb2c10c94..60e918965a72 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-a83t.c @@ -923,6 +923,6 @@ static struct platform_driver sun8i_a83t_ccu_driver = {  };  module_platform_driver(sun8i_a83t_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A83T CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-de2.c b/drivers/clk/sunxi-ng/ccu-sun8i-de2.c index a742f83746d1..f2aa71206bc2 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-de2.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-de2.c @@ -348,6 +348,6 @@ static struct platform_driver sunxi_de2_clk_driver = {  };  module_platform_driver(sunxi_de2_clk_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner SoCs DE2 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c index 74da5d27af72..740c4c97331c 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-h3.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-h3.c @@ -1094,6 +1094,6 @@ static struct platform_driver sun8i_h3_ccu_driver = {  };  module_platform_driver(sun8i_h3_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner H3 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c b/drivers/clk/sunxi-ng/ccu-sun8i-r.c index 2b3e094a32cb..0e324344673b 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c @@ -274,6 +274,6 @@ static struct platform_driver sun8i_r_ccu_driver = {  };  module_platform_driver(sun8i_r_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for Allwinner SoCs' PRCM CCUs");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r40.c b/drivers/clk/sunxi-ng/ccu-sun8i-r40.c index a374aeeca3f4..8b729c9b3545 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-r40.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-r40.c @@ -1375,6 +1375,6 @@ static struct platform_driver sun8i_r40_ccu_driver = {  };  module_platform_driver(sun8i_r40_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner R40 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c index 00d04f7ad94d..579a81bb46df 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c @@ -780,6 +780,6 @@ static struct platform_driver sun8i_v3s_ccu_driver = {  };  module_platform_driver(sun8i_v3s_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner V3s CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c index d561c15f5122..91e5dc448bc0 100644 --- a/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c +++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c @@ -266,6 +266,6 @@ static struct platform_driver sun9i_a80_de_clk_driver = {  };  module_platform_driver(sun9i_a80_de_clk_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A80 Display Engine CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c index 9e2b8d47fc54..62063f525616 100644 --- a/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c +++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c @@ -138,6 +138,6 @@ static struct platform_driver sun9i_a80_usb_clk_driver = {  };  module_platform_driver(sun9i_a80_usb_clk_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A80 USB CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c index 5da9a16b4ec7..337751998005 100644 --- a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c +++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c @@ -1248,6 +1248,6 @@ static struct platform_driver sun9i_a80_ccu_driver = {  };  module_platform_driver(sun9i_a80_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner A80 CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c b/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c index fb37c0fc4fde..35935423145e 100644 --- a/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c +++ b/drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c @@ -577,6 +577,6 @@ static struct platform_driver suniv_f1c100s_ccu_driver = {  };  module_platform_driver(suniv_f1c100s_ccu_driver); -MODULE_IMPORT_NS(SUNXI_CCU); +MODULE_IMPORT_NS("SUNXI_CCU");  MODULE_DESCRIPTION("Support for the Allwinner newer F1C100s CCU");  MODULE_LICENSE("GPL"); diff --git a/drivers/clk/sunxi-ng/ccu_common.c b/drivers/clk/sunxi-ng/ccu_common.c index 4117b0bea267..88ed89658d45 100644 --- a/drivers/clk/sunxi-ng/ccu_common.c +++ b/drivers/clk/sunxi-ng/ccu_common.c @@ -37,7 +37,7 @@ void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock)  	WARN_ON(readl_relaxed_poll_timeout(addr, reg, reg & lock, 100, 70000));  } -EXPORT_SYMBOL_NS_GPL(ccu_helper_wait_for_lock, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_helper_wait_for_lock, "SUNXI_CCU");  bool ccu_is_better_rate(struct ccu_common *common,  			unsigned long target_rate, @@ -59,7 +59,7 @@ bool ccu_is_better_rate(struct ccu_common *common,  	return current_rate <= target_rate && current_rate > best_rate;  } -EXPORT_SYMBOL_NS_GPL(ccu_is_better_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_is_better_rate, "SUNXI_CCU");  /*   * This clock notifier is called when the frequency of a PLL clock is @@ -107,7 +107,7 @@ int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb)  	return clk_notifier_register(pll_nb->common->hw.clk,  				     &pll_nb->clk_nb);  } -EXPORT_SYMBOL_NS_GPL(ccu_pll_notifier_register, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_pll_notifier_register, "SUNXI_CCU");  static int sunxi_ccu_probe(struct sunxi_ccu *ccu, struct device *dev,  			   struct device_node *node, void __iomem *reg, @@ -234,7 +234,7 @@ int devm_sunxi_ccu_probe(struct device *dev, void __iomem *reg,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(devm_sunxi_ccu_probe, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(devm_sunxi_ccu_probe, "SUNXI_CCU");  void of_sunxi_ccu_probe(struct device_node *node, void __iomem *reg,  			const struct sunxi_ccu_desc *desc) diff --git a/drivers/clk/sunxi-ng/ccu_div.c b/drivers/clk/sunxi-ng/ccu_div.c index cb10a3ea23f9..7f4691f09e01 100644 --- a/drivers/clk/sunxi-ng/ccu_div.c +++ b/drivers/clk/sunxi-ng/ccu_div.c @@ -141,4 +141,4 @@ const struct clk_ops ccu_div_ops = {  	.recalc_rate	= ccu_div_recalc_rate,  	.set_rate	= ccu_div_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_div_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_div_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_frac.c b/drivers/clk/sunxi-ng/ccu_frac.c index b31f3ad946d6..75323912608a 100644 --- a/drivers/clk/sunxi-ng/ccu_frac.c +++ b/drivers/clk/sunxi-ng/ccu_frac.c @@ -18,7 +18,7 @@ bool ccu_frac_helper_is_enabled(struct ccu_common *common,  	return !(readl(common->base + common->reg) & cf->enable);  } -EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_is_enabled, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_is_enabled, "SUNXI_CCU");  void ccu_frac_helper_enable(struct ccu_common *common,  			    struct ccu_frac_internal *cf) @@ -34,7 +34,7 @@ void ccu_frac_helper_enable(struct ccu_common *common,  	writel(reg & ~cf->enable, common->base + common->reg);  	spin_unlock_irqrestore(common->lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_enable, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_enable, "SUNXI_CCU");  void ccu_frac_helper_disable(struct ccu_common *common,  			     struct ccu_frac_internal *cf) @@ -50,7 +50,7 @@ void ccu_frac_helper_disable(struct ccu_common *common,  	writel(reg | cf->enable, common->base + common->reg);  	spin_unlock_irqrestore(common->lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_disable, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_disable, "SUNXI_CCU");  bool ccu_frac_helper_has_rate(struct ccu_common *common,  			      struct ccu_frac_internal *cf, @@ -61,7 +61,7 @@ bool ccu_frac_helper_has_rate(struct ccu_common *common,  	return (cf->rates[0] == rate) || (cf->rates[1] == rate);  } -EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_has_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_has_rate, "SUNXI_CCU");  unsigned long ccu_frac_helper_read_rate(struct ccu_common *common,  					struct ccu_frac_internal *cf) @@ -83,7 +83,7 @@ unsigned long ccu_frac_helper_read_rate(struct ccu_common *common,  	return (reg & cf->select) ? cf->rates[1] : cf->rates[0];  } -EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_read_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_read_rate, "SUNXI_CCU");  int ccu_frac_helper_set_rate(struct ccu_common *common,  			     struct ccu_frac_internal *cf, @@ -112,4 +112,4 @@ int ccu_frac_helper_set_rate(struct ccu_common *common,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_set_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_frac_helper_set_rate, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_gate.c b/drivers/clk/sunxi-ng/ccu_gate.c index a2115a21807d..ac52fd6bff67 100644 --- a/drivers/clk/sunxi-ng/ccu_gate.c +++ b/drivers/clk/sunxi-ng/ccu_gate.c @@ -24,7 +24,7 @@ void ccu_gate_helper_disable(struct ccu_common *common, u32 gate)  	spin_unlock_irqrestore(common->lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ccu_gate_helper_disable, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_gate_helper_disable, "SUNXI_CCU");  static void ccu_gate_disable(struct clk_hw *hw)  { @@ -50,7 +50,7 @@ int ccu_gate_helper_enable(struct ccu_common *common, u32 gate)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ccu_gate_helper_enable, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_gate_helper_enable, "SUNXI_CCU");  static int ccu_gate_enable(struct clk_hw *hw)  { @@ -66,7 +66,7 @@ int ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate)  	return readl(common->base + common->reg) & gate;  } -EXPORT_SYMBOL_NS_GPL(ccu_gate_helper_is_enabled, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_gate_helper_is_enabled, "SUNXI_CCU");  static int ccu_gate_is_enabled(struct clk_hw *hw)  { @@ -127,4 +127,4 @@ const struct clk_ops ccu_gate_ops = {  	.set_rate	= ccu_gate_set_rate,  	.recalc_rate	= ccu_gate_recalc_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_gate_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_gate_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_mp.c b/drivers/clk/sunxi-ng/ccu_mp.c index cc94a694cb67..2bb8987ddcc2 100644 --- a/drivers/clk/sunxi-ng/ccu_mp.c +++ b/drivers/clk/sunxi-ng/ccu_mp.c @@ -246,7 +246,7 @@ const struct clk_ops ccu_mp_ops = {  	.recalc_rate	= ccu_mp_recalc_rate,  	.set_rate	= ccu_mp_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_mp_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mp_ops, "SUNXI_CCU");  /*   * Support for MMC timing mode switching @@ -327,4 +327,4 @@ const struct clk_ops ccu_mp_mmc_ops = {  	.recalc_rate	= ccu_mp_mmc_recalc_rate,  	.set_rate	= ccu_mp_mmc_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_mp_mmc_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mp_mmc_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_mult.c b/drivers/clk/sunxi-ng/ccu_mult.c index 7bee217ef111..8d5720f3dec1 100644 --- a/drivers/clk/sunxi-ng/ccu_mult.c +++ b/drivers/clk/sunxi-ng/ccu_mult.c @@ -170,4 +170,4 @@ const struct clk_ops ccu_mult_ops = {  	.recalc_rate	= ccu_mult_recalc_rate,  	.set_rate	= ccu_mult_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_mult_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mult_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_mux.c b/drivers/clk/sunxi-ng/ccu_mux.c index 5edc63b46651..d7ffbdeee9e0 100644 --- a/drivers/clk/sunxi-ng/ccu_mux.c +++ b/drivers/clk/sunxi-ng/ccu_mux.c @@ -66,7 +66,7 @@ unsigned long ccu_mux_helper_apply_prediv(struct ccu_common *common,  {  	return parent_rate / ccu_mux_get_prediv(common, cm, parent_index);  } -EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_apply_prediv, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_apply_prediv, "SUNXI_CCU");  static unsigned long ccu_mux_helper_unapply_prediv(struct ccu_common *common,  					    struct ccu_mux_internal *cm, @@ -155,7 +155,7 @@ out:  	req->rate = best_rate;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_determine_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_determine_rate, "SUNXI_CCU");  u8 ccu_mux_helper_get_parent(struct ccu_common *common,  			     struct ccu_mux_internal *cm) @@ -178,7 +178,7 @@ u8 ccu_mux_helper_get_parent(struct ccu_common *common,  	return parent;  } -EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_get_parent, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_get_parent, "SUNXI_CCU");  int ccu_mux_helper_set_parent(struct ccu_common *common,  			      struct ccu_mux_internal *cm, @@ -205,7 +205,7 @@ int ccu_mux_helper_set_parent(struct ccu_common *common,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_set_parent, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mux_helper_set_parent, "SUNXI_CCU");  static void ccu_mux_disable(struct clk_hw *hw)  { @@ -273,7 +273,7 @@ const struct clk_ops ccu_mux_ops = {  	.determine_rate	= ccu_mux_determine_rate,  	.recalc_rate	= ccu_mux_recalc_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_mux_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mux_ops, "SUNXI_CCU");  /*   * This clock notifier is called when the frequency of the of the parent @@ -308,4 +308,4 @@ int ccu_mux_notifier_register(struct clk *clk, struct ccu_mux_nb *mux_nb)  	return clk_notifier_register(clk, &mux_nb->clk_nb);  } -EXPORT_SYMBOL_NS_GPL(ccu_mux_notifier_register, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_mux_notifier_register, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_nk.c b/drivers/clk/sunxi-ng/ccu_nk.c index 8aa35d5804f3..555e99de2cc6 100644 --- a/drivers/clk/sunxi-ng/ccu_nk.c +++ b/drivers/clk/sunxi-ng/ccu_nk.c @@ -158,4 +158,4 @@ const struct clk_ops ccu_nk_ops = {  	.round_rate	= ccu_nk_round_rate,  	.set_rate	= ccu_nk_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_nk_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_nk_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c index 1168d894d636..784eec9ac997 100644 --- a/drivers/clk/sunxi-ng/ccu_nkm.c +++ b/drivers/clk/sunxi-ng/ccu_nkm.c @@ -267,4 +267,4 @@ const struct clk_ops ccu_nkm_ops = {  	.recalc_rate	= ccu_nkm_recalc_rate,  	.set_rate	= ccu_nkm_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_nkm_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_nkm_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_nkmp.c b/drivers/clk/sunxi-ng/ccu_nkmp.c index 99359a06892d..6e03b69d4028 100644 --- a/drivers/clk/sunxi-ng/ccu_nkmp.c +++ b/drivers/clk/sunxi-ng/ccu_nkmp.c @@ -230,4 +230,4 @@ const struct clk_ops ccu_nkmp_ops = {  	.round_rate	= ccu_nkmp_round_rate,  	.set_rate	= ccu_nkmp_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_nkmp_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_nkmp_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c index ffac3deb89d6..a4e2243b8d6b 100644 --- a/drivers/clk/sunxi-ng/ccu_nm.c +++ b/drivers/clk/sunxi-ng/ccu_nm.c @@ -236,4 +236,4 @@ const struct clk_ops ccu_nm_ops = {  	.round_rate	= ccu_nm_round_rate,  	.set_rate	= ccu_nm_set_rate,  }; -EXPORT_SYMBOL_NS_GPL(ccu_nm_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_nm_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_phase.c b/drivers/clk/sunxi-ng/ccu_phase.c index e4cae2afe9db..ca43cf448666 100644 --- a/drivers/clk/sunxi-ng/ccu_phase.c +++ b/drivers/clk/sunxi-ng/ccu_phase.c @@ -121,4 +121,4 @@ const struct clk_ops ccu_phase_ops = {  	.get_phase	= ccu_phase_get_phase,  	.set_phase	= ccu_phase_set_phase,  }; -EXPORT_SYMBOL_NS_GPL(ccu_phase_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_phase_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_reset.c b/drivers/clk/sunxi-ng/ccu_reset.c index 6577aa18cb01..55bc7c7cda0f 100644 --- a/drivers/clk/sunxi-ng/ccu_reset.c +++ b/drivers/clk/sunxi-ng/ccu_reset.c @@ -75,4 +75,4 @@ const struct reset_control_ops ccu_reset_ops = {  	.reset		= ccu_reset_reset,  	.status		= ccu_reset_status,  }; -EXPORT_SYMBOL_NS_GPL(ccu_reset_ops, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_reset_ops, "SUNXI_CCU"); diff --git a/drivers/clk/sunxi-ng/ccu_sdm.c b/drivers/clk/sunxi-ng/ccu_sdm.c index 41937ed0766d..c564e5f9e610 100644 --- a/drivers/clk/sunxi-ng/ccu_sdm.c +++ b/drivers/clk/sunxi-ng/ccu_sdm.c @@ -20,7 +20,7 @@ bool ccu_sdm_helper_is_enabled(struct ccu_common *common,  	return !!(readl(common->base + sdm->tuning_reg) & sdm->tuning_enable);  } -EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_is_enabled, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_is_enabled, "SUNXI_CCU");  void ccu_sdm_helper_enable(struct ccu_common *common,  			   struct ccu_sdm_internal *sdm, @@ -50,7 +50,7 @@ void ccu_sdm_helper_enable(struct ccu_common *common,  	writel(reg | sdm->enable, common->base + common->reg);  	spin_unlock_irqrestore(common->lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_enable, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_enable, "SUNXI_CCU");  void ccu_sdm_helper_disable(struct ccu_common *common,  			    struct ccu_sdm_internal *sdm) @@ -71,7 +71,7 @@ void ccu_sdm_helper_disable(struct ccu_common *common,  	writel(reg & ~sdm->tuning_enable, common->base + sdm->tuning_reg);  	spin_unlock_irqrestore(common->lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_disable, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_disable, "SUNXI_CCU");  /*   * Sigma delta modulation provides a way to do fractional-N frequency @@ -105,7 +105,7 @@ bool ccu_sdm_helper_has_rate(struct ccu_common *common,  	return false;  } -EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_has_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_has_rate, "SUNXI_CCU");  unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common,  				       struct ccu_sdm_internal *sdm, @@ -136,7 +136,7 @@ unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common,  	/* We can't calculate the effective clock rate, so just fail. */  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_read_rate, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_read_rate, "SUNXI_CCU");  int ccu_sdm_helper_get_factors(struct ccu_common *common,  			       struct ccu_sdm_internal *sdm, @@ -158,4 +158,4 @@ int ccu_sdm_helper_get_factors(struct ccu_common *common,  	/* nothing found */  	return -EINVAL;  } -EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_get_factors, SUNXI_CCU); +EXPORT_SYMBOL_NS_GPL(ccu_sdm_helper_get_factors, "SUNXI_CCU"); diff --git a/drivers/clk/thead/clk-th1520-ap.c b/drivers/clk/thead/clk-th1520-ap.c index 17e32ae08720..1015fab95251 100644 --- a/drivers/clk/thead/clk-th1520-ap.c +++ b/drivers/clk/thead/clk-th1520-ap.c @@ -779,6 +779,13 @@ static struct ccu_div dpu1_clk = {  	},  }; +static CLK_FIXED_FACTOR_HW(emmc_sdio_ref_clk, "emmc-sdio-ref", +			   &video_pll_clk.common.hw, 4, 1, 0); + +static const struct clk_parent_data emmc_sdio_ref_clk_pd[] = { +	{ .hw = &emmc_sdio_ref_clk.hw }, +}; +  static CCU_GATE(CLK_BROM, brom_clk, "brom", ahb2_cpusys_hclk_pd, 0x100, BIT(4), 0);  static CCU_GATE(CLK_BMU, bmu_clk, "bmu", axi4_cpusys2_aclk_pd, 0x100, BIT(5), 0);  static CCU_GATE(CLK_AON2CPU_A2X, aon2cpu_a2x_clk, "aon2cpu-a2x", axi4_cpusys2_aclk_pd, @@ -798,7 +805,7 @@ static CCU_GATE(CLK_PERISYS_APB4_HCLK, perisys_apb4_hclk, "perisys-apb4-hclk", p  		0x150, BIT(12), 0);  static CCU_GATE(CLK_NPU_AXI, npu_axi_clk, "npu-axi", axi_aclk_pd, 0x1c8, BIT(5), 0);  static CCU_GATE(CLK_CPU2VP, cpu2vp_clk, "cpu2vp", axi_aclk_pd, 0x1e0, BIT(13), 0); -static CCU_GATE(CLK_EMMC_SDIO, emmc_sdio_clk, "emmc-sdio", video_pll_clk_pd, 0x204, BIT(30), 0); +static CCU_GATE(CLK_EMMC_SDIO, emmc_sdio_clk, "emmc-sdio", emmc_sdio_ref_clk_pd, 0x204, BIT(30), 0);  static CCU_GATE(CLK_GMAC1, gmac1_clk, "gmac1", gmac_pll_clk_pd, 0x204, BIT(26), 0);  static CCU_GATE(CLK_PADCTRL1, padctrl1_clk, "padctrl1", perisys_apb_pclk_pd, 0x204, BIT(24), 0);  static CCU_GATE(CLK_DSMART, dsmart_clk, "dsmart", perisys_apb_pclk_pd, 0x204, BIT(23), 0); @@ -1059,6 +1066,10 @@ static int th1520_clk_probe(struct platform_device *pdev)  		return ret;  	priv->hws[CLK_PLL_GMAC_100M] = &gmac_pll_clk_100m.hw; +	ret = devm_clk_hw_register(dev, &emmc_sdio_ref_clk.hw); +	if (ret) +		return ret; +  	ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get, priv);  	if (ret)  		return ret; diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyperv_timer.c index 99177835cade..b39dee7b93af 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -27,7 +27,8 @@  #include <asm/mshyperv.h>  static struct clock_event_device __percpu *hv_clock_event; -static u64 hv_sched_clock_offset __ro_after_init; +/* Note: offset can hold negative values after hibernation. */ +static u64 hv_sched_clock_offset __read_mostly;  /*   * If false, we're using the old mechanism for stimer0 interrupts @@ -470,6 +471,17 @@ static void resume_hv_clock_tsc(struct clocksource *arg)  	hv_set_msr(HV_MSR_REFERENCE_TSC, tsc_msr.as_uint64);  } +/* + * Called during resume from hibernation, from overridden + * x86_platform.restore_sched_clock_state routine. This is to adjust offsets + * used to calculate time for hv tsc page based sched_clock, to account for + * time spent before hibernation. + */ +void hv_adj_sched_clock_offset(u64 offset) +{ +	hv_sched_clock_offset -= offset; +} +  #ifdef HAVE_VDSO_CLOCKMODE_HVCLOCK  static int hv_cs_enable(struct clocksource *cs)  { diff --git a/drivers/clocksource/timer-sun5i.c b/drivers/clocksource/timer-sun5i.c index 0d229a9058da..6b48a9006444 100644 --- a/drivers/clocksource/timer-sun5i.c +++ b/drivers/clocksource/timer-sun5i.c @@ -318,7 +318,7 @@ MODULE_DEVICE_TABLE(of, sun5i_timer_of_match);  static struct platform_driver sun5i_timer_driver = {  	.probe		= sun5i_timer_probe, -	.remove_new	= sun5i_timer_remove, +	.remove		= sun5i_timer_remove,  	.driver	= {  		.name	= "sun5i-timer",  		.of_match_table = sun5i_timer_of_match, diff --git a/drivers/clocksource/timer-tegra186.c b/drivers/clocksource/timer-tegra186.c index 304537dadf2c..5d4cf5237a11 100644 --- a/drivers/clocksource/timer-tegra186.c +++ b/drivers/clocksource/timer-tegra186.c @@ -502,7 +502,7 @@ static struct platform_driver tegra186_wdt_driver = {  		.of_match_table = tegra186_timer_of_match,  	},  	.probe = tegra186_timer_probe, -	.remove_new = tegra186_timer_remove, +	.remove = tegra186_timer_remove,  };  module_platform_driver(tegra186_wdt_driver); diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti-dm.c index 3666d94cc8dd..e9e32df6b566 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -1295,7 +1295,7 @@ MODULE_DEVICE_TABLE(of, omap_timer_match);  static struct platform_driver omap_dm_timer_driver = {  	.probe  = omap_dm_timer_probe, -	.remove_new = omap_dm_timer_remove, +	.remove = omap_dm_timer_remove,  	.driver = {  		.name   = "omap_timer",  		.of_match_table = omap_timer_match, diff --git a/drivers/counter/104-quad-8.c b/drivers/counter/104-quad-8.c index 4a6868b8f58b..ce81fc4e1ae7 100644 --- a/drivers/counter/104-quad-8.c +++ b/drivers/counter/104-quad-8.c @@ -1360,4 +1360,4 @@ module_isa_driver_with_irq(quad8_driver, num_quad8, num_irq);  MODULE_AUTHOR("William Breathitt Gray <vilhelm.gray@gmail.com>");  MODULE_DESCRIPTION("ACCES 104-QUAD-8 driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/counter-chrdev.c b/drivers/counter/counter-chrdev.c index 3ee75e1a78cd..23fdf0caf712 100644 --- a/drivers/counter/counter-chrdev.c +++ b/drivers/counter/counter-chrdev.c @@ -672,4 +672,4 @@ exit_early:  	if (copied)  		wake_up_poll(&counter->events_wait, EPOLLIN);  } -EXPORT_SYMBOL_NS_GPL(counter_push_event, COUNTER); +EXPORT_SYMBOL_NS_GPL(counter_push_event, "COUNTER"); diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c index 893b4f0726d2..50bd30ba3d03 100644 --- a/drivers/counter/counter-core.c +++ b/drivers/counter/counter-core.c @@ -74,7 +74,7 @@ void *counter_priv(const struct counter_device *const counter)  	return &ch->privdata;  } -EXPORT_SYMBOL_NS_GPL(counter_priv, COUNTER); +EXPORT_SYMBOL_NS_GPL(counter_priv, "COUNTER");  /**   * counter_alloc - allocate a counter_device @@ -134,13 +134,13 @@ err_ida_alloc:  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(counter_alloc, COUNTER); +EXPORT_SYMBOL_NS_GPL(counter_alloc, "COUNTER");  void counter_put(struct counter_device *counter)  {  	put_device(&counter->dev);  } -EXPORT_SYMBOL_NS_GPL(counter_put, COUNTER); +EXPORT_SYMBOL_NS_GPL(counter_put, "COUNTER");  /**   * counter_add - complete registration of a counter @@ -167,7 +167,7 @@ int counter_add(struct counter_device *counter)  	/* implies device_add(dev) */  	return cdev_device_add(&counter->chrdev, dev);  } -EXPORT_SYMBOL_NS_GPL(counter_add, COUNTER); +EXPORT_SYMBOL_NS_GPL(counter_add, "COUNTER");  /**   * counter_unregister - unregister Counter from the system @@ -189,7 +189,7 @@ void counter_unregister(struct counter_device *const counter)  	mutex_unlock(&counter->ops_exist_lock);  } -EXPORT_SYMBOL_NS_GPL(counter_unregister, COUNTER); +EXPORT_SYMBOL_NS_GPL(counter_unregister, "COUNTER");  static void devm_counter_release(void *counter)  { @@ -224,7 +224,7 @@ struct counter_device *devm_counter_alloc(struct device *dev, size_t sizeof_priv  	return counter;  } -EXPORT_SYMBOL_NS_GPL(devm_counter_alloc, COUNTER); +EXPORT_SYMBOL_NS_GPL(devm_counter_alloc, "COUNTER");  /**   * devm_counter_add - complete registration of a counter @@ -245,7 +245,7 @@ int devm_counter_add(struct device *dev,  	return devm_add_action_or_reset(dev, devm_counter_release, counter);  } -EXPORT_SYMBOL_NS_GPL(devm_counter_add, COUNTER); +EXPORT_SYMBOL_NS_GPL(devm_counter_add, "COUNTER");  #define COUNTER_DEV_MAX 256 diff --git a/drivers/counter/ftm-quaddec.c b/drivers/counter/ftm-quaddec.c index 6ac4efb5658b..c47741292ae1 100644 --- a/drivers/counter/ftm-quaddec.c +++ b/drivers/counter/ftm-quaddec.c @@ -327,4 +327,4 @@ MODULE_DESCRIPTION("Flex Timer Module Quadrature decoder");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Kjeld Flarup <kfa@deif.com>");  MODULE_AUTHOR("Patrick Havelange <patrick.havelange@essensium.com>"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/i8254.c b/drivers/counter/i8254.c index 6d74e8ef92f0..95ad928725ec 100644 --- a/drivers/counter/i8254.c +++ b/drivers/counter/i8254.c @@ -439,9 +439,9 @@ int devm_i8254_regmap_register(struct device *const dev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(devm_i8254_regmap_register, I8254); +EXPORT_SYMBOL_NS_GPL(devm_i8254_regmap_register, "I8254");  MODULE_AUTHOR("William Breathitt Gray");  MODULE_DESCRIPTION("Intel 8254 Programmable Interval Timer");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/intel-qep.c b/drivers/counter/intel-qep.c index ee2bae27b728..c49c178056f4 100644 --- a/drivers/counter/intel-qep.c +++ b/drivers/counter/intel-qep.c @@ -519,4 +519,4 @@ MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@linux.intel.com>");  MODULE_AUTHOR("Raymond Tan <raymond.tan@intel.com>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Intel Quadrature Encoder Peripheral driver"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/interrupt-cnt.c b/drivers/counter/interrupt-cnt.c index 229473855c5b..949598d51575 100644 --- a/drivers/counter/interrupt-cnt.c +++ b/drivers/counter/interrupt-cnt.c @@ -253,4 +253,4 @@ MODULE_ALIAS("platform:interrupt-counter");  MODULE_AUTHOR("Oleksij Rempel <o.rempel@pengutronix.de>");  MODULE_DESCRIPTION("Interrupt counter driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/microchip-tcb-capture.c b/drivers/counter/microchip-tcb-capture.c index b3e615cbd2ca..2f096a5b973d 100644 --- a/drivers/counter/microchip-tcb-capture.c +++ b/drivers/counter/microchip-tcb-capture.c @@ -403,4 +403,4 @@ module_platform_driver(mchp_tc_driver);  MODULE_AUTHOR("Kamel Bouhara <kamel.bouhara@bootlin.com>");  MODULE_DESCRIPTION("Microchip TCB Capture driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/rz-mtu3-cnt.c b/drivers/counter/rz-mtu3-cnt.c index ee821493b166..e755d54dfece 100644 --- a/drivers/counter/rz-mtu3-cnt.c +++ b/drivers/counter/rz-mtu3-cnt.c @@ -903,4 +903,4 @@ MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");  MODULE_ALIAS("platform:rz-mtu3-counter");  MODULE_DESCRIPTION("Renesas RZ/G2L MTU3a counter driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/stm32-lptimer-cnt.c b/drivers/counter/stm32-lptimer-cnt.c index 8439755559b2..cf73f65baf60 100644 --- a/drivers/counter/stm32-lptimer-cnt.c +++ b/drivers/counter/stm32-lptimer-cnt.c @@ -520,4 +520,4 @@ MODULE_AUTHOR("Fabrice Gasnier <fabrice.gasnier@st.com>");  MODULE_ALIAS("platform:stm32-lptimer-counter");  MODULE_DESCRIPTION("STMicroelectronics STM32 LPTIM counter driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/stm32-timer-cnt.c b/drivers/counter/stm32-timer-cnt.c index 87b6ec567b54..e75b69476a00 100644 --- a/drivers/counter/stm32-timer-cnt.c +++ b/drivers/counter/stm32-timer-cnt.c @@ -864,4 +864,4 @@ MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");  MODULE_ALIAS("platform:stm32-timer-counter");  MODULE_DESCRIPTION("STMicroelectronics STM32 TIMER counter driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/ti-ecap-capture.c b/drivers/counter/ti-ecap-capture.c index b119aeede693..3faaf7f60539 100644 --- a/drivers/counter/ti-ecap-capture.c +++ b/drivers/counter/ti-ecap-capture.c @@ -603,7 +603,7 @@ MODULE_DEVICE_TABLE(of, ecap_cnt_of_match);  static struct platform_driver ecap_cnt_driver = {  	.probe = ecap_cnt_probe, -	.remove_new = ecap_cnt_remove, +	.remove = ecap_cnt_remove,  	.driver = {  		.name = "ecap-capture",  		.of_match_table = ecap_cnt_of_match, @@ -615,4 +615,4 @@ module_platform_driver(ecap_cnt_driver);  MODULE_DESCRIPTION("ECAP Capture driver");  MODULE_AUTHOR("Julien Panis <jpanis@baylibre.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/counter/ti-eqep.c b/drivers/counter/ti-eqep.c index 313b91456f26..bc586eff0dae 100644 --- a/drivers/counter/ti-eqep.c +++ b/drivers/counter/ti-eqep.c @@ -548,7 +548,7 @@ MODULE_DEVICE_TABLE(of, ti_eqep_of_match);  static struct platform_driver ti_eqep_driver = {  	.probe = ti_eqep_probe, -	.remove_new = ti_eqep_remove, +	.remove = ti_eqep_remove,  	.driver = {  		.name = "ti-eqep-cnt",  		.of_match_table = ti_eqep_of_match, @@ -559,4 +559,4 @@ module_platform_driver(ti_eqep_driver);  MODULE_AUTHOR("David Lechner <david@lechnology.com>");  MODULE_DESCRIPTION("TI eQEP counter driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(COUNTER); +MODULE_IMPORT_NS("COUNTER"); diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index 92a83a9bb2e1..26e98fea991a 100644 --- a/drivers/cpufreq/Kconfig +++ b/drivers/cpufreq/Kconfig @@ -325,8 +325,6 @@ config QORIQ_CPUFREQ  	  This adds the CPUFreq driver support for Freescale QorIQ SoCs  	  which are capable of changing the CPU's frequency dynamically. -endif -  config ACPI_CPPC_CPUFREQ  	tristate "CPUFreq driver based on the ACPI CPPC spec"  	depends on ACPI_PROCESSOR @@ -355,4 +353,6 @@ config ACPI_CPPC_CPUFREQ_FIE  	  If in doubt, say N. +endif +  endmenu diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index d7630bab2516..66e5dfc711c0 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -374,15 +374,19 @@ static inline int amd_pstate_cppc_enable(bool enable)  static int msr_init_perf(struct amd_cpudata *cpudata)  { -	u64 cap1; +	u64 cap1, numerator;  	int ret = rdmsrl_safe_on_cpu(cpudata->cpu, MSR_AMD_CPPC_CAP1,  				     &cap1);  	if (ret)  		return ret; -	WRITE_ONCE(cpudata->highest_perf, AMD_CPPC_HIGHEST_PERF(cap1)); -	WRITE_ONCE(cpudata->max_limit_perf, AMD_CPPC_HIGHEST_PERF(cap1)); +	ret = amd_get_boost_ratio_numerator(cpudata->cpu, &numerator); +	if (ret) +		return ret; + +	WRITE_ONCE(cpudata->highest_perf, numerator); +	WRITE_ONCE(cpudata->max_limit_perf, numerator);  	WRITE_ONCE(cpudata->nominal_perf, AMD_CPPC_NOMINAL_PERF(cap1));  	WRITE_ONCE(cpudata->lowest_nonlinear_perf, AMD_CPPC_LOWNONLIN_PERF(cap1));  	WRITE_ONCE(cpudata->lowest_perf, AMD_CPPC_LOWEST_PERF(cap1)); @@ -394,13 +398,18 @@ static int msr_init_perf(struct amd_cpudata *cpudata)  static int shmem_init_perf(struct amd_cpudata *cpudata)  {  	struct cppc_perf_caps cppc_perf; +	u64 numerator;  	int ret = cppc_get_perf_caps(cpudata->cpu, &cppc_perf);  	if (ret)  		return ret; -	WRITE_ONCE(cpudata->highest_perf, cppc_perf.highest_perf); -	WRITE_ONCE(cpudata->max_limit_perf, cppc_perf.highest_perf); +	ret = amd_get_boost_ratio_numerator(cpudata->cpu, &numerator); +	if (ret) +		return ret; + +	WRITE_ONCE(cpudata->highest_perf, numerator); +	WRITE_ONCE(cpudata->max_limit_perf, numerator);  	WRITE_ONCE(cpudata->nominal_perf, cppc_perf.nominal_perf);  	WRITE_ONCE(cpudata->lowest_nonlinear_perf,  		   cppc_perf.lowest_nonlinear_perf); @@ -561,16 +570,13 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy_data)  static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)  { -	u32 max_limit_perf, min_limit_perf, lowest_perf, max_perf; +	u32 max_limit_perf, min_limit_perf, lowest_perf, max_perf, max_freq;  	struct amd_cpudata *cpudata = policy->driver_data; -	if (cpudata->boost_supported && !policy->boost_enabled) -		max_perf = READ_ONCE(cpudata->nominal_perf); -	else -		max_perf = READ_ONCE(cpudata->highest_perf); - -	max_limit_perf = div_u64(policy->max * max_perf, policy->cpuinfo.max_freq); -	min_limit_perf = div_u64(policy->min * max_perf, policy->cpuinfo.max_freq); +	max_perf = READ_ONCE(cpudata->highest_perf); +	max_freq = READ_ONCE(cpudata->max_freq); +	max_limit_perf = div_u64(policy->max * max_perf, max_freq); +	min_limit_perf = div_u64(policy->min * max_perf, max_freq);  	lowest_perf = READ_ONCE(cpudata->lowest_perf);  	if (min_limit_perf < lowest_perf) @@ -889,7 +895,6 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)  {  	int ret;  	u32 min_freq, max_freq; -	u64 numerator;  	u32 nominal_perf, nominal_freq;  	u32 lowest_nonlinear_perf, lowest_nonlinear_freq;  	u32 boost_ratio, lowest_nonlinear_ratio; @@ -911,10 +916,7 @@ static int amd_pstate_init_freq(struct amd_cpudata *cpudata)  	nominal_perf = READ_ONCE(cpudata->nominal_perf); -	ret = amd_get_boost_ratio_numerator(cpudata->cpu, &numerator); -	if (ret) -		return ret; -	boost_ratio = div_u64(numerator << SCHED_CAPACITY_SHIFT, nominal_perf); +	boost_ratio = div_u64(cpudata->highest_perf << SCHED_CAPACITY_SHIFT, nominal_perf);  	max_freq = (nominal_freq * boost_ratio >> SCHED_CAPACITY_SHIFT) * 1000;  	lowest_nonlinear_perf = READ_ONCE(cpudata->lowest_nonlinear_perf); @@ -1869,18 +1871,18 @@ static int __init amd_pstate_init(void)  		static_call_update(amd_pstate_update_perf, shmem_update_perf);  	} -	ret = amd_pstate_register_driver(cppc_state); -	if (ret) { -		pr_err("failed to register with return %d\n", ret); -		return ret; -	} -  	if (amd_pstate_prefcore) {  		ret = amd_detect_prefcore(&amd_pstate_prefcore);  		if (ret)  			return ret;  	} +	ret = amd_pstate_register_driver(cppc_state); +	if (ret) { +		pr_err("failed to register with return %d\n", ret); +		return ret; +	} +  	dev_root = bus_get_dev_root(&cpu_subsys);  	if (dev_root) {  		ret = sysfs_create_group(&dev_root->kobj, &amd_pstate_global_attr_group); diff --git a/drivers/cpuidle/cpuidle-kirkwood.c b/drivers/cpuidle/cpuidle-kirkwood.c index 602c4dfdd7e2..5235e6e8f360 100644 --- a/drivers/cpuidle/cpuidle-kirkwood.c +++ b/drivers/cpuidle/cpuidle-kirkwood.c @@ -66,7 +66,7 @@ static void kirkwood_cpuidle_remove(struct platform_device *pdev)  static struct platform_driver kirkwood_cpuidle_driver = {  	.probe = kirkwood_cpuidle_probe, -	.remove_new = kirkwood_cpuidle_remove, +	.remove = kirkwood_cpuidle_remove,  	.driver = {  		   .name = "kirkwood_cpuidle",  		   }, diff --git a/drivers/cpuidle/cpuidle-riscv-sbi.c b/drivers/cpuidle/cpuidle-riscv-sbi.c index 14462c092039..0c92a628bbd4 100644 --- a/drivers/cpuidle/cpuidle-riscv-sbi.c +++ b/drivers/cpuidle/cpuidle-riscv-sbi.c @@ -504,12 +504,12 @@ static int sbi_cpuidle_probe(struct platform_device *pdev)  	int cpu, ret;  	struct cpuidle_driver *drv;  	struct cpuidle_device *dev; -	struct device_node *np, *pds_node; +	struct device_node *pds_node;  	/* Detect OSI support based on CPU DT nodes */  	sbi_cpuidle_use_osi = true;  	for_each_possible_cpu(cpu) { -		np = of_cpu_device_node_get(cpu); +		struct device_node *np __free(device_node) = of_cpu_device_node_get(cpu);  		if (np &&  		    of_property_present(np, "power-domains") &&  		    of_property_present(np, "power-domain-names")) { diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c index f2992f92d8db..173ddcac540a 100644 --- a/drivers/cpuidle/governors/teo.c +++ b/drivers/cpuidle/governors/teo.c @@ -10,25 +10,27 @@   * DOC: teo-description   *   * The idea of this governor is based on the observation that on many systems - * timer events are two or more orders of magnitude more frequent than any - * other interrupts, so they are likely to be the most significant cause of CPU - * wakeups from idle states.  Moreover, information about what happened in the - * (relatively recent) past can be used to estimate whether or not the deepest - * idle state with target residency within the (known) time till the closest - * timer event, referred to as the sleep length, is likely to be suitable for - * the upcoming CPU idle period and, if not, then which of the shallower idle - * states to choose instead of it. + * timer interrupts are two or more orders of magnitude more frequent than any + * other interrupt types, so they are likely to dominate CPU wakeup patterns. + * Moreover, in principle, the time when the next timer event is going to occur + * can be determined at the idle state selection time, although doing that may + * be costly, so it can be regarded as the most reliable source of information + * for idle state selection.   * - * Of course, non-timer wakeup sources are more important in some use cases - * which can be covered by taking a few most recent idle time intervals of the - * CPU into account.  However, even in that context it is not necessary to - * consider idle duration values greater than the sleep length, because the - * closest timer will ultimately wake up the CPU anyway unless it is woken up - * earlier. + * Of course, non-timer wakeup sources are more important in some use cases, + * but even then it is generally unnecessary to consider idle duration values + * greater than the time time till the next timer event, referred as the sleep + * length in what follows, because the closest timer will ultimately wake up the + * CPU anyway unless it is woken up earlier.   * - * Thus this governor estimates whether or not the prospective idle duration of - * a CPU is likely to be significantly shorter than the sleep length and selects - * an idle state for it accordingly. + * However, since obtaining the sleep length may be costly, the governor first + * checks if it can select a shallow idle state using wakeup pattern information + * from recent times, in which case it can do without knowing the sleep length + * at all.  For this purpose, it counts CPU wakeup events and looks for an idle + * state whose target residency has not exceeded the idle duration (measured + * after wakeup) in the majority of relevant recent cases.  If the target + * residency of that state is small enough, it may be used right away and the + * sleep length need not be determined.   *   * The computations carried out by this governor are based on using bins whose   * boundaries are aligned with the target residency parameter values of the CPU @@ -39,7 +41,11 @@   * idle state 2, the third bin spans from the target residency of idle state 2   * up to, but not including, the target residency of idle state 3 and so on.   * The last bin spans from the target residency of the deepest idle state - * supplied by the driver to infinity. + * supplied by the driver to the scheduler tick period length or to infinity if + * the tick period length is less than the target residency of that state.  In + * the latter case, the governor also counts events with the measured idle + * duration between the tick period length and the target residency of the + * deepest idle state.   *   * Two metrics called "hits" and "intercepts" are associated with each bin.   * They are updated every time before selecting an idle state for the given CPU @@ -49,47 +55,46 @@   * sleep length and the idle duration measured after CPU wakeup fall into the   * same bin (that is, the CPU appears to wake up "on time" relative to the sleep   * length).  In turn, the "intercepts" metric reflects the relative frequency of - * situations in which the measured idle duration is so much shorter than the - * sleep length that the bin it falls into corresponds to an idle state - * shallower than the one whose bin is fallen into by the sleep length (these - * situations are referred to as "intercepts" below). + * non-timer wakeup events for which the measured idle duration falls into a bin + * that corresponds to an idle state shallower than the one whose bin is fallen + * into by the sleep length (these events are also referred to as "intercepts" + * below).   *   * In order to select an idle state for a CPU, the governor takes the following   * steps (modulo the possible latency constraint that must be taken into account   * too):   * - * 1. Find the deepest CPU idle state whose target residency does not exceed - *    the current sleep length (the candidate idle state) and compute 2 sums as - *    follows: + * 1. Find the deepest enabled CPU idle state (the candidate idle state) and + *    compute 2 sums as follows:   * - *    - The sum of the "hits" and "intercepts" metrics for the candidate state - *      and all of the deeper idle states (it represents the cases in which the - *      CPU was idle long enough to avoid being intercepted if the sleep length - *      had been equal to the current one). + *    - The sum of the "hits" metric for all of the idle states shallower than + *      the candidate one (it represents the cases in which the CPU was likely + *      woken up by a timer).   * - *    - The sum of the "intercepts" metrics for all of the idle states shallower - *      than the candidate one (it represents the cases in which the CPU was not - *      idle long enough to avoid being intercepted if the sleep length had been - *      equal to the current one). + *    - The sum of the "intercepts" metric for all of the idle states shallower + *      than the candidate one (it represents the cases in which the CPU was + *      likely woken up by a non-timer wakeup source).   * - * 2. If the second sum is greater than the first one the CPU is likely to wake - *    up early, so look for an alternative idle state to select. + * 2. If the second sum computed in step 1 is greater than a half of the sum of + *    both metrics for the candidate state bin and all subsequent bins(if any), + *    a shallower idle state is likely to be more suitable, so look for it.   * - *    - Traverse the idle states shallower than the candidate one in the + *    - Traverse the enabled idle states shallower than the candidate one in the   *      descending order.   *   *    - For each of them compute the sum of the "intercepts" metrics over all   *      of the idle states between it and the candidate one (including the   *      former and excluding the latter).   * - *    - If each of these sums that needs to be taken into account (because the - *      check related to it has indicated that the CPU is likely to wake up - *      early) is greater than a half of the corresponding sum computed in step - *      1 (which means that the target residency of the state in question had - *      not exceeded the idle duration in over a half of the relevant cases), - *      select the given idle state instead of the candidate one. + *    - If this sum is greater than a half of the second sum computed in step 1, + *      use the given idle state as the new candidate one.   * - * 3. By default, select the candidate state. + * 3. If the current candidate state is state 0 or its target residency is short + *    enough, return it and prevent the scheduler tick from being stopped. + * + * 4. Obtain the sleep length value and check if it is below the target + *    residency of the current candidate state, in which case a new shallower + *    candidate state needs to be found, so look for it.   */  #include <linux/cpuidle.h> diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c index af018afd9cd7..2e87ca0e292a 100644 --- a/drivers/crypto/ccp/sev-dev.c +++ b/drivers/crypto/ccp/sev-dev.c @@ -249,7 +249,7 @@ static struct file *open_file_as_root(const char *filename, int flags, umode_t m  	fp = file_open_root(&root, filename, flags, mode);  	path_put(&root); -	revert_creds(old_cred); +	put_cred(revert_creds(old_cred));  	return fp;  } diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c index fa5a9f207bc9..d933f26aeb3a 100644 --- a/drivers/crypto/geode-aes.c +++ b/drivers/crypto/geode-aes.c @@ -433,4 +433,4 @@ module_pci_driver(geode_aes_driver);  MODULE_AUTHOR("Advanced Micro Devices, Inc.");  MODULE_DESCRIPTION("Geode LX Hardware AES driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CRYPTO_INTERNAL); +MODULE_IMPORT_NS("CRYPTO_INTERNAL"); diff --git a/drivers/crypto/hisilicon/debugfs.c b/drivers/crypto/hisilicon/debugfs.c index 1b9b7bccdeff..45e130b901eb 100644 --- a/drivers/crypto/hisilicon/debugfs.c +++ b/drivers/crypto/hisilicon/debugfs.c @@ -192,7 +192,7 @@ static int qm_sqc_dump(struct hisi_qm *qm, char *s, char *name)  	down_read(&qm->qps_lock);  	if (qm->sqc) { -		memcpy(&sqc, qm->sqc + qp_id * sizeof(struct qm_sqc), sizeof(struct qm_sqc)); +		memcpy(&sqc, qm->sqc + qp_id, sizeof(struct qm_sqc));  		sqc.base_h = cpu_to_le32(QM_XQC_ADDR_MASK);  		sqc.base_l = cpu_to_le32(QM_XQC_ADDR_MASK);  		dump_show(qm, &sqc, sizeof(struct qm_sqc), "SOFT SQC"); @@ -229,7 +229,7 @@ static int qm_cqc_dump(struct hisi_qm *qm, char *s, char *name)  	down_read(&qm->qps_lock);  	if (qm->cqc) { -		memcpy(&cqc, qm->cqc + qp_id * sizeof(struct qm_cqc), sizeof(struct qm_cqc)); +		memcpy(&cqc, qm->cqc + qp_id, sizeof(struct qm_cqc));  		cqc.base_h = cpu_to_le32(QM_XQC_ADDR_MASK);  		cqc.base_l = cpu_to_le32(QM_XQC_ADDR_MASK);  		dump_show(qm, &cqc, sizeof(struct qm_cqc), "SOFT CQC"); diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c index 45758c7aa80e..9ca80d082c4f 100644 --- a/drivers/crypto/inside-secure/safexcel.c +++ b/drivers/crypto/inside-secure/safexcel.c @@ -2031,7 +2031,7 @@ MODULE_AUTHOR("Ofer Heifetz <oferh@marvell.com>");  MODULE_AUTHOR("Igal Liberman <igall@marvell.com>");  MODULE_DESCRIPTION("Support for SafeXcel cryptographic engines: EIP97 & EIP197");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(CRYPTO_INTERNAL); +MODULE_IMPORT_NS("CRYPTO_INTERNAL");  MODULE_FIRMWARE("ifpp.bin");  MODULE_FIRMWARE("ipue.bin"); diff --git a/drivers/crypto/intel/iaa/Makefile b/drivers/crypto/intel/iaa/Makefile index b64b208d2344..55bda7770fac 100644 --- a/drivers/crypto/intel/iaa/Makefile +++ b/drivers/crypto/intel/iaa/Makefile @@ -3,7 +3,7 @@  # Makefile for IAA crypto device drivers  # -ccflags-y += -I $(srctree)/drivers/dma/idxd -DDEFAULT_SYMBOL_NAMESPACE=IDXD +ccflags-y += -I $(srctree)/drivers/dma/idxd -DDEFAULT_SYMBOL_NAMESPACE='"IDXD"'  obj-$(CONFIG_CRYPTO_DEV_IAA_CRYPTO) := iaa_crypto.o diff --git a/drivers/crypto/intel/iaa/iaa_crypto_main.c b/drivers/crypto/intel/iaa/iaa_crypto_main.c index 8fced88d3d06..9e557649e5d0 100644 --- a/drivers/crypto/intel/iaa/iaa_crypto_main.c +++ b/drivers/crypto/intel/iaa/iaa_crypto_main.c @@ -2094,7 +2094,7 @@ static void __exit iaa_crypto_cleanup_module(void)  	pr_debug("cleaned up\n");  } -MODULE_IMPORT_NS(IDXD); +MODULE_IMPORT_NS("IDXD");  MODULE_LICENSE("GPL");  MODULE_ALIAS_IDXD_DEVICE(0);  MODULE_AUTHOR("Intel Corporation"); diff --git a/drivers/crypto/intel/qat/qat_420xx/adf_drv.c b/drivers/crypto/intel/qat/qat_420xx/adf_drv.c index 788a11cdb34b..9589d60fb281 100644 --- a/drivers/crypto/intel/qat/qat_420xx/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_420xx/adf_drv.c @@ -204,4 +204,4 @@ MODULE_FIRMWARE(ADF_420XX_MMP);  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION);  MODULE_SOFTDEP("pre: crypto-intel_qat"); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c b/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c index 115eabfd1f6b..d7de1cad1335 100644 --- a/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_4xxx/adf_drv.c @@ -208,4 +208,4 @@ MODULE_FIRMWARE(ADF_402XX_MMP);  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION);  MODULE_SOFTDEP("pre: crypto-intel_qat"); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c b/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c index 4d18057745d4..caa53882fda6 100644 --- a/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_c3xxx/adf_drv.c @@ -252,4 +252,4 @@ MODULE_FIRMWARE(ADF_C3XXX_FW);  MODULE_FIRMWARE(ADF_C3XXX_MMP);  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c b/drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c index f0023cfb234c..c622793e94a8 100644 --- a/drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_c3xxxvf/adf_drv.c @@ -226,4 +226,4 @@ MODULE_LICENSE("Dual BSD/GPL");  MODULE_AUTHOR("Intel");  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_c62x/adf_drv.c b/drivers/crypto/intel/qat/qat_c62x/adf_drv.c index e6b5de55434e..b7398fee19ed 100644 --- a/drivers/crypto/intel/qat/qat_c62x/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_c62x/adf_drv.c @@ -252,4 +252,4 @@ MODULE_FIRMWARE(ADF_C62X_FW);  MODULE_FIRMWARE(ADF_C62X_MMP);  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c b/drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c index 2bd5b0ff00e3..4840d44bbd5b 100644 --- a/drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_c62xvf/adf_drv.c @@ -226,4 +226,4 @@ MODULE_LICENSE("Dual BSD/GPL");  MODULE_AUTHOR("Intel");  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_common/Makefile b/drivers/crypto/intel/qat/qat_common/Makefile index eac73cbfdd38..7acf9c576149 100644 --- a/drivers/crypto/intel/qat/qat_common/Makefile +++ b/drivers/crypto/intel/qat/qat_common/Makefile @@ -1,6 +1,6 @@  # SPDX-License-Identifier: GPL-2.0  obj-$(CONFIG_CRYPTO_DEV_QAT) += intel_qat.o -ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=CRYPTO_QAT +ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"CRYPTO_QAT"'  intel_qat-objs := adf_cfg.o \  	adf_isr.o \  	adf_ctl_drv.o \ diff --git a/drivers/crypto/intel/qat/qat_common/adf_ctl_drv.c b/drivers/crypto/intel/qat/qat_common/adf_ctl_drv.c index 70fa0f6497a9..48c62a14a6a7 100644 --- a/drivers/crypto/intel/qat/qat_common/adf_ctl_drv.c +++ b/drivers/crypto/intel/qat/qat_common/adf_ctl_drv.c @@ -475,4 +475,4 @@ MODULE_AUTHOR("Intel");  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_ALIAS_CRYPTO("intel_qat");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_INTERNAL); +MODULE_IMPORT_NS("CRYPTO_INTERNAL"); diff --git a/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c b/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c index 2a50cce41515..3137fc3b5cf6 100644 --- a/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_dh895xcc/adf_drv.c @@ -252,4 +252,4 @@ MODULE_FIRMWARE(ADF_DH895XCC_FW);  MODULE_FIRMWARE(ADF_DH895XCC_MMP);  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c b/drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c index 7cb015b55122..7cd528ee31e7 100644 --- a/drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c +++ b/drivers/crypto/intel/qat/qat_dh895xccvf/adf_drv.c @@ -226,4 +226,4 @@ MODULE_LICENSE("Dual BSD/GPL");  MODULE_AUTHOR("Intel");  MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");  MODULE_VERSION(ADF_DRV_VERSION); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/crypto/marvell/octeontx2/cn10k_cpt.c b/drivers/crypto/marvell/octeontx2/cn10k_cpt.c index 6bfc59e67747..5cae8fafa151 100644 --- a/drivers/crypto/marvell/octeontx2/cn10k_cpt.c +++ b/drivers/crypto/marvell/octeontx2/cn10k_cpt.c @@ -73,7 +73,7 @@ int cn10k_cptpf_lmtst_init(struct otx2_cptpf_dev *cptpf)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cn10k_cptpf_lmtst_init, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cn10k_cptpf_lmtst_init, "CRYPTO_DEV_OCTEONTX2_CPT");  int cn10k_cptvf_lmtst_init(struct otx2_cptvf_dev *cptvf)  { @@ -94,7 +94,7 @@ int cn10k_cptvf_lmtst_init(struct otx2_cptvf_dev *cptvf)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cn10k_cptvf_lmtst_init, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cn10k_cptvf_lmtst_init, "CRYPTO_DEV_OCTEONTX2_CPT");  void cn10k_cpt_hw_ctx_clear(struct pci_dev *pdev,  			    struct cn10k_cpt_errata_ctx *er_ctx) @@ -110,7 +110,7 @@ void cn10k_cpt_hw_ctx_clear(struct pci_dev *pdev,  			 DMA_BIDIRECTIONAL);  	kfree(er_ctx->hw_ctx);  } -EXPORT_SYMBOL_NS_GPL(cn10k_cpt_hw_ctx_clear, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cn10k_cpt_hw_ctx_clear, "CRYPTO_DEV_OCTEONTX2_CPT");  void cn10k_cpt_hw_ctx_set(union cn10k_cpt_hw_ctx *hctx, u16 ctx_sz)  { @@ -119,7 +119,7 @@ void cn10k_cpt_hw_ctx_set(union cn10k_cpt_hw_ctx *hctx, u16 ctx_sz)  	hctx->w0.ctx_sz = ctx_sz;  	hctx->w0.ctx_push_sz = 1;  } -EXPORT_SYMBOL_NS_GPL(cn10k_cpt_hw_ctx_set, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cn10k_cpt_hw_ctx_set, "CRYPTO_DEV_OCTEONTX2_CPT");  int cn10k_cpt_hw_ctx_init(struct pci_dev *pdev,  			  struct cn10k_cpt_errata_ctx *er_ctx) @@ -149,7 +149,7 @@ int cn10k_cpt_hw_ctx_init(struct pci_dev *pdev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cn10k_cpt_hw_ctx_init, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cn10k_cpt_hw_ctx_init, "CRYPTO_DEV_OCTEONTX2_CPT");  void cn10k_cpt_ctx_flush(struct pci_dev *pdev, u64 cptr, bool inval)  { @@ -168,7 +168,7 @@ void cn10k_cpt_ctx_flush(struct pci_dev *pdev, u64 cptr, bool inval)  	otx2_cpt_read64(lfs->reg_base, lfs->blkaddr, lfs->lf[0].slot,  			OTX2_CPT_LF_CTX_ERR);  } -EXPORT_SYMBOL_NS_GPL(cn10k_cpt_ctx_flush, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cn10k_cpt_ctx_flush, "CRYPTO_DEV_OCTEONTX2_CPT");  void cptvf_hw_ops_get(struct otx2_cptvf_dev *cptvf)  { @@ -177,4 +177,4 @@ void cptvf_hw_ops_get(struct otx2_cptvf_dev *cptvf)  	else  		cptvf->lfs.ops = &otx2_hw_ops;  } -EXPORT_SYMBOL_NS_GPL(cptvf_hw_ops_get, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(cptvf_hw_ops_get, "CRYPTO_DEV_OCTEONTX2_CPT"); diff --git a/drivers/crypto/marvell/octeontx2/otx2_cpt_mbox_common.c b/drivers/crypto/marvell/octeontx2/otx2_cpt_mbox_common.c index 5be0103c1fb8..b8b7c8a3c0ca 100644 --- a/drivers/crypto/marvell/octeontx2/otx2_cpt_mbox_common.c +++ b/drivers/crypto/marvell/octeontx2/otx2_cpt_mbox_common.c @@ -19,7 +19,7 @@ int otx2_cpt_send_mbox_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)  	}  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_mbox_msg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_mbox_msg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_send_ready_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)  { @@ -37,13 +37,13 @@ int otx2_cpt_send_ready_msg(struct otx2_mbox *mbox, struct pci_dev *pdev)  	return otx2_cpt_send_mbox_msg(mbox, pdev);  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_ready_msg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_ready_msg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_send_af_reg_requests(struct otx2_mbox *mbox, struct pci_dev *pdev)  {  	return otx2_cpt_send_mbox_msg(mbox, pdev);  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_af_reg_requests, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_send_af_reg_requests, "CRYPTO_DEV_OCTEONTX2_CPT");  static int otx2_cpt_add_read_af_reg(struct otx2_mbox *mbox,  				    struct pci_dev *pdev, u64 reg, @@ -95,7 +95,7 @@ int otx2_cpt_add_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_add_write_af_reg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_add_write_af_reg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,  			 u64 reg, u64 *val, int blkaddr) @@ -108,7 +108,7 @@ int otx2_cpt_read_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,  	return otx2_cpt_send_mbox_msg(mbox, pdev);  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_read_af_reg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_read_af_reg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,  			  u64 reg, u64 val, int blkaddr) @@ -121,7 +121,7 @@ int otx2_cpt_write_af_reg(struct otx2_mbox *mbox, struct pci_dev *pdev,  	return otx2_cpt_send_mbox_msg(mbox, pdev);  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_write_af_reg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_write_af_reg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_attach_rscrs_msg(struct otx2_cptlfs_info *lfs)  { @@ -180,7 +180,7 @@ int otx2_cpt_detach_rsrcs_msg(struct otx2_cptlfs_info *lfs)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_detach_rsrcs_msg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_detach_rsrcs_msg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info *lfs)  { @@ -213,7 +213,7 @@ int otx2_cpt_msix_offset_msg(struct otx2_cptlfs_info *lfs)  	}  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_msix_offset_msg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_msix_offset_msg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_sync_mbox_msg(struct otx2_mbox *mbox)  { @@ -228,7 +228,7 @@ int otx2_cpt_sync_mbox_msg(struct otx2_mbox *mbox)  	return otx2_mbox_check_rsp_msgs(mbox, 0);  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_sync_mbox_msg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_sync_mbox_msg, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cpt_lf_reset_msg(struct otx2_cptlfs_info *lfs, int slot)  { @@ -254,4 +254,4 @@ int otx2_cpt_lf_reset_msg(struct otx2_cptlfs_info *lfs, int slot)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cpt_lf_reset_msg, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cpt_lf_reset_msg, "CRYPTO_DEV_OCTEONTX2_CPT"); diff --git a/drivers/crypto/marvell/octeontx2/otx2_cptlf.c b/drivers/crypto/marvell/octeontx2/otx2_cptlf.c index b52728e3c0d1..b5d66afcc030 100644 --- a/drivers/crypto/marvell/octeontx2/otx2_cptlf.c +++ b/drivers/crypto/marvell/octeontx2/otx2_cptlf.c @@ -288,8 +288,7 @@ void otx2_cptlf_unregister_misc_interrupts(struct otx2_cptlfs_info *lfs)  	cptlf_set_misc_intrs(lfs, false);  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_unregister_misc_interrupts, -		     CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_unregister_misc_interrupts, "CRYPTO_DEV_OCTEONTX2_CPT");  void otx2_cptlf_unregister_done_interrupts(struct otx2_cptlfs_info *lfs)  { @@ -308,8 +307,7 @@ void otx2_cptlf_unregister_done_interrupts(struct otx2_cptlfs_info *lfs)  	cptlf_set_done_intrs(lfs, false);  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_unregister_done_interrupts, -		     CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_unregister_done_interrupts, "CRYPTO_DEV_OCTEONTX2_CPT");  static int cptlf_do_register_interrrupts(struct otx2_cptlfs_info *lfs,  					 int lf_num, int irq_offset, @@ -351,8 +349,7 @@ free_irq:  	otx2_cptlf_unregister_misc_interrupts(lfs);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_register_misc_interrupts, -		     CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_register_misc_interrupts, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cptlf_register_done_interrupts(struct otx2_cptlfs_info *lfs)  { @@ -375,8 +372,7 @@ free_irq:  	otx2_cptlf_unregister_done_interrupts(lfs);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_register_done_interrupts, -		     CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_register_done_interrupts, "CRYPTO_DEV_OCTEONTX2_CPT");  void otx2_cptlf_free_irqs_affinity(struct otx2_cptlfs_info *lfs)  { @@ -390,7 +386,7 @@ void otx2_cptlf_free_irqs_affinity(struct otx2_cptlfs_info *lfs)  		free_cpumask_var(lfs->lf[slot].affinity_mask);  	}  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_free_irqs_affinity, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_free_irqs_affinity, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cptlf_set_irqs_affinity(struct otx2_cptlfs_info *lfs)  { @@ -423,7 +419,7 @@ free_affinity_mask:  	otx2_cptlf_free_irqs_affinity(lfs);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_set_irqs_affinity, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_set_irqs_affinity, "CRYPTO_DEV_OCTEONTX2_CPT");  int otx2_cptlf_init(struct otx2_cptlfs_info *lfs, u8 eng_grp_mask, int pri,  		    int lfs_num) @@ -486,7 +482,7 @@ clear_lfs_num:  	lfs->lfs_num = 0;  	return ret;  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_init, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_init, "CRYPTO_DEV_OCTEONTX2_CPT");  void otx2_cptlf_shutdown(struct otx2_cptlfs_info *lfs)  { @@ -498,7 +494,7 @@ void otx2_cptlf_shutdown(struct otx2_cptlfs_info *lfs)  	otx2_cpt_detach_rsrcs_msg(lfs);  	lfs->lfs_num = 0;  } -EXPORT_SYMBOL_NS_GPL(otx2_cptlf_shutdown, CRYPTO_DEV_OCTEONTX2_CPT); +EXPORT_SYMBOL_NS_GPL(otx2_cptlf_shutdown, "CRYPTO_DEV_OCTEONTX2_CPT");  MODULE_AUTHOR("Marvell");  MODULE_DESCRIPTION("Marvell RVU CPT Common module"); diff --git a/drivers/crypto/marvell/octeontx2/otx2_cptpf_main.c b/drivers/crypto/marvell/octeontx2/otx2_cptpf_main.c index 94d0e73e42de..12971300296d 100644 --- a/drivers/crypto/marvell/octeontx2/otx2_cptpf_main.c +++ b/drivers/crypto/marvell/octeontx2/otx2_cptpf_main.c @@ -868,7 +868,7 @@ static struct pci_driver otx2_cpt_pci_driver = {  module_pci_driver(otx2_cpt_pci_driver); -MODULE_IMPORT_NS(CRYPTO_DEV_OCTEONTX2_CPT); +MODULE_IMPORT_NS("CRYPTO_DEV_OCTEONTX2_CPT");  MODULE_AUTHOR("Marvell");  MODULE_DESCRIPTION(OTX2_CPT_DRV_STRING); diff --git a/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c b/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c index d0b6ee901f62..d84eebdf2fa8 100644 --- a/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c +++ b/drivers/crypto/marvell/octeontx2/otx2_cptvf_main.c @@ -453,7 +453,7 @@ static struct pci_driver otx2_cptvf_pci_driver = {  module_pci_driver(otx2_cptvf_pci_driver); -MODULE_IMPORT_NS(CRYPTO_DEV_OCTEONTX2_CPT); +MODULE_IMPORT_NS("CRYPTO_DEV_OCTEONTX2_CPT");  MODULE_AUTHOR("Marvell");  MODULE_DESCRIPTION("Marvell RVU CPT Virtual Function Driver"); diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c index 432b7cfd12a8..cb14829bb9be 100644 --- a/drivers/cxl/acpi.c +++ b/drivers/cxl/acpi.c @@ -934,5 +934,5 @@ MODULE_SOFTDEP("pre: cxl_port");  module_exit(cxl_acpi_exit);  MODULE_DESCRIPTION("CXL ACPI: Platform Support");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(CXL); -MODULE_IMPORT_NS(ACPI); +MODULE_IMPORT_NS("CXL"); +MODULE_IMPORT_NS("ACPI"); diff --git a/drivers/cxl/core/cdat.c b/drivers/cxl/core/cdat.c index 2a1f164db98e..8153f8d83a16 100644 --- a/drivers/cxl/core/cdat.c +++ b/drivers/cxl/core/cdat.c @@ -416,7 +416,7 @@ void cxl_endpoint_parse_cdat(struct cxl_port *port)  	cxl_qos_class_verify(cxlmd);  	cxl_memdev_update_perf(cxlmd);  } -EXPORT_SYMBOL_NS_GPL(cxl_endpoint_parse_cdat, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_endpoint_parse_cdat, "CXL");  static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,  			       const unsigned long end) @@ -513,7 +513,7 @@ void cxl_switch_parse_cdat(struct cxl_port *port)  	if (rc)  		dev_dbg(&port->dev, "Failed to parse SSLBIS: %d\n", rc);  } -EXPORT_SYMBOL_NS_GPL(cxl_switch_parse_cdat, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_switch_parse_cdat, "CXL");  static void __cxl_coordinates_combine(struct access_coordinate *out,  				      struct access_coordinate *c1, @@ -545,7 +545,7 @@ void cxl_coordinates_combine(struct access_coordinate *out,  		__cxl_coordinates_combine(&out[i], &c1[i], &c2[i]);  } -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL");  static void cxl_bandwidth_add(struct access_coordinate *coord,  			      struct access_coordinate *c1, diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c index ff0c96ade241..28edd5822486 100644 --- a/drivers/cxl/core/hdm.c +++ b/drivers/cxl/core/hdm.c @@ -73,7 +73,7 @@ int devm_cxl_add_passthrough_decoder(struct cxl_port *port)  	return add_hdm_decoder(port, &cxlsd->cxld, single_port_map);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_passthrough_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_passthrough_decoder, "CXL");  static void parse_hdm_decoder_caps(struct cxl_hdm *cxlhdm)  { @@ -199,7 +199,7 @@ struct cxl_hdm *devm_cxl_setup_hdm(struct cxl_port *port,  	return cxlhdm;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_hdm, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_hdm, "CXL");  static void __cxl_dpa_debug(struct seq_file *file, struct resource *r, int depth)  { @@ -221,7 +221,7 @@ void cxl_dpa_debug(struct seq_file *file, struct cxl_dev_state *cxlds)  	}  	up_read(&cxl_dpa_rwsem);  } -EXPORT_SYMBOL_NS_GPL(cxl_dpa_debug, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_dpa_debug, "CXL");  /*   * Must be called in a context that synchronizes against this decoder's @@ -358,7 +358,7 @@ int devm_cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled,  	return devm_add_action_or_reset(&port->dev, cxl_dpa_release, cxled);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_dpa_reserve, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_dpa_reserve, "CXL");  resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled)  { @@ -738,7 +738,7 @@ void cxl_port_commit_reap(struct cxl_decoder *cxld)  	device_for_each_child_reverse_from(&port->dev, &cxld->dev, NULL,  					   commit_reap);  } -EXPORT_SYMBOL_NS_GPL(cxl_port_commit_reap, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_port_commit_reap, "CXL");  static void cxl_decoder_reset(struct cxl_decoder *cxld)  { @@ -1064,4 +1064,4 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_decoders, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_decoders, "CXL"); diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c index 5175138c4fb7..548564c770c0 100644 --- a/drivers/cxl/core/mbox.c +++ b/drivers/cxl/core/mbox.c @@ -281,7 +281,7 @@ int cxl_internal_send_cmd(struct cxl_mailbox *cxl_mbox,  		return -EIO;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_internal_send_cmd, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_internal_send_cmd, "CXL");  static bool cxl_mem_raw_command_allowed(u16 opcode)  { @@ -854,7 +854,7 @@ out:  	kvfree(gsl);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_enumerate_cmds, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_enumerate_cmds, "CXL");  void cxl_event_trace_record(const struct cxl_memdev *cxlmd,  			    enum cxl_event_log_type type, @@ -894,7 +894,7 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd,  			trace_cxl_dram(cxlmd, type, cxlr, hpa, &evt->dram);  	}  } -EXPORT_SYMBOL_NS_GPL(cxl_event_trace_record, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_event_trace_record, "CXL");  static void __cxl_event_trace_record(const struct cxl_memdev *cxlmd,  				     enum cxl_event_log_type type, @@ -1063,7 +1063,7 @@ void cxl_mem_get_event_records(struct cxl_memdev_state *mds, u32 status)  	if (status & CXLDEV_EVENT_STATUS_INFO)  		cxl_mem_get_records_log(mds, CXL_EVENT_TYPE_INFO);  } -EXPORT_SYMBOL_NS_GPL(cxl_mem_get_event_records, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mem_get_event_records, "CXL");  /**   * cxl_mem_get_partition_info - Get partition info @@ -1155,7 +1155,7 @@ int cxl_dev_state_identify(struct cxl_memdev_state *mds)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_dev_state_identify, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_dev_state_identify, "CXL");  static int __cxl_mem_sanitize(struct cxl_memdev_state *mds, u16 cmd)  { @@ -1306,7 +1306,7 @@ int cxl_mem_create_range_info(struct cxl_memdev_state *mds)  			   mds->active_volatile_bytes,  			   mds->active_persistent_bytes, "pmem");  } -EXPORT_SYMBOL_NS_GPL(cxl_mem_create_range_info, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mem_create_range_info, "CXL");  int cxl_set_timestamp(struct cxl_memdev_state *mds)  { @@ -1333,7 +1333,7 @@ int cxl_set_timestamp(struct cxl_memdev_state *mds)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_set_timestamp, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_set_timestamp, "CXL");  int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,  		       struct cxl_region *cxlr) @@ -1384,7 +1384,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,  	mutex_unlock(&mds->poison.lock);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_mem_get_poison, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mem_get_poison, "CXL");  static void free_poison_buf(void *buf)  { @@ -1420,7 +1420,7 @@ int cxl_poison_state_init(struct cxl_memdev_state *mds)  	mutex_init(&mds->poison.lock);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_poison_state_init, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_poison_state_init, "CXL");  int cxl_mailbox_init(struct cxl_mailbox *cxl_mbox, struct device *host)  { @@ -1433,7 +1433,7 @@ int cxl_mailbox_init(struct cxl_mailbox *cxl_mbox, struct device *host)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_mailbox_init, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mailbox_init, "CXL");  struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev)  { @@ -1455,7 +1455,7 @@ struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev)  	return mds;  } -EXPORT_SYMBOL_NS_GPL(cxl_memdev_state_create, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_memdev_state_create, "CXL");  void __init cxl_mbox_init(void)  { diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c index 84fefb76dafa..ae3dfcbe8938 100644 --- a/drivers/cxl/core/memdev.c +++ b/drivers/cxl/core/memdev.c @@ -250,7 +250,7 @@ int cxl_trigger_poison_list(struct cxl_memdev *cxlmd)  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_trigger_poison_list, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_trigger_poison_list, "CXL");  static int cxl_validate_poison_dpa(struct cxl_memdev *cxlmd, u64 dpa)  { @@ -329,7 +329,7 @@ out:  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_inject_poison, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_inject_poison, "CXL");  int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa)  { @@ -393,7 +393,7 @@ out:  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_clear_poison, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_clear_poison, "CXL");  static struct attribute *cxl_memdev_attributes[] = {  	&dev_attr_serial.attr, @@ -537,7 +537,7 @@ void cxl_memdev_update_perf(struct cxl_memdev *cxlmd)  	sysfs_update_group(&cxlmd->dev.kobj, &cxl_memdev_ram_attribute_group);  	sysfs_update_group(&cxlmd->dev.kobj, &cxl_memdev_pmem_attribute_group);  } -EXPORT_SYMBOL_NS_GPL(cxl_memdev_update_perf, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_memdev_update_perf, "CXL");  static const struct device_type cxl_memdev_type = {  	.name = "cxl_memdev", @@ -550,7 +550,7 @@ bool is_cxl_memdev(const struct device *dev)  {  	return dev->type == &cxl_memdev_type;  } -EXPORT_SYMBOL_NS_GPL(is_cxl_memdev, CXL); +EXPORT_SYMBOL_NS_GPL(is_cxl_memdev, "CXL");  /**   * set_exclusive_cxl_commands() - atomically disable user cxl commands @@ -569,7 +569,7 @@ void set_exclusive_cxl_commands(struct cxl_memdev_state *mds,  		  CXL_MEM_COMMAND_ID_MAX);  	up_write(&cxl_memdev_rwsem);  } -EXPORT_SYMBOL_NS_GPL(set_exclusive_cxl_commands, CXL); +EXPORT_SYMBOL_NS_GPL(set_exclusive_cxl_commands, "CXL");  /**   * clear_exclusive_cxl_commands() - atomically enable user cxl commands @@ -584,7 +584,7 @@ void clear_exclusive_cxl_commands(struct cxl_memdev_state *mds,  		      CXL_MEM_COMMAND_ID_MAX);  	up_write(&cxl_memdev_rwsem);  } -EXPORT_SYMBOL_NS_GPL(clear_exclusive_cxl_commands, CXL); +EXPORT_SYMBOL_NS_GPL(clear_exclusive_cxl_commands, "CXL");  static void cxl_memdev_shutdown(struct device *dev)  { @@ -1006,7 +1006,7 @@ int devm_cxl_setup_fw_upload(struct device *host, struct cxl_memdev_state *mds)  		return PTR_ERR(fwl);  	return devm_add_action_or_reset(host, cxl_remove_fw_upload, fwl);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_fw_upload, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_fw_upload, "CXL");  static const struct file_operations cxl_memdev_fops = {  	.owner = THIS_MODULE, @@ -1060,7 +1060,7 @@ err:  	put_device(dev);  	return ERR_PTR(rc);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_memdev, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_memdev, "CXL");  static void sanitize_teardown_notifier(void *data)  { @@ -1105,7 +1105,7 @@ int devm_cxl_sanitize_setup_notifier(struct device *host,  	return devm_add_action_or_reset(host, sanitize_teardown_notifier, mds);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_sanitize_setup_notifier, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_sanitize_setup_notifier, "CXL");  __init int cxl_memdev_init(void)  { diff --git a/drivers/cxl/core/pci.c b/drivers/cxl/core/pci.c index 5b46bc46aaa9..9d58ab9d33c5 100644 --- a/drivers/cxl/core/pci.c +++ b/drivers/cxl/core/pci.c @@ -101,7 +101,7 @@ int devm_cxl_port_enumerate_dports(struct cxl_port *port)  		return ctx.error;  	return ctx.count;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_port_enumerate_dports, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_port_enumerate_dports, "CXL");  static int cxl_dvsec_mem_range_valid(struct cxl_dev_state *cxlds, int id)  { @@ -209,7 +209,7 @@ int cxl_await_media_ready(struct cxl_dev_state *cxlds)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_await_media_ready, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_await_media_ready, "CXL");  static int cxl_set_mem_enable(struct cxl_dev_state *cxlds, u16 val)  { @@ -386,7 +386,7 @@ int cxl_dvsec_rr_decode(struct device *dev, struct cxl_port *port,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_dvsec_rr_decode, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_dvsec_rr_decode, "CXL");  /**   * cxl_hdm_decode_init() - Setup HDM decoding for the endpoint @@ -464,7 +464,7 @@ int cxl_hdm_decode_init(struct cxl_dev_state *cxlds, struct cxl_hdm *cxlhdm,  	 */  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_hdm_decode_init, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_hdm_decode_init, "CXL");  #define CXL_DOE_TABLE_ACCESS_REQ_CODE		0x000000ff  #define   CXL_DOE_TABLE_ACCESS_REQ_CODE_READ	0 @@ -648,7 +648,7 @@ err:  	devm_kfree(dev, buf);  	dev_err(dev, "Failed to read/validate CDAT.\n");  } -EXPORT_SYMBOL_NS_GPL(read_cdat_data, CXL); +EXPORT_SYMBOL_NS_GPL(read_cdat_data, "CXL");  static void __cxl_handle_cor_ras(struct cxl_dev_state *cxlds,  				 void __iomem *ras_base) @@ -805,7 +805,7 @@ void cxl_dport_init_ras_reporting(struct cxl_dport *dport, struct device *host)  		cxl_disable_rch_root_ints(dport);  	}  } -EXPORT_SYMBOL_NS_GPL(cxl_dport_init_ras_reporting, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_dport_init_ras_reporting, "CXL");  static void cxl_handle_rdport_cor_ras(struct cxl_dev_state *cxlds,  					  struct cxl_dport *dport) @@ -916,7 +916,7 @@ void cxl_cor_error_detected(struct pci_dev *pdev)  		cxl_handle_endpoint_cor_ras(cxlds);  	}  } -EXPORT_SYMBOL_NS_GPL(cxl_cor_error_detected, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_cor_error_detected, "CXL");  pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,  				    pci_channel_state_t state) @@ -966,7 +966,7 @@ pci_ers_result_t cxl_error_detected(struct pci_dev *pdev,  	}  	return PCI_ERS_RESULT_NEED_RESET;  } -EXPORT_SYMBOL_NS_GPL(cxl_error_detected, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_error_detected, "CXL");  static int cxl_flit_size(struct pci_dev *pdev)  { @@ -1030,7 +1030,7 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port)  	return device_for_each_child(&port->dev, port,  				     __cxl_endpoint_decoder_reset_detected);  } -EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_reset_detected, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_reset_detected, "CXL");  int cxl_pci_get_bandwidth(struct pci_dev *pdev, struct access_coordinate *c)  { diff --git a/drivers/cxl/core/pmem.c b/drivers/cxl/core/pmem.c index c00f3a933164..b3378d3f6acb 100644 --- a/drivers/cxl/core/pmem.c +++ b/drivers/cxl/core/pmem.c @@ -49,13 +49,13 @@ struct cxl_nvdimm_bridge *to_cxl_nvdimm_bridge(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_nvdimm_bridge, dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_nvdimm_bridge, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_nvdimm_bridge, "CXL");  bool is_cxl_nvdimm_bridge(struct device *dev)  {  	return dev->type == &cxl_nvdimm_bridge_type;  } -EXPORT_SYMBOL_NS_GPL(is_cxl_nvdimm_bridge, CXL); +EXPORT_SYMBOL_NS_GPL(is_cxl_nvdimm_bridge, "CXL");  static int match_nvdimm_bridge(struct device *dev, void *data)  { @@ -82,7 +82,7 @@ struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_port *port)  	return to_cxl_nvdimm_bridge(dev);  } -EXPORT_SYMBOL_NS_GPL(cxl_find_nvdimm_bridge, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_find_nvdimm_bridge, "CXL");  static struct lock_class_key cxl_nvdimm_bridge_key; @@ -164,7 +164,7 @@ err:  	put_device(dev);  	return ERR_PTR(rc);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_nvdimm_bridge, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_nvdimm_bridge, "CXL");  static void cxl_nvdimm_release(struct device *dev)  { @@ -188,7 +188,7 @@ bool is_cxl_nvdimm(struct device *dev)  {  	return dev->type == &cxl_nvdimm_type;  } -EXPORT_SYMBOL_NS_GPL(is_cxl_nvdimm, CXL); +EXPORT_SYMBOL_NS_GPL(is_cxl_nvdimm, "CXL");  struct cxl_nvdimm *to_cxl_nvdimm(struct device *dev)  { @@ -197,7 +197,7 @@ struct cxl_nvdimm *to_cxl_nvdimm(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_nvdimm, dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_nvdimm, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_nvdimm, "CXL");  static struct lock_class_key cxl_nvdimm_key; @@ -293,4 +293,4 @@ err_alloc:  	return rc;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_nvdimm, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_nvdimm, "CXL"); diff --git a/drivers/cxl/core/pmu.c b/drivers/cxl/core/pmu.c index 5d8e06b0ba6e..b3136d7664ab 100644 --- a/drivers/cxl/core/pmu.c +++ b/drivers/cxl/core/pmu.c @@ -65,4 +65,4 @@ err:  	put_device(&pmu->dev);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_pmu_add, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_pmu_add, "CXL"); diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index af92c67bc954..78a5c2c25982 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -437,7 +437,7 @@ struct cxl_root_decoder *to_cxl_root_decoder(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_root_decoder, cxlsd.cxld.dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_root_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_root_decoder, "CXL");  static void cxl_root_decoder_release(struct device *dev)  { @@ -471,19 +471,19 @@ bool is_endpoint_decoder(struct device *dev)  {  	return dev->type == &cxl_decoder_endpoint_type;  } -EXPORT_SYMBOL_NS_GPL(is_endpoint_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(is_endpoint_decoder, "CXL");  bool is_root_decoder(struct device *dev)  {  	return dev->type == &cxl_decoder_root_type;  } -EXPORT_SYMBOL_NS_GPL(is_root_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(is_root_decoder, "CXL");  bool is_switch_decoder(struct device *dev)  {  	return is_root_decoder(dev) || dev->type == &cxl_decoder_switch_type;  } -EXPORT_SYMBOL_NS_GPL(is_switch_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(is_switch_decoder, "CXL");  struct cxl_decoder *to_cxl_decoder(struct device *dev)  { @@ -493,7 +493,7 @@ struct cxl_decoder *to_cxl_decoder(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_decoder, dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_decoder, "CXL");  struct cxl_endpoint_decoder *to_cxl_endpoint_decoder(struct device *dev)  { @@ -502,7 +502,7 @@ struct cxl_endpoint_decoder *to_cxl_endpoint_decoder(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_endpoint_decoder, cxld.dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_endpoint_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_endpoint_decoder, "CXL");  struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev)  { @@ -511,7 +511,7 @@ struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_switch_decoder, cxld.dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_switch_decoder, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_switch_decoder, "CXL");  static void cxl_ep_release(struct cxl_ep *ep)  { @@ -585,7 +585,7 @@ bool is_cxl_port(const struct device *dev)  {  	return dev->type == &cxl_port_type;  } -EXPORT_SYMBOL_NS_GPL(is_cxl_port, CXL); +EXPORT_SYMBOL_NS_GPL(is_cxl_port, "CXL");  struct cxl_port *to_cxl_port(const struct device *dev)  { @@ -594,7 +594,7 @@ struct cxl_port *to_cxl_port(const struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_port, dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_port, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_port, "CXL");  static void unregister_port(void *_port)  { @@ -942,7 +942,7 @@ struct cxl_port *devm_cxl_add_port(struct device *host,  	return port;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_port, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_port, "CXL");  struct cxl_root *devm_cxl_add_root(struct device *host,  				   const struct cxl_root_ops *ops) @@ -958,7 +958,7 @@ struct cxl_root *devm_cxl_add_root(struct device *host,  	cxl_root->ops = ops;  	return cxl_root;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_root, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_root, "CXL");  struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port)  { @@ -974,7 +974,7 @@ struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port)  	return xa_load(&cxl_root_buses, (unsigned long)port->uport_dev);  } -EXPORT_SYMBOL_NS_GPL(cxl_port_to_pci_bus, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_port_to_pci_bus, "CXL");  static void unregister_pci_bus(void *uport_dev)  { @@ -995,7 +995,7 @@ int devm_cxl_register_pci_bus(struct device *host, struct device *uport_dev,  		return rc;  	return devm_add_action_or_reset(host, unregister_pci_bus, uport_dev);  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_register_pci_bus, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_register_pci_bus, "CXL");  static bool dev_is_cxl_root_child(struct device *dev)  { @@ -1027,7 +1027,7 @@ struct cxl_root *find_cxl_root(struct cxl_port *port)  	get_device(&iter->dev);  	return to_cxl_root(iter);  } -EXPORT_SYMBOL_NS_GPL(find_cxl_root, CXL); +EXPORT_SYMBOL_NS_GPL(find_cxl_root, "CXL");  void put_cxl_root(struct cxl_root *cxl_root)  { @@ -1036,7 +1036,7 @@ void put_cxl_root(struct cxl_root *cxl_root)  	put_device(&cxl_root->port.dev);  } -EXPORT_SYMBOL_NS_GPL(put_cxl_root, CXL); +EXPORT_SYMBOL_NS_GPL(put_cxl_root, "CXL");  static struct cxl_dport *find_dport(struct cxl_port *port, int id)  { @@ -1230,7 +1230,7 @@ struct cxl_dport *devm_cxl_add_dport(struct cxl_port *port,  	return dport;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_dport, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_dport, "CXL");  /**   * devm_cxl_add_rch_dport - append RCH downstream port data to a cxl_port @@ -1264,7 +1264,7 @@ struct cxl_dport *devm_cxl_add_rch_dport(struct cxl_port *port,  	return dport;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_add_rch_dport, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_add_rch_dport, "CXL");  static int add_ep(struct cxl_ep *new)  { @@ -1421,7 +1421,7 @@ int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint)  	cxlmd->depth = endpoint->depth;  	return devm_add_action_or_reset(dev, delete_endpoint, cxlmd);  } -EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, "CXL");  /*   * The natural end of life of a non-root 'cxl_port' is when its parent port goes @@ -1692,21 +1692,21 @@ retry:  	return 0;  } -EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, CXL); +EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, "CXL");  struct cxl_port *cxl_pci_find_port(struct pci_dev *pdev,  				   struct cxl_dport **dport)  {  	return find_cxl_port(pdev->dev.parent, dport);  } -EXPORT_SYMBOL_NS_GPL(cxl_pci_find_port, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_pci_find_port, "CXL");  struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd,  				   struct cxl_dport **dport)  {  	return find_cxl_port(grandparent(&cxlmd->dev), dport);  } -EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, "CXL");  static int decoder_populate_targets(struct cxl_switch_decoder *cxlsd,  				    struct cxl_port *port, int *target_map) @@ -1840,7 +1840,7 @@ struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port,  	cxlrd->qos_class = CXL_QOS_CLASS_INVALID;  	return cxlrd;  } -EXPORT_SYMBOL_NS_GPL(cxl_root_decoder_alloc, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_root_decoder_alloc, "CXL");  /**   * cxl_switch_decoder_alloc - Allocate a switch level decoder @@ -1877,7 +1877,7 @@ struct cxl_switch_decoder *cxl_switch_decoder_alloc(struct cxl_port *port,  	cxld->dev.type = &cxl_decoder_switch_type;  	return cxlsd;  } -EXPORT_SYMBOL_NS_GPL(cxl_switch_decoder_alloc, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_switch_decoder_alloc, "CXL");  /**   * cxl_endpoint_decoder_alloc - Allocate an endpoint decoder @@ -1909,7 +1909,7 @@ struct cxl_endpoint_decoder *cxl_endpoint_decoder_alloc(struct cxl_port *port)  	cxld->dev.type = &cxl_decoder_endpoint_type;  	return cxled;  } -EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_alloc, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_alloc, "CXL");  /**   * cxl_decoder_add_locked - Add a decoder with targets @@ -1965,7 +1965,7 @@ int cxl_decoder_add_locked(struct cxl_decoder *cxld, int *target_map)  	return device_add(dev);  } -EXPORT_SYMBOL_NS_GPL(cxl_decoder_add_locked, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_decoder_add_locked, "CXL");  /**   * cxl_decoder_add - Add a decoder with targets @@ -1995,7 +1995,7 @@ int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map)  	guard(device)(&port->dev);  	return cxl_decoder_add_locked(cxld, target_map);  } -EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, "CXL");  static void cxld_unregister(void *dev)  { @@ -2013,7 +2013,7 @@ int cxl_decoder_autoremove(struct device *host, struct cxl_decoder *cxld)  {  	return devm_add_action_or_reset(host, cxld_unregister, &cxld->dev);  } -EXPORT_SYMBOL_NS_GPL(cxl_decoder_autoremove, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_decoder_autoremove, "CXL");  /**   * __cxl_driver_register - register a driver for the cxl bus @@ -2046,13 +2046,13 @@ int __cxl_driver_register(struct cxl_driver *cxl_drv, struct module *owner,  	return driver_register(&cxl_drv->drv);  } -EXPORT_SYMBOL_NS_GPL(__cxl_driver_register, CXL); +EXPORT_SYMBOL_NS_GPL(__cxl_driver_register, "CXL");  void cxl_driver_unregister(struct cxl_driver *cxl_drv)  {  	driver_unregister(&cxl_drv->drv);  } -EXPORT_SYMBOL_NS_GPL(cxl_driver_unregister, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_driver_unregister, "CXL");  static int cxl_bus_uevent(const struct device *dev, struct kobj_uevent_env *env)  { @@ -2104,19 +2104,19 @@ void cxl_bus_rescan(void)  	queue_work(cxl_bus_wq, &rescan_work);  } -EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, "CXL");  void cxl_bus_drain(void)  {  	drain_workqueue(cxl_bus_wq);  } -EXPORT_SYMBOL_NS_GPL(cxl_bus_drain, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_bus_drain, "CXL");  bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd)  {  	return queue_work(cxl_bus_wq, &cxlmd->detach_work);  } -EXPORT_SYMBOL_NS_GPL(schedule_cxl_memdev_detach, CXL); +EXPORT_SYMBOL_NS_GPL(schedule_cxl_memdev_detach, "CXL");  static void add_latency(struct access_coordinate *c, long latency)  { @@ -2242,7 +2242,7 @@ int cxl_endpoint_get_perf_coordinates(struct cxl_port *port,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_endpoint_get_perf_coordinates, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_endpoint_get_perf_coordinates, "CXL");  int cxl_port_get_switch_dport_bandwidth(struct cxl_port *port,  					struct access_coordinate *c) @@ -2299,7 +2299,7 @@ struct bus_type cxl_bus_type = {  	.remove = cxl_bus_remove,  	.bus_groups = cxl_bus_attribute_groups,  }; -EXPORT_SYMBOL_NS_GPL(cxl_bus_type, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_bus_type, "CXL");  static struct dentry *cxl_debugfs; @@ -2307,7 +2307,7 @@ struct dentry *cxl_debugfs_create_dir(const char *dir)  {  	return debugfs_create_dir(dir, cxl_debugfs);  } -EXPORT_SYMBOL_NS_GPL(cxl_debugfs_create_dir, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_debugfs_create_dir, "CXL");  static __init int cxl_core_init(void)  { @@ -2363,4 +2363,4 @@ subsys_initcall(cxl_core_init);  module_exit(cxl_core_exit);  MODULE_DESCRIPTION("CXL: Core Compute Express Link support");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL"); diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 70d0a017e99c..b98b1ccffd1c 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -1295,6 +1295,7 @@ static int cxl_port_setup_targets(struct cxl_port *port,  	struct cxl_region_params *p = &cxlr->params;  	struct cxl_decoder *cxld = cxl_rr->decoder;  	struct cxl_switch_decoder *cxlsd; +	struct cxl_port *iter = port;  	u16 eig, peig;  	u8 eiw, peiw; @@ -1311,16 +1312,26 @@ static int cxl_port_setup_targets(struct cxl_port *port,  	cxlsd = to_cxl_switch_decoder(&cxld->dev);  	if (cxl_rr->nr_targets_set) { -		int i, distance; +		int i, distance = 1; +		struct cxl_region_ref *cxl_rr_iter;  		/* -		 * Passthrough decoders impose no distance requirements between -		 * peers +		 * The "distance" between peer downstream ports represents which +		 * endpoint positions in the region interleave a given port can +		 * host. +		 * +		 * For example, at the root of a hierarchy the distance is +		 * always 1 as every index targets a different host-bridge. At +		 * each subsequent switch level those ports map every Nth region +		 * position where N is the width of the switch == distance.  		 */ -		if (cxl_rr->nr_targets == 1) -			distance = 0; -		else -			distance = p->nr_targets / cxl_rr->nr_targets; +		do { +			cxl_rr_iter = cxl_rr_load(iter, cxlr); +			distance *= cxl_rr_iter->nr_targets; +			iter = to_cxl_port(iter->dev.parent); +		} while (!is_cxl_root(iter)); +		distance *= cxlrd->cxlsd.cxld.interleave_ways; +  		for (i = 0; i < cxl_rr->nr_targets_set; i++)  			if (ep->dport == cxlsd->target[i]) {  				rc = check_last_peer(cxled, ep, cxl_rr, @@ -2299,7 +2310,7 @@ bool is_cxl_region(struct device *dev)  {  	return dev->type == &cxl_region_type;  } -EXPORT_SYMBOL_NS_GPL(is_cxl_region, CXL); +EXPORT_SYMBOL_NS_GPL(is_cxl_region, "CXL");  static struct cxl_region *to_cxl_region(struct device *dev)  { @@ -2652,7 +2663,7 @@ bool is_cxl_pmem_region(struct device *dev)  {  	return dev->type == &cxl_pmem_region_type;  } -EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, CXL); +EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, "CXL");  struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev)  { @@ -2661,7 +2672,7 @@ struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_pmem_region, dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, "CXL");  struct cxl_poison_context {  	struct cxl_port *port; @@ -3015,7 +3026,7 @@ struct cxl_dax_region *to_cxl_dax_region(struct device *dev)  		return NULL;  	return container_of(dev, struct cxl_dax_region, dev);  } -EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, CXL); +EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL");  static struct lock_class_key cxl_dax_region_key; @@ -3359,7 +3370,7 @@ out:  	put_device(cxlrd_dev);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_add_to_region, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_add_to_region, "CXL");  static int is_system_ram(struct resource *res, void *arg)  { @@ -3462,6 +3473,6 @@ void cxl_region_exit(void)  	cxl_driver_unregister(&cxl_region_driver);  } -MODULE_IMPORT_NS(CXL); -MODULE_IMPORT_NS(DEVMEM); +MODULE_IMPORT_NS("CXL"); +MODULE_IMPORT_NS("DEVMEM");  MODULE_ALIAS_CXL(CXL_DEVICE_REGION); diff --git a/drivers/cxl/core/regs.c b/drivers/cxl/core/regs.c index 429973a2165b..59cb35b40c7e 100644 --- a/drivers/cxl/core/regs.c +++ b/drivers/cxl/core/regs.c @@ -106,7 +106,7 @@ void cxl_probe_component_regs(struct device *dev, void __iomem *base,  		rmap->size = length;  	}  } -EXPORT_SYMBOL_NS_GPL(cxl_probe_component_regs, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_probe_component_regs, "CXL");  /**   * cxl_probe_device_regs() - Detect CXL Device register blocks @@ -174,7 +174,7 @@ void cxl_probe_device_regs(struct device *dev, void __iomem *base,  		rmap->size = length;  	}  } -EXPORT_SYMBOL_NS_GPL(cxl_probe_device_regs, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_probe_device_regs, "CXL");  void __iomem *devm_cxl_iomap_block(struct device *dev, resource_size_t addr,  				   resource_size_t length) @@ -232,7 +232,7 @@ int cxl_map_component_regs(const struct cxl_register_map *map,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_map_component_regs, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_map_component_regs, "CXL");  int cxl_map_device_regs(const struct cxl_register_map *map,  			struct cxl_device_regs *regs) @@ -266,7 +266,7 @@ int cxl_map_device_regs(const struct cxl_register_map *map,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_map_device_regs, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_map_device_regs, "CXL");  static bool cxl_decode_regblock(struct pci_dev *pdev, u32 reg_lo, u32 reg_hi,  				struct cxl_register_map *map) @@ -344,7 +344,7 @@ int cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type,  	map->resource = CXL_RESOURCE_NONE;  	return -ENODEV;  } -EXPORT_SYMBOL_NS_GPL(cxl_find_regblock_instance, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_find_regblock_instance, "CXL");  /**   * cxl_find_regblock() - Locate register blocks by type @@ -362,7 +362,7 @@ int cxl_find_regblock(struct pci_dev *pdev, enum cxl_regloc_type type,  {  	return cxl_find_regblock_instance(pdev, type, map, 0);  } -EXPORT_SYMBOL_NS_GPL(cxl_find_regblock, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_find_regblock, "CXL");  /**   * cxl_count_regblock() - Count instances of a given regblock type. @@ -385,7 +385,7 @@ int cxl_count_regblock(struct pci_dev *pdev, enum cxl_regloc_type type)  		count++;  	}  } -EXPORT_SYMBOL_NS_GPL(cxl_count_regblock, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_count_regblock, "CXL");  int cxl_map_pmu_regs(struct cxl_register_map *map, struct cxl_pmu_regs *regs)  { @@ -399,7 +399,7 @@ int cxl_map_pmu_regs(struct cxl_register_map *map, struct cxl_pmu_regs *regs)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_map_pmu_regs, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_map_pmu_regs, "CXL");  static int cxl_map_regblock(struct cxl_register_map *map)  { @@ -468,7 +468,7 @@ int cxl_setup_regs(struct cxl_register_map *map)  	return rc;  } -EXPORT_SYMBOL_NS_GPL(cxl_setup_regs, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_setup_regs, "CXL");  u16 cxl_rcrb_to_aer(struct device *dev, resource_size_t rcrb)  { @@ -560,7 +560,7 @@ int cxl_dport_map_rcd_linkcap(struct pci_dev *pdev, struct cxl_dport *dport)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cxl_dport_map_rcd_linkcap, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_dport_map_rcd_linkcap, "CXL");  resource_size_t __rcrb_to_component(struct device *dev, struct cxl_rcrb_info *ri,  				    enum cxl_rcrb which) @@ -633,4 +633,4 @@ resource_size_t cxl_rcd_component_reg_phys(struct device *dev,  		return CXL_RESOURCE_NONE;  	return __rcrb_to_component(dev, &dport->rcrb, CXL_RCRB_UPSTREAM);  } -EXPORT_SYMBOL_NS_GPL(cxl_rcd_component_reg_phys, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_rcd_component_reg_phys, "CXL"); diff --git a/drivers/cxl/core/suspend.c b/drivers/cxl/core/suspend.c index a5984d96ea1d..29aa5cc5e565 100644 --- a/drivers/cxl/core/suspend.c +++ b/drivers/cxl/core/suspend.c @@ -15,10 +15,10 @@ void cxl_mem_active_inc(void)  {  	atomic_inc(&mem_active);  } -EXPORT_SYMBOL_NS_GPL(cxl_mem_active_inc, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mem_active_inc, "CXL");  void cxl_mem_active_dec(void)  {  	atomic_dec(&mem_active);  } -EXPORT_SYMBOL_NS_GPL(cxl_mem_active_dec, CXL); +EXPORT_SYMBOL_NS_GPL(cxl_mem_active_dec, "CXL"); diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c index a9fd5cd5a0d2..2f03a4d5606e 100644 --- a/drivers/cxl/mem.c +++ b/drivers/cxl/mem.c @@ -252,7 +252,7 @@ module_cxl_driver(cxl_mem_driver);  MODULE_DESCRIPTION("CXL: Memory Expansion");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL");  MODULE_ALIAS_CXL(CXL_DEVICE_MEMORY_EXPANDER);  /*   * create_endpoint() wants to validate port driver attach immediately after diff --git a/drivers/cxl/pci.c b/drivers/cxl/pci.c index b2cb81f6d9e7..6d94ff4a4f1a 100644 --- a/drivers/cxl/pci.c +++ b/drivers/cxl/pci.c @@ -836,6 +836,9 @@ static ssize_t rcd_pcie_cap_emit(struct device *dev, u16 offset, char *buf, size  	if (!root_dev)  		return -ENXIO; +	if (!dport->regs.rcd_pcie_cap) +		return -ENXIO; +  	guard(device)(root_dev);  	if (!root_dev->driver)  		return -ENXIO; @@ -1032,8 +1035,7 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	if (rc)  		return rc; -	rc = cxl_pci_ras_unmask(pdev); -	if (rc) +	if (cxl_pci_ras_unmask(pdev))  		dev_dbg(&pdev->dev, "No RAS reporting unmasked\n");  	pci_save_state(pdev); @@ -1184,4 +1186,4 @@ module_init(cxl_pci_driver_init);  module_exit(cxl_pci_driver_exit);  MODULE_DESCRIPTION("CXL: PCI manageability");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL"); diff --git a/drivers/cxl/pmem.c b/drivers/cxl/pmem.c index d2d43a4fc053..f9c95996e937 100644 --- a/drivers/cxl/pmem.c +++ b/drivers/cxl/pmem.c @@ -459,7 +459,7 @@ MODULE_DESCRIPTION("CXL PMEM: Persistent Memory Support");  MODULE_LICENSE("GPL v2");  module_init(cxl_pmem_init);  module_exit(cxl_pmem_exit); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL");  MODULE_ALIAS_CXL(CXL_DEVICE_NVDIMM_BRIDGE);  MODULE_ALIAS_CXL(CXL_DEVICE_NVDIMM);  MODULE_ALIAS_CXL(CXL_DEVICE_PMEM_REGION); diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c index 24041cf85cfb..4c83f6a22e58 100644 --- a/drivers/cxl/port.c +++ b/drivers/cxl/port.c @@ -226,5 +226,5 @@ module_exit(cxl_port_exit);  MODULE_DESCRIPTION("CXL: Port enumeration and services");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL");  MODULE_ALIAS_CXL(CXL_DEVICE_PORT); diff --git a/drivers/dax/cxl.c b/drivers/dax/cxl.c index 9b29e732b39a..13cd94d32ff7 100644 --- a/drivers/dax/cxl.c +++ b/drivers/dax/cxl.c @@ -46,4 +46,4 @@ MODULE_ALIAS_CXL(CXL_DEVICE_DAX_REGION);  MODULE_DESCRIPTION("CXL DAX: direct access to CXL regions");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Intel Corporation"); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL"); diff --git a/drivers/devfreq/event/exynos-nocp.c b/drivers/devfreq/event/exynos-nocp.c index 5edc522f715c..6a3efd782ad0 100644 --- a/drivers/devfreq/event/exynos-nocp.c +++ b/drivers/devfreq/event/exynos-nocp.c @@ -284,7 +284,7 @@ static void exynos_nocp_remove(struct platform_device *pdev)  static struct platform_driver exynos_nocp_driver = {  	.probe	= exynos_nocp_probe, -	.remove_new = exynos_nocp_remove, +	.remove = exynos_nocp_remove,  	.driver = {  		.name	= "exynos-nocp",  		.of_match_table = exynos_nocp_id_match, diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c index 7002df20a49e..88cd4dfe87e1 100644 --- a/drivers/devfreq/event/exynos-ppmu.c +++ b/drivers/devfreq/event/exynos-ppmu.c @@ -701,7 +701,7 @@ static void exynos_ppmu_remove(struct platform_device *pdev)  static struct platform_driver exynos_ppmu_driver = {  	.probe	= exynos_ppmu_probe, -	.remove_new = exynos_ppmu_remove, +	.remove = exynos_ppmu_remove,  	.driver = {  		.name	= "exynos-ppmu",  		.of_match_table = exynos_ppmu_id_match, diff --git a/drivers/devfreq/mtk-cci-devfreq.c b/drivers/devfreq/mtk-cci-devfreq.c index 7ad5225b0381..22fe9e631f8a 100644 --- a/drivers/devfreq/mtk-cci-devfreq.c +++ b/drivers/devfreq/mtk-cci-devfreq.c @@ -430,7 +430,7 @@ MODULE_DEVICE_TABLE(of, mtk_ccifreq_machines);  static struct platform_driver mtk_ccifreq_platdrv = {  	.probe	= mtk_ccifreq_probe, -	.remove_new = mtk_ccifreq_remove, +	.remove = mtk_ccifreq_remove,  	.driver = {  		.name = "mtk-ccifreq",  		.of_match_table = mtk_ccifreq_machines, diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c index d405cee92c25..dbdce7636ca5 100644 --- a/drivers/devfreq/rk3399_dmc.c +++ b/drivers/devfreq/rk3399_dmc.c @@ -474,7 +474,7 @@ MODULE_DEVICE_TABLE(of, rk3399dmc_devfreq_of_match);  static struct platform_driver rk3399_dmcfreq_driver = {  	.probe	= rk3399_dmcfreq_probe, -	.remove_new = rk3399_dmcfreq_remove, +	.remove = rk3399_dmcfreq_remove,  	.driver = {  		.name	= "rk3399-dmc-freq",  		.pm	= &rk3399_dmcfreq_pm, diff --git a/drivers/devfreq/sun8i-a33-mbus.c b/drivers/devfreq/sun8i-a33-mbus.c index bcf654f4ff96..7c6ae91ede1f 100644 --- a/drivers/devfreq/sun8i-a33-mbus.c +++ b/drivers/devfreq/sun8i-a33-mbus.c @@ -495,7 +495,7 @@ static SIMPLE_DEV_PM_OPS(sun8i_a33_mbus_pm_ops,  static struct platform_driver sun8i_a33_mbus_driver = {  	.probe	= sun8i_a33_mbus_probe, -	.remove_new = sun8i_a33_mbus_remove, +	.remove = sun8i_a33_mbus_remove,  	.driver	= {  		.name		= "sun8i-a33-mbus",  		.of_match_table	= sun8i_a33_mbus_of_match, diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 5ad0e9e2e1b9..5baa83b85515 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -60,7 +60,7 @@ static void __dma_buf_debugfs_list_add(struct dma_buf *dmabuf)  {  } -static void __dma_buf_debugfs_list_del(struct file *file) +static void __dma_buf_debugfs_list_del(struct dma_buf *dmabuf)  {  }  #endif @@ -703,7 +703,7 @@ err_module:  	module_put(exp_info->owner);  	return ERR_PTR(ret);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_export, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_export, "DMA_BUF");  /**   * dma_buf_fd - returns a file descriptor for the given struct dma_buf @@ -727,7 +727,7 @@ int dma_buf_fd(struct dma_buf *dmabuf, int flags)  	return fd;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_fd, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_fd, "DMA_BUF");  /**   * dma_buf_get - returns the struct dma_buf related to an fd @@ -753,7 +753,7 @@ struct dma_buf *dma_buf_get(int fd)  	return file->private_data;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_get, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_get, "DMA_BUF");  /**   * dma_buf_put - decreases refcount of the buffer @@ -772,7 +772,7 @@ void dma_buf_put(struct dma_buf *dmabuf)  	fput(dmabuf->file);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_put, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_put, "DMA_BUF");  static void mangle_sg_table(struct sg_table *sg_table)  { @@ -978,7 +978,7 @@ err_unlock:  	dma_buf_detach(dmabuf, attach);  	return ERR_PTR(ret);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_dynamic_attach, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_dynamic_attach, "DMA_BUF");  /**   * dma_buf_attach - Wrapper for dma_buf_dynamic_attach @@ -993,7 +993,7 @@ struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,  {  	return dma_buf_dynamic_attach(dmabuf, dev, NULL, NULL);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_attach, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_attach, "DMA_BUF");  static void __unmap_dma_buf(struct dma_buf_attachment *attach,  			    struct sg_table *sg_table, @@ -1037,7 +1037,7 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)  	kfree(attach);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_detach, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_detach, "DMA_BUF");  /**   * dma_buf_pin - Lock down the DMA-buf @@ -1067,7 +1067,7 @@ int dma_buf_pin(struct dma_buf_attachment *attach)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_pin, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_pin, "DMA_BUF");  /**   * dma_buf_unpin - Unpin a DMA-buf @@ -1088,7 +1088,7 @@ void dma_buf_unpin(struct dma_buf_attachment *attach)  	if (dmabuf->ops->unpin)  		dmabuf->ops->unpin(attach);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_unpin, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_unpin, "DMA_BUF");  /**   * dma_buf_map_attachment - Returns the scatterlist table of the attachment; @@ -1176,7 +1176,7 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,  #endif /* CONFIG_DMA_API_DEBUG */  	return sg_table;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_map_attachment, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_map_attachment, "DMA_BUF");  /**   * dma_buf_map_attachment_unlocked - Returns the scatterlist table of the attachment; @@ -1204,7 +1204,7 @@ dma_buf_map_attachment_unlocked(struct dma_buf_attachment *attach,  	return sg_table;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_map_attachment_unlocked, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_map_attachment_unlocked, "DMA_BUF");  /**   * dma_buf_unmap_attachment - unmaps and decreases usecount of the buffer;might @@ -1236,7 +1236,7 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,  	    !IS_ENABLED(CONFIG_DMABUF_MOVE_NOTIFY))  		dma_buf_unpin(attach);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_unmap_attachment, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_unmap_attachment, "DMA_BUF");  /**   * dma_buf_unmap_attachment_unlocked - unmaps and decreases usecount of the buffer;might @@ -1261,7 +1261,7 @@ void dma_buf_unmap_attachment_unlocked(struct dma_buf_attachment *attach,  	dma_buf_unmap_attachment(attach, sg_table, direction);  	dma_resv_unlock(attach->dmabuf->resv);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_unmap_attachment_unlocked, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_unmap_attachment_unlocked, "DMA_BUF");  /**   * dma_buf_move_notify - notify attachments that DMA-buf is moving @@ -1281,7 +1281,7 @@ void dma_buf_move_notify(struct dma_buf *dmabuf)  		if (attach->importer_ops)  			attach->importer_ops->move_notify(attach);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_move_notify, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_move_notify, "DMA_BUF");  /**   * DOC: cpu access @@ -1429,7 +1429,7 @@ int dma_buf_begin_cpu_access(struct dma_buf *dmabuf,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_begin_cpu_access, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_begin_cpu_access, "DMA_BUF");  /**   * dma_buf_end_cpu_access - Must be called after accessing a dma_buf from the @@ -1457,7 +1457,7 @@ int dma_buf_end_cpu_access(struct dma_buf *dmabuf,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_end_cpu_access, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_end_cpu_access, "DMA_BUF");  /** @@ -1499,7 +1499,7 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,  	return dmabuf->ops->mmap(dmabuf, vma);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_mmap, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_mmap, "DMA_BUF");  /**   * dma_buf_vmap - Create virtual mapping for the buffer object into kernel @@ -1552,7 +1552,7 @@ int dma_buf_vmap(struct dma_buf *dmabuf, struct iosys_map *map)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_vmap, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_vmap, "DMA_BUF");  /**   * dma_buf_vmap_unlocked - Create virtual mapping for the buffer object into kernel @@ -1579,7 +1579,7 @@ int dma_buf_vmap_unlocked(struct dma_buf *dmabuf, struct iosys_map *map)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(dma_buf_vmap_unlocked, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_vmap_unlocked, "DMA_BUF");  /**   * dma_buf_vunmap - Unmap a vmap obtained by dma_buf_vmap. @@ -1603,7 +1603,7 @@ void dma_buf_vunmap(struct dma_buf *dmabuf, struct iosys_map *map)  		iosys_map_clear(&dmabuf->vmap_ptr);  	}  } -EXPORT_SYMBOL_NS_GPL(dma_buf_vunmap, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_vunmap, "DMA_BUF");  /**   * dma_buf_vunmap_unlocked - Unmap a vmap obtained by dma_buf_vmap. @@ -1619,7 +1619,7 @@ void dma_buf_vunmap_unlocked(struct dma_buf *dmabuf, struct iosys_map *map)  	dma_buf_vunmap(dmabuf, map);  	dma_resv_unlock(dmabuf->resv);  } -EXPORT_SYMBOL_NS_GPL(dma_buf_vunmap_unlocked, DMA_BUF); +EXPORT_SYMBOL_NS_GPL(dma_buf_vunmap_unlocked, "DMA_BUF");  #ifdef CONFIG_DEBUG_FS  static int dma_buf_debug_show(struct seq_file *s, void *unused) diff --git a/drivers/dma-buf/dma-fence-array.c b/drivers/dma-buf/dma-fence-array.c index 8a08ffde31e7..6657d4b30af9 100644 --- a/drivers/dma-buf/dma-fence-array.c +++ b/drivers/dma-buf/dma-fence-array.c @@ -103,10 +103,36 @@ static bool dma_fence_array_enable_signaling(struct dma_fence *fence)  static bool dma_fence_array_signaled(struct dma_fence *fence)  {  	struct dma_fence_array *array = to_dma_fence_array(fence); +	int num_pending; +	unsigned int i; -	if (atomic_read(&array->num_pending) > 0) +	/* +	 * We need to read num_pending before checking the enable_signal bit +	 * to avoid racing with the enable_signaling() implementation, which +	 * might decrement the counter, and cause a partial check. +	 * atomic_read_acquire() pairs with atomic_dec_and_test() in +	 * dma_fence_array_enable_signaling() +	 * +	 * The !--num_pending check is here to account for the any_signaled case +	 * if we race with enable_signaling(), that means the !num_pending check +	 * in the is_signalling_enabled branch might be outdated (num_pending +	 * might have been decremented), but that's fine. The user will get the +	 * right value when testing again later. +	 */ +	num_pending = atomic_read_acquire(&array->num_pending); +	if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &array->base.flags)) { +		if (num_pending <= 0) +			goto signal;  		return false; +	} + +	for (i = 0; i < array->num_fences; ++i) { +		if (dma_fence_is_signaled(array->fences[i]) && !--num_pending) +			goto signal; +	} +	return false; +signal:  	dma_fence_array_clear_pending_error(array);  	return true;  } diff --git a/drivers/dma-buf/dma-fence-unwrap.c b/drivers/dma-buf/dma-fence-unwrap.c index 628af51c81af..6345062731f1 100644 --- a/drivers/dma-buf/dma-fence-unwrap.c +++ b/drivers/dma-buf/dma-fence-unwrap.c @@ -12,6 +12,7 @@  #include <linux/dma-fence-chain.h>  #include <linux/dma-fence-unwrap.h>  #include <linux/slab.h> +#include <linux/sort.h>  /* Internal helper to start new array iteration, don't use directly */  static struct dma_fence * @@ -59,6 +60,25 @@ struct dma_fence *dma_fence_unwrap_next(struct dma_fence_unwrap *cursor)  }  EXPORT_SYMBOL_GPL(dma_fence_unwrap_next); + +static int fence_cmp(const void *_a, const void *_b) +{ +	struct dma_fence *a = *(struct dma_fence **)_a; +	struct dma_fence *b = *(struct dma_fence **)_b; + +	if (a->context < b->context) +		return -1; +	else if (a->context > b->context) +		return 1; + +	if (dma_fence_is_later(b, a)) +		return 1; +	else if (dma_fence_is_later(a, b)) +		return -1; + +	return 0; +} +  /* Implementation for the dma_fence_merge() marco, don't use directly */  struct dma_fence *__dma_fence_unwrap_merge(unsigned int num_fences,  					   struct dma_fence **fences, @@ -67,8 +87,7 @@ struct dma_fence *__dma_fence_unwrap_merge(unsigned int num_fences,  	struct dma_fence_array *result;  	struct dma_fence *tmp, **array;  	ktime_t timestamp; -	unsigned int i; -	size_t count; +	int i, j, count;  	count = 0;  	timestamp = ns_to_ktime(0); @@ -96,78 +115,55 @@ struct dma_fence *__dma_fence_unwrap_merge(unsigned int num_fences,  	if (!array)  		return NULL; -	/* -	 * This trashes the input fence array and uses it as position for the -	 * following merge loop. This works because the dma_fence_merge() -	 * wrapper macro is creating this temporary array on the stack together -	 * with the iterators. -	 */ -	for (i = 0; i < num_fences; ++i) -		fences[i] = dma_fence_unwrap_first(fences[i], &iter[i]); -  	count = 0; -	do { -		unsigned int sel; - -restart: -		tmp = NULL; -		for (i = 0; i < num_fences; ++i) { -			struct dma_fence *next; - -			while (fences[i] && dma_fence_is_signaled(fences[i])) -				fences[i] = dma_fence_unwrap_next(&iter[i]); - -			next = fences[i]; -			if (!next) -				continue; - -			/* -			 * We can't guarantee that inpute fences are ordered by -			 * context, but it is still quite likely when this -			 * function is used multiple times. So attempt to order -			 * the fences by context as we pass over them and merge -			 * fences with the same context. -			 */ -			if (!tmp || tmp->context > next->context) { -				tmp = next; -				sel = i; - -			} else if (tmp->context < next->context) { -				continue; - -			} else if (dma_fence_is_later(tmp, next)) { -				fences[i] = dma_fence_unwrap_next(&iter[i]); -				goto restart; +	for (i = 0; i < num_fences; ++i) { +		dma_fence_unwrap_for_each(tmp, &iter[i], fences[i]) { +			if (!dma_fence_is_signaled(tmp)) { +				array[count++] = dma_fence_get(tmp);  			} else { -				fences[sel] = dma_fence_unwrap_next(&iter[sel]); -				goto restart; +				ktime_t t = dma_fence_timestamp(tmp); + +				if (ktime_after(t, timestamp)) +					timestamp = t;  			}  		} +	} -		if (tmp) { -			array[count++] = dma_fence_get(tmp); -			fences[sel] = dma_fence_unwrap_next(&iter[sel]); -		} -	} while (tmp); +	if (count == 0 || count == 1) +		goto return_fastpath; -	if (count == 0) { -		tmp = dma_fence_allocate_private_stub(ktime_get()); -		goto return_tmp; -	} +	sort(array, count, sizeof(*array), fence_cmp, NULL); -	if (count == 1) { -		tmp = array[0]; -		goto return_tmp; +	/* +	 * Only keep the most recent fence for each context. +	 */ +	j = 0; +	for (i = 1; i < count; i++) { +		if (array[i]->context == array[j]->context) +			dma_fence_put(array[i]); +		else +			array[++j] = array[i];  	} - -	result = dma_fence_array_create(count, array, -					dma_fence_context_alloc(1), -					1, false); -	if (!result) { -		tmp = NULL; -		goto return_tmp; +	count = ++j; + +	if (count > 1) { +		result = dma_fence_array_create(count, array, +						dma_fence_context_alloc(1), +						1, false); +		if (!result) { +			for (i = 0; i < count; i++) +				dma_fence_put(array[i]); +			tmp = NULL; +			goto return_tmp; +		} +		return &result->base;  	} -	return &result->base; + +return_fastpath: +	if (count == 0) +		tmp = dma_fence_allocate_private_stub(timestamp); +	else +		tmp = array[0];  return_tmp:  	kfree(array); diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index 8ce1f074c2d3..cc7398cc17d6 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -297,7 +297,7 @@ static const struct dma_buf_ops udmabuf_ops = {  };  #define SEALS_WANTED (F_SEAL_SHRINK) -#define SEALS_DENIED (F_SEAL_WRITE) +#define SEALS_DENIED (F_SEAL_WRITE|F_SEAL_FUTURE_WRITE)  static int check_memfd_seals(struct file *memfd)  { @@ -317,12 +317,10 @@ static int check_memfd_seals(struct file *memfd)  	return 0;  } -static int export_udmabuf(struct udmabuf *ubuf, -			  struct miscdevice *device, -			  u32 flags) +static struct dma_buf *export_udmabuf(struct udmabuf *ubuf, +				      struct miscdevice *device)  {  	DEFINE_DMA_BUF_EXPORT_INFO(exp_info); -	struct dma_buf *buf;  	ubuf->device = device;  	exp_info.ops  = &udmabuf_ops; @@ -330,11 +328,7 @@ static int export_udmabuf(struct udmabuf *ubuf,  	exp_info.priv = ubuf;  	exp_info.flags = O_RDWR; -	buf = dma_buf_export(&exp_info); -	if (IS_ERR(buf)) -		return PTR_ERR(buf); - -	return dma_buf_fd(buf, flags); +	return dma_buf_export(&exp_info);  }  static long udmabuf_pin_folios(struct udmabuf *ubuf, struct file *memfd, @@ -391,6 +385,7 @@ static long udmabuf_create(struct miscdevice *device,  	struct folio **folios = NULL;  	pgoff_t pgcnt = 0, pglimit;  	struct udmabuf *ubuf; +	struct dma_buf *dmabuf;  	long ret = -EINVAL;  	u32 i, flags; @@ -436,23 +431,39 @@ static long udmabuf_create(struct miscdevice *device,  			goto err;  		} +		/* +		 * Take the inode lock to protect against concurrent +		 * memfd_add_seals(), which takes this lock in write mode. +		 */ +		inode_lock_shared(file_inode(memfd));  		ret = check_memfd_seals(memfd); -		if (ret < 0) { -			fput(memfd); -			goto err; -		} +		if (ret) +			goto out_unlock;  		ret = udmabuf_pin_folios(ubuf, memfd, list[i].offset,  					 list[i].size, folios); +out_unlock: +		inode_unlock_shared(file_inode(memfd));  		fput(memfd);  		if (ret)  			goto err;  	}  	flags = head->flags & UDMABUF_FLAGS_CLOEXEC ? O_CLOEXEC : 0; -	ret = export_udmabuf(ubuf, device, flags); -	if (ret < 0) +	dmabuf = export_udmabuf(ubuf, device); +	if (IS_ERR(dmabuf)) { +		ret = PTR_ERR(dmabuf);  		goto err; +	} +	/* +	 * Ownership of ubuf is held by the dmabuf from here. +	 * If the following dma_buf_fd() fails, dma_buf_put() cleans up both the +	 * dmabuf and the ubuf (through udmabuf_ops.release). +	 */ + +	ret = dma_buf_fd(dmabuf, flags); +	if (ret < 0) +		dma_buf_put(dmabuf);  	kvfree(folios);  	return ret; diff --git a/drivers/dma/amd/qdma/qdma.c b/drivers/dma/amd/qdma/qdma.c index 6d9079458fe9..66f00ad67351 100644 --- a/drivers/dma/amd/qdma/qdma.c +++ b/drivers/dma/amd/qdma/qdma.c @@ -7,9 +7,9 @@  #include <linux/bitfield.h>  #include <linux/bitops.h>  #include <linux/dmaengine.h> +#include <linux/dma-mapping.h>  #include <linux/module.h>  #include <linux/mod_devicetable.h> -#include <linux/dma-map-ops.h>  #include <linux/platform_device.h>  #include <linux/platform_data/amd_qdma.h>  #include <linux/regmap.h> @@ -492,18 +492,9 @@ static int qdma_device_verify(struct qdma_device *qdev)  static int qdma_device_setup(struct qdma_device *qdev)  { -	struct device *dev = &qdev->pdev->dev;  	u32 ring_sz = QDMA_DEFAULT_RING_SIZE;  	int ret = 0; -	while (dev && get_dma_ops(dev)) -		dev = dev->parent; -	if (!dev) { -		qdma_err(qdev, "dma device not found"); -		return -EINVAL; -	} -	set_dma_ops(&qdev->pdev->dev, get_dma_ops(dev)); -  	ret = qdma_setup_fmap_context(qdev);  	if (ret) {  		qdma_err(qdev, "Failed setup fmap context"); @@ -548,11 +539,12 @@ static void qdma_free_queue_resources(struct dma_chan *chan)  {  	struct qdma_queue *queue = to_qdma_queue(chan);  	struct qdma_device *qdev = queue->qdev; -	struct device *dev = qdev->dma_dev.dev; +	struct qdma_platdata *pdata;  	qdma_clear_queue_context(queue);  	vchan_free_chan_resources(&queue->vchan); -	dma_free_coherent(dev, queue->ring_size * QDMA_MM_DESC_SIZE, +	pdata = dev_get_platdata(&qdev->pdev->dev); +	dma_free_coherent(pdata->dma_dev, queue->ring_size * QDMA_MM_DESC_SIZE,  			  queue->desc_base, queue->dma_desc_base);  } @@ -565,6 +557,7 @@ static int qdma_alloc_queue_resources(struct dma_chan *chan)  	struct qdma_queue *queue = to_qdma_queue(chan);  	struct qdma_device *qdev = queue->qdev;  	struct qdma_ctxt_sw_desc desc; +	struct qdma_platdata *pdata;  	size_t size;  	int ret; @@ -572,8 +565,9 @@ static int qdma_alloc_queue_resources(struct dma_chan *chan)  	if (ret)  		return ret; +	pdata = dev_get_platdata(&qdev->pdev->dev);  	size = queue->ring_size * QDMA_MM_DESC_SIZE; -	queue->desc_base = dma_alloc_coherent(qdev->dma_dev.dev, size, +	queue->desc_base = dma_alloc_coherent(pdata->dma_dev, size,  					      &queue->dma_desc_base,  					      GFP_KERNEL);  	if (!queue->desc_base) { @@ -588,7 +582,7 @@ static int qdma_alloc_queue_resources(struct dma_chan *chan)  	if (ret) {  		qdma_err(qdev, "Failed to setup SW desc ctxt for %s",  			 chan->name); -		dma_free_coherent(qdev->dma_dev.dev, size, queue->desc_base, +		dma_free_coherent(pdata->dma_dev, size, queue->desc_base,  				  queue->dma_desc_base);  		return ret;  	} @@ -948,8 +942,9 @@ static int qdma_init_error_irq(struct qdma_device *qdev)  static int qdmam_alloc_qintr_rings(struct qdma_device *qdev)  { -	u32 ctxt[QDMA_CTXT_REGMAP_LEN]; +	struct qdma_platdata *pdata = dev_get_platdata(&qdev->pdev->dev);  	struct device *dev = &qdev->pdev->dev; +	u32 ctxt[QDMA_CTXT_REGMAP_LEN];  	struct qdma_intr_ring *ring;  	struct qdma_ctxt_intr intr_ctxt;  	u32 vector; @@ -969,7 +964,8 @@ static int qdmam_alloc_qintr_rings(struct qdma_device *qdev)  		ring->msix_id = qdev->err_irq_idx + i + 1;  		ring->ridx = i;  		ring->color = 1; -		ring->base = dmam_alloc_coherent(dev, QDMA_INTR_RING_SIZE, +		ring->base = dmam_alloc_coherent(pdata->dma_dev, +						 QDMA_INTR_RING_SIZE,  						 &ring->dev_base, GFP_KERNEL);  		if (!ring->base) {  			qdma_err(qdev, "Failed to alloc intr ring %d", i); diff --git a/drivers/dma/apple-admac.c b/drivers/dma/apple-admac.c index c499173d80b2..bd49f0374291 100644 --- a/drivers/dma/apple-admac.c +++ b/drivers/dma/apple-admac.c @@ -153,6 +153,8 @@ static int admac_alloc_sram_carveout(struct admac_data *ad,  {  	struct admac_sram *sram;  	int i, ret = 0, nblocks; +	ad->txcache.size = readl_relaxed(ad->base + REG_TX_SRAM_SIZE); +	ad->rxcache.size = readl_relaxed(ad->base + REG_RX_SRAM_SIZE);  	if (dir == DMA_MEM_TO_DEV)  		sram = &ad->txcache; @@ -912,12 +914,7 @@ static int admac_probe(struct platform_device *pdev)  		goto free_irq;  	} -	ad->txcache.size = readl_relaxed(ad->base + REG_TX_SRAM_SIZE); -	ad->rxcache.size = readl_relaxed(ad->base + REG_RX_SRAM_SIZE); -  	dev_info(&pdev->dev, "Audio DMA Controller\n"); -	dev_info(&pdev->dev, "imprint %x TX cache %u RX cache %u\n", -		 readl_relaxed(ad->base + REG_IMPRINT), ad->txcache.size, ad->rxcache.size);  	return 0; diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c index 9c7b40220004..ba25c23164e7 100644 --- a/drivers/dma/at_xdmac.c +++ b/drivers/dma/at_xdmac.c @@ -1363,6 +1363,8 @@ at_xdmac_prep_dma_memset(struct dma_chan *chan, dma_addr_t dest, int value,  		return NULL;  	desc = at_xdmac_memset_create_desc(chan, atchan, dest, len, value); +	if (!desc) +		return NULL;  	list_add_tail(&desc->desc_node, &desc->descs_list);  	desc->tx_dma_desc.cookie = -EBUSY; diff --git a/drivers/dma/dw/acpi.c b/drivers/dma/dw/acpi.c index c510c109d2c3..b6452fffa657 100644 --- a/drivers/dma/dw/acpi.c +++ b/drivers/dma/dw/acpi.c @@ -8,13 +8,15 @@  static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param)  { +	struct dw_dma *dw = to_dw_dma(chan->device); +	struct dw_dma_chip_pdata *data = dev_get_drvdata(dw->dma.dev);  	struct acpi_dma_spec *dma_spec = param;  	struct dw_dma_slave slave = {  		.dma_dev = dma_spec->dev,  		.src_id = dma_spec->slave_id,  		.dst_id = dma_spec->slave_id, -		.m_master = 0, -		.p_master = 1, +		.m_master = data->m_master, +		.p_master = data->p_master,  	};  	return dw_dma_filter(chan, &slave); diff --git a/drivers/dma/dw/internal.h b/drivers/dma/dw/internal.h index 563ce73488db..f1bd06a20cd6 100644 --- a/drivers/dma/dw/internal.h +++ b/drivers/dma/dw/internal.h @@ -51,11 +51,15 @@ struct dw_dma_chip_pdata {  	int (*probe)(struct dw_dma_chip *chip);  	int (*remove)(struct dw_dma_chip *chip);  	struct dw_dma_chip *chip; +	u8 m_master; +	u8 p_master;  };  static __maybe_unused const struct dw_dma_chip_pdata dw_dma_chip_pdata = {  	.probe = dw_dma_probe,  	.remove = dw_dma_remove, +	.m_master = 0, +	.p_master = 1,  };  static const struct dw_dma_platform_data idma32_pdata = { @@ -72,6 +76,8 @@ static __maybe_unused const struct dw_dma_chip_pdata idma32_chip_pdata = {  	.pdata = &idma32_pdata,  	.probe = idma32_dma_probe,  	.remove = idma32_dma_remove, +	.m_master = 0, +	.p_master = 0,  };  static const struct dw_dma_platform_data xbar_pdata = { @@ -88,6 +94,8 @@ static __maybe_unused const struct dw_dma_chip_pdata xbar_chip_pdata = {  	.pdata = &xbar_pdata,  	.probe = idma32_dma_probe,  	.remove = idma32_dma_remove, +	.m_master = 0, +	.p_master = 0,  };  #endif /* _DMA_DW_INTERNAL_H */ diff --git a/drivers/dma/dw/pci.c b/drivers/dma/dw/pci.c index ad2d4d012cf7..e8a0eb81726a 100644 --- a/drivers/dma/dw/pci.c +++ b/drivers/dma/dw/pci.c @@ -56,10 +56,10 @@ static int dw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid)  	if (ret)  		return ret; -	dw_dma_acpi_controller_register(chip->dw); -  	pci_set_drvdata(pdev, data); +	dw_dma_acpi_controller_register(chip->dw); +  	return 0;  } diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h index ce37e1ee9c46..fe8f103d4a63 100644 --- a/drivers/dma/fsl-edma-common.h +++ b/drivers/dma/fsl-edma-common.h @@ -166,6 +166,7 @@ struct fsl_edma_chan {  	struct work_struct		issue_worker;  	struct platform_device		*pdev;  	struct device			*pd_dev; +	struct device_link		*pd_dev_link;  	u32				srcid;  	struct clk			*clk;  	int                             priority; diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c index 60de1003193a..1a613236b3e4 100644 --- a/drivers/dma/fsl-edma-main.c +++ b/drivers/dma/fsl-edma-main.c @@ -417,10 +417,33 @@ static const struct of_device_id fsl_edma_dt_ids[] = {  };  MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids); +static void fsl_edma3_detach_pd(struct fsl_edma_engine *fsl_edma) +{ +	struct fsl_edma_chan *fsl_chan; +	int i; + +	for (i = 0; i < fsl_edma->n_chans; i++) { +		if (fsl_edma->chan_masked & BIT(i)) +			continue; +		fsl_chan = &fsl_edma->chans[i]; +		if (fsl_chan->pd_dev_link) +			device_link_del(fsl_chan->pd_dev_link); +		if (fsl_chan->pd_dev) { +			dev_pm_domain_detach(fsl_chan->pd_dev, false); +			pm_runtime_dont_use_autosuspend(fsl_chan->pd_dev); +			pm_runtime_set_suspended(fsl_chan->pd_dev); +		} +	} +} + +static void devm_fsl_edma3_detach_pd(void *data) +{ +	fsl_edma3_detach_pd(data); +} +  static int fsl_edma3_attach_pd(struct platform_device *pdev, struct fsl_edma_engine *fsl_edma)  {  	struct fsl_edma_chan *fsl_chan; -	struct device_link *link;  	struct device *pd_chan;  	struct device *dev;  	int i; @@ -436,15 +459,16 @@ static int fsl_edma3_attach_pd(struct platform_device *pdev, struct fsl_edma_eng  		pd_chan = dev_pm_domain_attach_by_id(dev, i);  		if (IS_ERR_OR_NULL(pd_chan)) {  			dev_err(dev, "Failed attach pd %d\n", i); -			return -EINVAL; +			goto detach;  		} -		link = device_link_add(dev, pd_chan, DL_FLAG_STATELESS | +		fsl_chan->pd_dev_link = device_link_add(dev, pd_chan, DL_FLAG_STATELESS |  					     DL_FLAG_PM_RUNTIME |  					     DL_FLAG_RPM_ACTIVE); -		if (!link) { +		if (!fsl_chan->pd_dev_link) {  			dev_err(dev, "Failed to add device_link to %d\n", i); -			return -EINVAL; +			dev_pm_domain_detach(pd_chan, false); +			goto detach;  		}  		fsl_chan->pd_dev = pd_chan; @@ -455,6 +479,10 @@ static int fsl_edma3_attach_pd(struct platform_device *pdev, struct fsl_edma_eng  	}  	return 0; + +detach: +	fsl_edma3_detach_pd(fsl_edma); +	return -EINVAL;  }  static int fsl_edma_probe(struct platform_device *pdev) @@ -544,6 +572,9 @@ static int fsl_edma_probe(struct platform_device *pdev)  		ret = fsl_edma3_attach_pd(pdev, fsl_edma);  		if (ret)  			return ret; +		ret = devm_add_action_or_reset(&pdev->dev, devm_fsl_edma3_detach_pd, fsl_edma); +		if (ret) +			return ret;  	}  	if (drvdata->flags & FSL_EDMA_DRV_TCD64) diff --git a/drivers/dma/idxd/Makefile b/drivers/dma/idxd/Makefile index 2b4a0d406e1e..9ff9d7b87b64 100644 --- a/drivers/dma/idxd/Makefile +++ b/drivers/dma/idxd/Makefile @@ -1,4 +1,4 @@ -ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=IDXD +ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"IDXD"'  obj-$(CONFIG_INTEL_IDXD_BUS) += idxd_bus.o  idxd_bus-y := bus.o diff --git a/drivers/dma/idxd/compat.c b/drivers/dma/idxd/compat.c index a4adb0c17995..eff9943f1a42 100644 --- a/drivers/dma/idxd/compat.c +++ b/drivers/dma/idxd/compat.c @@ -103,4 +103,4 @@ struct idxd_device_driver dsa_drv = {  };  module_idxd_driver(dsa_drv); -MODULE_IMPORT_NS(IDXD); +MODULE_IMPORT_NS("IDXD"); diff --git a/drivers/dma/idxd/device.c b/drivers/dma/idxd/device.c index c41ef195eeb9..5cf419fe6b46 100644 --- a/drivers/dma/idxd/device.c +++ b/drivers/dma/idxd/device.c @@ -161,7 +161,7 @@ int idxd_wq_alloc_resources(struct idxd_wq *wq)  	free_hw_descs(wq);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(idxd_wq_alloc_resources, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_wq_alloc_resources, "IDXD");  void idxd_wq_free_resources(struct idxd_wq *wq)  { @@ -175,7 +175,7 @@ void idxd_wq_free_resources(struct idxd_wq *wq)  	dma_free_coherent(dev, wq->compls_size, wq->compls, wq->compls_addr);  	sbitmap_queue_free(&wq->sbq);  } -EXPORT_SYMBOL_NS_GPL(idxd_wq_free_resources, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_wq_free_resources, "IDXD");  int idxd_wq_enable(struct idxd_wq *wq)  { @@ -407,7 +407,7 @@ int idxd_wq_init_percpu_ref(struct idxd_wq *wq)  	reinit_completion(&wq->wq_resurrect);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(idxd_wq_init_percpu_ref, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_wq_init_percpu_ref, "IDXD");  void __idxd_wq_quiesce(struct idxd_wq *wq)  { @@ -417,7 +417,7 @@ void __idxd_wq_quiesce(struct idxd_wq *wq)  	complete_all(&wq->wq_resurrect);  	wait_for_completion(&wq->wq_dead);  } -EXPORT_SYMBOL_NS_GPL(__idxd_wq_quiesce, IDXD); +EXPORT_SYMBOL_NS_GPL(__idxd_wq_quiesce, "IDXD");  void idxd_wq_quiesce(struct idxd_wq *wq)  { @@ -425,7 +425,7 @@ void idxd_wq_quiesce(struct idxd_wq *wq)  	__idxd_wq_quiesce(wq);  	mutex_unlock(&wq->wq_lock);  } -EXPORT_SYMBOL_NS_GPL(idxd_wq_quiesce, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_wq_quiesce, "IDXD");  /* Device control bits */  static inline bool idxd_is_enabled(struct idxd_device *idxd) @@ -1494,7 +1494,7 @@ err_map_portal:  err:  	return rc;  } -EXPORT_SYMBOL_NS_GPL(idxd_drv_enable_wq, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_drv_enable_wq, "IDXD");  void idxd_drv_disable_wq(struct idxd_wq *wq)  { @@ -1516,7 +1516,7 @@ void idxd_drv_disable_wq(struct idxd_wq *wq)  	wq->type = IDXD_WQT_NONE;  	wq->client_count = 0;  } -EXPORT_SYMBOL_NS_GPL(idxd_drv_disable_wq, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_drv_disable_wq, "IDXD");  int idxd_device_drv_probe(struct idxd_dev *idxd_dev)  { diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c index 234c1c658ec7..140f8d772bee 100644 --- a/drivers/dma/idxd/init.c +++ b/drivers/dma/idxd/init.c @@ -25,7 +25,7 @@ MODULE_VERSION(IDXD_DRIVER_VERSION);  MODULE_DESCRIPTION("Intel Data Streaming Accelerator and In-Memory Analytics Accelerator common driver");  MODULE_LICENSE("GPL v2");  MODULE_AUTHOR("Intel Corporation"); -MODULE_IMPORT_NS(IDXD); +MODULE_IMPORT_NS("IDXD");  static bool sva = true;  module_param(sva, bool, 0644); diff --git a/drivers/dma/idxd/submit.c b/drivers/dma/idxd/submit.c index 94eca25ae9b9..6db1c5fcedc5 100644 --- a/drivers/dma/idxd/submit.c +++ b/drivers/dma/idxd/submit.c @@ -61,7 +61,7 @@ struct idxd_desc *idxd_alloc_desc(struct idxd_wq *wq, enum idxd_op_type optype)  	return __get_desc(wq, idx, cpu);  } -EXPORT_SYMBOL_NS_GPL(idxd_alloc_desc, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_alloc_desc, "IDXD");  void idxd_free_desc(struct idxd_wq *wq, struct idxd_desc *desc)  { @@ -70,7 +70,7 @@ void idxd_free_desc(struct idxd_wq *wq, struct idxd_desc *desc)  	desc->cpu = -1;  	sbitmap_queue_clear(&wq->sbq, desc->id, cpu);  } -EXPORT_SYMBOL_NS_GPL(idxd_free_desc, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_free_desc, "IDXD");  static struct idxd_desc *list_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,  					 struct idxd_desc *desc) @@ -219,4 +219,4 @@ int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)  	percpu_ref_put(&wq->wq_active);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(idxd_submit_desc, IDXD); +EXPORT_SYMBOL_NS_GPL(idxd_submit_desc, "IDXD"); diff --git a/drivers/dma/loongson2-apb-dma.c b/drivers/dma/loongson2-apb-dma.c index 367ed34ce4da..c528f02b9f84 100644 --- a/drivers/dma/loongson2-apb-dma.c +++ b/drivers/dma/loongson2-apb-dma.c @@ -31,7 +31,7 @@  #define LDMA_ASK_VALID		BIT(2)  #define LDMA_START		BIT(3) /* DMA start operation */  #define LDMA_STOP		BIT(4) /* DMA stop operation */ -#define LDMA_CONFIG_MASK	GENMASK(4, 0) /* DMA controller config bits mask */ +#define LDMA_CONFIG_MASK	GENMASK_ULL(4, 0) /* DMA controller config bits mask */  /* Bitfields in ndesc_addr field of HW descriptor */  #define LDMA_DESC_EN		BIT(0) /*1: The next descriptor is valid */ diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index 43efce77bb57..40b76b40bc30 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c @@ -1388,6 +1388,7 @@ static int mv_xor_probe(struct platform_device *pdev)  			irq = irq_of_parse_and_map(np, 0);  			if (!irq) {  				ret = -ENODEV; +				of_node_put(np);  				goto err_channel_add;  			} @@ -1396,6 +1397,7 @@ static int mv_xor_probe(struct platform_device *pdev)  			if (IS_ERR(chan)) {  				ret = PTR_ERR(chan);  				irq_dispose_mapping(irq); +				of_node_put(np);  				goto err_channel_add;  			} diff --git a/drivers/dma/tegra186-gpc-dma.c b/drivers/dma/tegra186-gpc-dma.c index cacf3757adc2..4d6fe0efa76e 100644 --- a/drivers/dma/tegra186-gpc-dma.c +++ b/drivers/dma/tegra186-gpc-dma.c @@ -231,6 +231,7 @@ struct tegra_dma_channel {  	bool config_init;  	char name[30];  	enum dma_transfer_direction sid_dir; +	enum dma_status status;  	int id;  	int irq;  	int slave_id; @@ -393,6 +394,8 @@ static int tegra_dma_pause(struct tegra_dma_channel *tdc)  		tegra_dma_dump_chan_regs(tdc);  	} +	tdc->status = DMA_PAUSED; +  	return ret;  } @@ -419,6 +422,8 @@ static void tegra_dma_resume(struct tegra_dma_channel *tdc)  	val = tdc_read(tdc, TEGRA_GPCDMA_CHAN_CSRE);  	val &= ~TEGRA_GPCDMA_CHAN_CSRE_PAUSE;  	tdc_write(tdc, TEGRA_GPCDMA_CHAN_CSRE, val); + +	tdc->status = DMA_IN_PROGRESS;  }  static int tegra_dma_device_resume(struct dma_chan *dc) @@ -544,6 +549,7 @@ static void tegra_dma_xfer_complete(struct tegra_dma_channel *tdc)  	tegra_dma_sid_free(tdc);  	tdc->dma_desc = NULL; +	tdc->status = DMA_COMPLETE;  }  static void tegra_dma_chan_decode_error(struct tegra_dma_channel *tdc, @@ -716,6 +722,7 @@ static int tegra_dma_terminate_all(struct dma_chan *dc)  		tdc->dma_desc = NULL;  	} +	tdc->status = DMA_COMPLETE;  	tegra_dma_sid_free(tdc);  	vchan_get_all_descriptors(&tdc->vc, &head);  	spin_unlock_irqrestore(&tdc->vc.lock, flags); @@ -769,6 +776,9 @@ static enum dma_status tegra_dma_tx_status(struct dma_chan *dc,  	if (ret == DMA_COMPLETE)  		return ret; +	if (tdc->status == DMA_PAUSED) +		ret = DMA_PAUSED; +  	spin_lock_irqsave(&tdc->vc.lock, flags);  	vd = vchan_find_desc(&tdc->vc, cookie);  	if (vd) { diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c index fe89f5c4837f..3e971f902363 100644 --- a/drivers/edac/altera_edac.c +++ b/drivers/edac/altera_edac.c @@ -482,7 +482,7 @@ static const struct dev_pm_ops altr_sdram_pm_ops = {  static struct platform_driver altr_sdram_edac_driver = {  	.probe = altr_sdram_probe, -	.remove_new = altr_sdram_remove, +	.remove = altr_sdram_remove,  	.driver = {  		.name = "altr_sdram_edac",  #ifdef CONFIG_PM @@ -816,7 +816,7 @@ static void altr_edac_device_remove(struct platform_device *pdev)  static struct platform_driver altr_edac_device_driver = {  	.probe =  altr_edac_device_probe, -	.remove_new = altr_edac_device_remove, +	.remove = altr_edac_device_remove,  	.driver = {  		.name = "altr_edac_device",  		.of_match_table = altr_edac_device_of_match, diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index ddfbdb66b794..5d356b7c4589 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c @@ -3362,36 +3362,24 @@ static bool dct_ecc_enabled(struct amd64_pvt *pvt)  static bool umc_ecc_enabled(struct amd64_pvt *pvt)  { -	u8 umc_en_mask = 0, ecc_en_mask = 0; -	u16 nid = pvt->mc_node_id;  	struct amd64_umc *umc; -	u8 ecc_en = 0, i; +	bool ecc_en = false; +	int i; +	/* Check whether at least one UMC is enabled: */  	for_each_umc(i) {  		umc = &pvt->umc[i]; -		/* Only check enabled UMCs. */ -		if (!(umc->sdp_ctrl & UMC_SDP_INIT)) -			continue; - -		umc_en_mask |= BIT(i); - -		if (umc->umc_cap_hi & UMC_ECC_ENABLED) -			ecc_en_mask |= BIT(i); +		if (umc->sdp_ctrl & UMC_SDP_INIT && +		    umc->umc_cap_hi & UMC_ECC_ENABLED) { +			ecc_en = true; +			break; +		}  	} -	/* Check whether at least one UMC is enabled: */ -	if (umc_en_mask) -		ecc_en = umc_en_mask == ecc_en_mask; -	else -		edac_dbg(0, "Node %d: No enabled UMCs.\n", nid); - -	edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, (ecc_en ? "enabled" : "disabled")); +	edac_dbg(3, "Node %d: DRAM ECC %s.\n", pvt->mc_node_id, (ecc_en ? "enabled" : "disabled")); -	if (!ecc_en) -		return false; -	else -		return true; +	return ecc_en;  }  static inline void diff --git a/drivers/edac/armada_xp_edac.c b/drivers/edac/armada_xp_edac.c index 589bc81f1249..d64248fcf4c0 100644 --- a/drivers/edac/armada_xp_edac.c +++ b/drivers/edac/armada_xp_edac.c @@ -364,7 +364,7 @@ static void axp_mc_remove(struct platform_device *pdev)  static struct platform_driver axp_mc_driver = {  	.probe = axp_mc_probe, -	.remove_new = axp_mc_remove, +	.remove = axp_mc_remove,  	.driver = {  		.name = "armada_xp_mc_edac",  		.of_match_table = of_match_ptr(axp_mc_of_match), @@ -579,7 +579,7 @@ static void aurora_l2_remove(struct platform_device *pdev)  static struct platform_driver aurora_l2_driver = {  	.probe = aurora_l2_probe, -	.remove_new = aurora_l2_remove, +	.remove = aurora_l2_remove,  	.driver = {  		.name = "aurora_l2_edac",  		.of_match_table = of_match_ptr(aurora_l2_of_match), diff --git a/drivers/edac/aspeed_edac.c b/drivers/edac/aspeed_edac.c index 157a480eb761..dadb8acbee3d 100644 --- a/drivers/edac/aspeed_edac.c +++ b/drivers/edac/aspeed_edac.c @@ -387,7 +387,7 @@ static struct platform_driver aspeed_driver = {  		.of_match_table = aspeed_of_match  	},  	.probe		= aspeed_probe, -	.remove_new	= aspeed_remove +	.remove		= aspeed_remove  };  module_platform_driver(aspeed_driver); diff --git a/drivers/edac/bluefield_edac.c b/drivers/edac/bluefield_edac.c index 739132e5ed8a..4942a240c30f 100644 --- a/drivers/edac/bluefield_edac.c +++ b/drivers/edac/bluefield_edac.c @@ -474,7 +474,7 @@ static struct platform_driver bluefield_edac_mc_driver = {  		.acpi_match_table = bluefield_mc_acpi_ids,  	},  	.probe = bluefield_edac_mc_probe, -	.remove_new = bluefield_edac_mc_remove, +	.remove = bluefield_edac_mc_remove,  };  module_platform_driver(bluefield_edac_mc_driver); diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c index 2000f66fbf5c..c2420e2287ff 100644 --- a/drivers/edac/cell_edac.c +++ b/drivers/edac/cell_edac.c @@ -246,7 +246,7 @@ static struct platform_driver cell_edac_driver = {  		.name	= "cbe-mic",  	},  	.probe		= cell_edac_probe, -	.remove_new	= cell_edac_remove, +	.remove		= cell_edac_remove,  };  static int __init cell_edac_init(void) diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c index eb702bc3aa29..9c9e4369c041 100644 --- a/drivers/edac/cpc925_edac.c +++ b/drivers/edac/cpc925_edac.c @@ -1027,7 +1027,7 @@ static void cpc925_remove(struct platform_device *pdev)  static struct platform_driver cpc925_edac_driver = {  	.probe = cpc925_probe, -	.remove_new = cpc925_remove, +	.remove = cpc925_remove,  	.driver = {  		   .name = "cpc925_edac",  	} diff --git a/drivers/edac/dmc520_edac.c b/drivers/edac/dmc520_edac.c index 5e52d31db3b8..64a4d0a07032 100644 --- a/drivers/edac/dmc520_edac.c +++ b/drivers/edac/dmc520_edac.c @@ -640,7 +640,7 @@ static struct platform_driver dmc520_edac_driver = {  	},  	.probe = dmc520_edac_probe, -	.remove_new = dmc520_edac_remove +	.remove = dmc520_edac_remove  };  module_platform_driver(dmc520_edac_driver); diff --git a/drivers/edac/highbank_l2_edac.c b/drivers/edac/highbank_l2_edac.c index 282ca6535f8f..24f163ff323f 100644 --- a/drivers/edac/highbank_l2_edac.c +++ b/drivers/edac/highbank_l2_edac.c @@ -128,7 +128,7 @@ static void highbank_l2_err_remove(struct platform_device *pdev)  static struct platform_driver highbank_l2_edac_driver = {  	.probe = highbank_l2_err_probe, -	.remove_new = highbank_l2_err_remove, +	.remove = highbank_l2_err_remove,  	.driver = {  		.name = "hb_l2_edac",  		.of_match_table = hb_l2_err_of_match, diff --git a/drivers/edac/highbank_mc_edac.c b/drivers/edac/highbank_mc_edac.c index 1c5b888ab11d..a8879d72d064 100644 --- a/drivers/edac/highbank_mc_edac.c +++ b/drivers/edac/highbank_mc_edac.c @@ -261,7 +261,7 @@ static void highbank_mc_remove(struct platform_device *pdev)  static struct platform_driver highbank_mc_edac_driver = {  	.probe = highbank_mc_probe, -	.remove_new = highbank_mc_remove, +	.remove = highbank_mc_remove,  	.driver = {  		.name = "hb_mc_edac",  		.of_match_table = hb_ddr_ctrl_of_match, diff --git a/drivers/edac/layerscape_edac.c b/drivers/edac/layerscape_edac.c index 9a0c92ebbc3c..a2caa7fc5412 100644 --- a/drivers/edac/layerscape_edac.c +++ b/drivers/edac/layerscape_edac.c @@ -28,7 +28,7 @@ MODULE_DEVICE_TABLE(of, fsl_ddr_mc_err_of_match);  static struct platform_driver fsl_ddr_mc_err_driver = {  	.probe = fsl_mc_err_probe, -	.remove_new = fsl_mc_err_remove, +	.remove = fsl_mc_err_remove,  	.driver = {  		.name = "fsl_ddr_mc_err",  		.of_match_table = fsl_ddr_mc_err_of_match, diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index d0266cbcbeda..a45dc6b35ede 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c @@ -323,7 +323,7 @@ static const struct platform_device_id mpc85xx_pci_err_match[] = {  static struct platform_driver mpc85xx_pci_err_driver = {  	.probe = mpc85xx_pci_err_probe, -	.remove_new = mpc85xx_pci_err_remove, +	.remove = mpc85xx_pci_err_remove,  	.id_table = mpc85xx_pci_err_match,  	.driver = {  		.name = "mpc85xx_pci_err", @@ -627,7 +627,7 @@ MODULE_DEVICE_TABLE(of, mpc85xx_l2_err_of_match);  static struct platform_driver mpc85xx_l2_err_driver = {  	.probe = mpc85xx_l2_err_probe, -	.remove_new = mpc85xx_l2_err_remove, +	.remove = mpc85xx_l2_err_remove,  	.driver = {  		.name = "mpc85xx_l2_err",  		.of_match_table = mpc85xx_l2_err_of_match, @@ -656,7 +656,7 @@ MODULE_DEVICE_TABLE(of, mpc85xx_mc_err_of_match);  static struct platform_driver mpc85xx_mc_err_driver = {  	.probe = fsl_mc_err_probe, -	.remove_new = fsl_mc_err_remove, +	.remove = fsl_mc_err_remove,  	.driver = {  		.name = "mpc85xx_mc_err",  		.of_match_table = mpc85xx_mc_err_of_match, diff --git a/drivers/edac/npcm_edac.c b/drivers/edac/npcm_edac.c index 2e2133b784e9..e60a99eb8cfb 100644 --- a/drivers/edac/npcm_edac.c +++ b/drivers/edac/npcm_edac.c @@ -531,7 +531,7 @@ static struct platform_driver npcm_edac_driver = {  		.of_match_table = npcm_edac_of_match,  	},  	.probe = edac_probe, -	.remove_new = edac_remove, +	.remove = edac_remove,  };  module_platform_driver(npcm_edac_driver); diff --git a/drivers/edac/octeon_edac-l2c.c b/drivers/edac/octeon_edac-l2c.c index 2adb9c8093f8..e6b1595a3cb5 100644 --- a/drivers/edac/octeon_edac-l2c.c +++ b/drivers/edac/octeon_edac-l2c.c @@ -194,7 +194,7 @@ static void octeon_l2c_remove(struct platform_device *pdev)  static struct platform_driver octeon_l2c_driver = {  	.probe = octeon_l2c_probe, -	.remove_new = octeon_l2c_remove, +	.remove = octeon_l2c_remove,  	.driver = {  		   .name = "octeon_l2c_edac",  	} diff --git a/drivers/edac/octeon_edac-lmc.c b/drivers/edac/octeon_edac-lmc.c index 4112c2ee34b8..f7176b95b4fe 100644 --- a/drivers/edac/octeon_edac-lmc.c +++ b/drivers/edac/octeon_edac-lmc.c @@ -312,7 +312,7 @@ static void octeon_lmc_edac_remove(struct platform_device *pdev)  static struct platform_driver octeon_lmc_edac_driver = {  	.probe = octeon_lmc_edac_probe, -	.remove_new = octeon_lmc_edac_remove, +	.remove = octeon_lmc_edac_remove,  	.driver = {  		   .name = "octeon_lmc_edac",  	} diff --git a/drivers/edac/octeon_edac-pc.c b/drivers/edac/octeon_edac-pc.c index d9eeb40d2784..aa1219db0b17 100644 --- a/drivers/edac/octeon_edac-pc.c +++ b/drivers/edac/octeon_edac-pc.c @@ -130,7 +130,7 @@ static void co_cache_error_remove(struct platform_device *pdev)  static struct platform_driver co_cache_error_driver = {  	.probe = co_cache_error_probe, -	.remove_new = co_cache_error_remove, +	.remove = co_cache_error_remove,  	.driver = {  		   .name = "octeon_pc_edac",  	} diff --git a/drivers/edac/octeon_edac-pci.c b/drivers/edac/octeon_edac-pci.c index 4d368af2c5f0..c4f3bc33a971 100644 --- a/drivers/edac/octeon_edac-pci.c +++ b/drivers/edac/octeon_edac-pci.c @@ -97,7 +97,7 @@ static void octeon_pci_remove(struct platform_device *pdev)  static struct platform_driver octeon_pci_driver = {  	.probe = octeon_pci_probe, -	.remove_new = octeon_pci_remove, +	.remove = octeon_pci_remove,  	.driver = {  		   .name = "octeon_pci_edac",  	} diff --git a/drivers/edac/qcom_edac.c b/drivers/edac/qcom_edac.c index a9a8ba067007..04c42c83a2ba 100644 --- a/drivers/edac/qcom_edac.c +++ b/drivers/edac/qcom_edac.c @@ -407,7 +407,7 @@ MODULE_DEVICE_TABLE(platform, qcom_llcc_edac_id_table);  static struct platform_driver qcom_llcc_edac_driver = {  	.probe = qcom_llcc_edac_probe, -	.remove_new = qcom_llcc_edac_remove, +	.remove = qcom_llcc_edac_remove,  	.driver = {  		.name = "qcom_llcc_edac",  	}, diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c index d7416166fd8a..5ed32a3299c4 100644 --- a/drivers/edac/synopsys_edac.c +++ b/drivers/edac/synopsys_edac.c @@ -1488,7 +1488,7 @@ static struct platform_driver synps_edac_mc_driver = {  		   .of_match_table = synps_edac_match,  		   },  	.probe = mc_probe, -	.remove_new = mc_remove, +	.remove = mc_remove,  };  module_platform_driver(synps_edac_mc_driver); diff --git a/drivers/edac/ti_edac.c b/drivers/edac/ti_edac.c index 29723c9592f7..39cc2ef9cac4 100644 --- a/drivers/edac/ti_edac.c +++ b/drivers/edac/ti_edac.c @@ -322,7 +322,7 @@ static void ti_edac_remove(struct platform_device *pdev)  static struct platform_driver ti_edac_driver = {  	.probe = ti_edac_probe, -	.remove_new = ti_edac_remove, +	.remove = ti_edac_remove,  	.driver = {  		   .name = EDAC_MOD_NAME,  		   .of_match_table = ti_edac_of_match, diff --git a/drivers/edac/versal_edac.c b/drivers/edac/versal_edac.c index a556d23e8261..5a43b5d43ca2 100644 --- a/drivers/edac/versal_edac.c +++ b/drivers/edac/versal_edac.c @@ -1186,7 +1186,7 @@ static struct platform_driver xilinx_ddr_edac_mc_driver = {  		.of_match_table = xlnx_edac_match,  	},  	.probe = mc_probe, -	.remove_new = mc_remove, +	.remove = mc_remove,  };  module_platform_driver(xilinx_ddr_edac_mc_driver); diff --git a/drivers/edac/xgene_edac.c b/drivers/edac/xgene_edac.c index fd87f1b2c145..699c7d29d80c 100644 --- a/drivers/edac/xgene_edac.c +++ b/drivers/edac/xgene_edac.c @@ -1989,7 +1989,7 @@ MODULE_DEVICE_TABLE(of, xgene_edac_of_match);  static struct platform_driver xgene_edac_driver = {  	.probe = xgene_edac_probe, -	.remove_new = xgene_edac_remove, +	.remove = xgene_edac_remove,  	.driver = {  		.name = "xgene-edac",  		.of_match_table = xgene_edac_of_match, diff --git a/drivers/edac/zynqmp_edac.c b/drivers/edac/zynqmp_edac.c index c9dc78d8c824..cdffc9e4194d 100644 --- a/drivers/edac/zynqmp_edac.c +++ b/drivers/edac/zynqmp_edac.c @@ -455,7 +455,7 @@ static struct platform_driver zynqmp_ocm_edac_driver = {  		   .of_match_table = zynqmp_ocm_edac_match,  		   },  	.probe = edac_probe, -	.remove_new = edac_remove, +	.remove = edac_remove,  };  module_platform_driver(zynqmp_ocm_edac_driver); diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c index 125016da7fde..46c40d85c2ac 100644 --- a/drivers/extcon/extcon-adc-jack.c +++ b/drivers/extcon/extcon-adc-jack.c @@ -196,7 +196,7 @@ static SIMPLE_DEV_PM_OPS(adc_jack_pm_ops,  static struct platform_driver adc_jack_driver = {  	.probe          = adc_jack_probe, -	.remove_new     = adc_jack_remove, +	.remove         = adc_jack_remove,  	.driver         = {  		.name   = "adc-jack",  		.pm = &adc_jack_pm_ops, diff --git a/drivers/extcon/extcon-intel-cht-wc.c b/drivers/extcon/extcon-intel-cht-wc.c index 93552dc3c895..8131a3d7d562 100644 --- a/drivers/extcon/extcon-intel-cht-wc.c +++ b/drivers/extcon/extcon-intel-cht-wc.c @@ -627,7 +627,7 @@ MODULE_DEVICE_TABLE(platform, cht_wc_extcon_table);  static struct platform_driver cht_wc_extcon_driver = {  	.probe = cht_wc_extcon_probe, -	.remove_new = cht_wc_extcon_remove, +	.remove = cht_wc_extcon_remove,  	.id_table = cht_wc_extcon_table,  	.driver = {  		.name = "cht_wcove_pwrsrc", diff --git a/drivers/extcon/extcon-intel-mrfld.c b/drivers/extcon/extcon-intel-mrfld.c index a1f737f13d49..9219f4328d70 100644 --- a/drivers/extcon/extcon-intel-mrfld.c +++ b/drivers/extcon/extcon-intel-mrfld.c @@ -275,7 +275,7 @@ static struct platform_driver mrfld_extcon_driver = {  		.name	= "mrfld_bcove_pwrsrc",  	},  	.probe		= mrfld_extcon_probe, -	.remove_new	= mrfld_extcon_remove, +	.remove		= mrfld_extcon_remove,  	.id_table	= mrfld_extcon_id_table,  };  module_platform_driver(mrfld_extcon_driver); diff --git a/drivers/extcon/extcon-max3355.c b/drivers/extcon/extcon-max3355.c index e62ce7a8d131..b2ee4ff8b04d 100644 --- a/drivers/extcon/extcon-max3355.c +++ b/drivers/extcon/extcon-max3355.c @@ -127,7 +127,7 @@ MODULE_DEVICE_TABLE(of, max3355_match_table);  static struct platform_driver max3355_driver = {  	.probe		= max3355_probe, -	.remove_new	= max3355_remove, +	.remove		= max3355_remove,  	.driver		= {  		.name	= "extcon-max3355",  		.of_match_table = max3355_match_table, diff --git a/drivers/extcon/extcon-max77843.c b/drivers/extcon/extcon-max77843.c index 9849e3b8327e..2ae9f7f1a67f 100644 --- a/drivers/extcon/extcon-max77843.c +++ b/drivers/extcon/extcon-max77843.c @@ -956,7 +956,7 @@ static struct platform_driver max77843_muic_driver = {  		.of_match_table = of_max77843_muic_dt_match,  	},  	.probe		= max77843_muic_probe, -	.remove_new	= max77843_muic_remove, +	.remove		= max77843_muic_remove,  	.id_table	= max77843_muic_id,  }; diff --git a/drivers/extcon/extcon-rtk-type-c.c b/drivers/extcon/extcon-rtk-type-c.c index 19a01e663733..bdc2b7b3a246 100644 --- a/drivers/extcon/extcon-rtk-type-c.c +++ b/drivers/extcon/extcon-rtk-type-c.c @@ -1778,7 +1778,7 @@ static const struct dev_pm_ops extcon_rtk_type_c_pm_ops = {  static struct platform_driver extcon_rtk_type_c_driver = {  	.probe		= extcon_rtk_type_c_probe, -	.remove_new	= extcon_rtk_type_c_remove, +	.remove		= extcon_rtk_type_c_remove,  	.driver		= {  		.name	= "extcon-rtk-type_c",  		.of_match_table = extcon_rtk_type_c_match, diff --git a/drivers/extcon/extcon-usb-gpio.c b/drivers/extcon/extcon-usb-gpio.c index 9b61eb99b7dc..5e8ad21ad206 100644 --- a/drivers/extcon/extcon-usb-gpio.c +++ b/drivers/extcon/extcon-usb-gpio.c @@ -279,7 +279,7 @@ MODULE_DEVICE_TABLE(platform, usb_extcon_platform_ids);  static struct platform_driver usb_extcon_driver = {  	.probe		= usb_extcon_probe, -	.remove_new	= usb_extcon_remove, +	.remove		= usb_extcon_remove,  	.driver		= {  		.name	= "extcon-usb-gpio",  		.pm	= &usb_extcon_pm_ops, diff --git a/drivers/extcon/extcon-usbc-cros-ec.c b/drivers/extcon/extcon-usbc-cros-ec.c index 805a47230689..1fb627ea8b50 100644 --- a/drivers/extcon/extcon-usbc-cros-ec.c +++ b/drivers/extcon/extcon-usbc-cros-ec.c @@ -529,7 +529,7 @@ static struct platform_driver extcon_cros_ec_driver = {  		.of_match_table = of_match_ptr(extcon_cros_ec_of_match),  		.pm = DEV_PM_OPS,  	}, -	.remove_new = extcon_cros_ec_remove, +	.remove  = extcon_cros_ec_remove,  	.probe   = extcon_cros_ec_probe,  }; diff --git a/drivers/firmware/arm_ffa/bus.c b/drivers/firmware/arm_ffa/bus.c index eb17d03b66fe..dfda5ffc14db 100644 --- a/drivers/firmware/arm_ffa/bus.c +++ b/drivers/firmware/arm_ffa/bus.c @@ -187,13 +187,18 @@ bool ffa_device_is_valid(struct ffa_device *ffa_dev)  	return valid;  } -struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id, -				       const struct ffa_ops *ops) +struct ffa_device * +ffa_device_register(const struct ffa_partition_info *part_info, +		    const struct ffa_ops *ops)  {  	int id, ret; +	uuid_t uuid;  	struct device *dev;  	struct ffa_device *ffa_dev; +	if (!part_info) +		return NULL; +  	id = ida_alloc_min(&ffa_bus_id, 1, GFP_KERNEL);  	if (id < 0)  		return NULL; @@ -210,9 +215,11 @@ struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id,  	dev_set_name(&ffa_dev->dev, "arm-ffa-%d", id);  	ffa_dev->id = id; -	ffa_dev->vm_id = vm_id; +	ffa_dev->vm_id = part_info->id; +	ffa_dev->properties = part_info->properties;  	ffa_dev->ops = ops; -	uuid_copy(&ffa_dev->uuid, uuid); +	import_uuid(&uuid, (u8 *)part_info->uuid); +	uuid_copy(&ffa_dev->uuid, &uuid);  	ret = device_register(&ffa_dev->dev);  	if (ret) { diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c index b14cbdae94e8..2c2ec3c35f15 100644 --- a/drivers/firmware/arm_ffa/driver.c +++ b/drivers/firmware/arm_ffa/driver.c @@ -1387,7 +1387,6 @@ static struct notifier_block ffa_bus_nb = {  static int ffa_setup_partitions(void)  {  	int count, idx, ret; -	uuid_t uuid;  	struct ffa_device *ffa_dev;  	struct ffa_dev_part_info *info;  	struct ffa_partition_info *pbuf, *tpbuf; @@ -1406,23 +1405,19 @@ static int ffa_setup_partitions(void)  	xa_init(&drv_info->partition_info);  	for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++) { -		import_uuid(&uuid, (u8 *)tpbuf->uuid); -  		/* Note that if the UUID will be uuid_null, that will require  		 * ffa_bus_notifier() to find the UUID of this partition id  		 * with help of ffa_device_match_uuid(). FF-A v1.1 and above  		 * provides UUID here for each partition as part of the  		 * discovery API and the same is passed.  		 */ -		ffa_dev = ffa_device_register(&uuid, tpbuf->id, &ffa_drv_ops); +		ffa_dev = ffa_device_register(tpbuf, &ffa_drv_ops);  		if (!ffa_dev) {  			pr_err("%s: failed to register partition ID 0x%x\n",  			       __func__, tpbuf->id);  			continue;  		} -		ffa_dev->properties = tpbuf->properties; -  		if (drv_info->version > FFA_VERSION_1_0 &&  		    !(tpbuf->properties & FFA_PARTITION_AARCH64_EXEC))  			ffa_mode_32bit_set(ffa_dev); diff --git a/drivers/firmware/arm_scmi/vendors/imx/Kconfig b/drivers/firmware/arm_scmi/vendors/imx/Kconfig index 2883ed24a84d..a01bf5e47301 100644 --- a/drivers/firmware/arm_scmi/vendors/imx/Kconfig +++ b/drivers/firmware/arm_scmi/vendors/imx/Kconfig @@ -15,6 +15,7 @@ config IMX_SCMI_BBM_EXT  config IMX_SCMI_MISC_EXT  	tristate "i.MX SCMI MISC EXTENSION"  	depends on ARM_SCMI_PROTOCOL || (COMPILE_TEST && OF) +	depends on IMX_SCMI_MISC_DRV  	default y if ARCH_MXC  	help  	  This enables i.MX System MISC control logic such as gpio expander diff --git a/drivers/firmware/cirrus/cs_dsp.c b/drivers/firmware/cirrus/cs_dsp.c index 419220fa42fd..5365e9a43000 100644 --- a/drivers/firmware/cirrus/cs_dsp.c +++ b/drivers/firmware/cirrus/cs_dsp.c @@ -378,7 +378,7 @@ const char *cs_dsp_mem_region_name(unsigned int type)  		return NULL;  	}  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_mem_region_name, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_mem_region_name, "FW_CS_DSP");  #ifdef CONFIG_DEBUG_FS  static void cs_dsp_debugfs_save_wmfwname(struct cs_dsp *dsp, const char *s) @@ -519,7 +519,7 @@ void cs_dsp_init_debugfs(struct cs_dsp *dsp, struct dentry *debugfs_root)  	dsp->debugfs_root = root;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_init_debugfs, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_init_debugfs, "FW_CS_DSP");  /**   * cs_dsp_cleanup_debugfs() - Removes DSP representation from debugfs @@ -531,17 +531,17 @@ void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp)  	debugfs_remove_recursive(dsp->debugfs_root);  	dsp->debugfs_root = ERR_PTR(-ENODEV);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_cleanup_debugfs, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_cleanup_debugfs, "FW_CS_DSP");  #else  void cs_dsp_init_debugfs(struct cs_dsp *dsp, struct dentry *debugfs_root)  {  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_init_debugfs, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_init_debugfs, "FW_CS_DSP");  void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp)  {  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_cleanup_debugfs, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_cleanup_debugfs, "FW_CS_DSP");  static inline void cs_dsp_debugfs_save_wmfwname(struct cs_dsp *dsp,  						const char *s) @@ -749,7 +749,7 @@ int cs_dsp_coeff_write_acked_control(struct cs_dsp_coeff_ctl *ctl, unsigned int  	return -ETIMEDOUT;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_coeff_write_acked_control, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_coeff_write_acked_control, "FW_CS_DSP");  static int cs_dsp_coeff_write_ctrl_raw(struct cs_dsp_coeff_ctl *ctl,  				       unsigned int off, const void *buf, size_t len) @@ -827,7 +827,7 @@ int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl,  	return 1;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_coeff_write_ctrl, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_coeff_write_ctrl, "FW_CS_DSP");  /**   * cs_dsp_coeff_lock_and_write_ctrl() - Writes the given buffer to the given coefficient control @@ -926,7 +926,7 @@ int cs_dsp_coeff_read_ctrl(struct cs_dsp_coeff_ctl *ctl,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_coeff_read_ctrl, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_coeff_read_ctrl, "FW_CS_DSP");  /**   * cs_dsp_coeff_lock_and_read_ctrl() - Reads the given coefficient control into the given buffer @@ -1679,7 +1679,7 @@ struct cs_dsp_coeff_ctl *cs_dsp_get_ctl(struct cs_dsp *dsp, const char *name, in  	return rslt;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_get_ctl, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_get_ctl, "FW_CS_DSP");  static void cs_dsp_ctl_fixup_base(struct cs_dsp *dsp,  				  const struct cs_dsp_alg_region *alg_region) @@ -1769,7 +1769,7 @@ struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_find_alg_region, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_find_alg_region, "FW_CS_DSP");  static struct cs_dsp_alg_region *cs_dsp_create_region(struct cs_dsp *dsp,  						      int type, __be32 id, @@ -2404,7 +2404,7 @@ int cs_dsp_adsp1_init(struct cs_dsp *dsp)  	return cs_dsp_common_init(dsp);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp1_init, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp1_init, "FW_CS_DSP");  /**   * cs_dsp_adsp1_power_up() - Load and start the named firmware @@ -2496,7 +2496,7 @@ err_mutex:  	mutex_unlock(&dsp->pwr_lock);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp1_power_up, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp1_power_up, "FW_CS_DSP");  /**   * cs_dsp_adsp1_power_down() - Halts the DSP @@ -2528,7 +2528,7 @@ void cs_dsp_adsp1_power_down(struct cs_dsp *dsp)  	mutex_unlock(&dsp->pwr_lock);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp1_power_down, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp1_power_down, "FW_CS_DSP");  static int cs_dsp_adsp2v2_enable_core(struct cs_dsp *dsp)  { @@ -2680,7 +2680,7 @@ int cs_dsp_set_dspclk(struct cs_dsp *dsp, unsigned int freq)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_set_dspclk, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_set_dspclk, "FW_CS_DSP");  static void cs_dsp_stop_watchdog(struct cs_dsp *dsp)  { @@ -2770,7 +2770,7 @@ err_mutex:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_power_up, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_power_up, "FW_CS_DSP");  /**   * cs_dsp_power_down() - Powers-down the DSP @@ -2804,7 +2804,7 @@ void cs_dsp_power_down(struct cs_dsp *dsp)  	cs_dsp_dbg(dsp, "Shutdown complete\n");  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_power_down, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_power_down, "FW_CS_DSP");  static int cs_dsp_adsp2_start_core(struct cs_dsp *dsp)  { @@ -2890,7 +2890,7 @@ err:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_run, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_run, "FW_CS_DSP");  /**   * cs_dsp_stop() - Stops the firmware @@ -2929,7 +2929,7 @@ void cs_dsp_stop(struct cs_dsp *dsp)  	cs_dsp_dbg(dsp, "Execution stopped\n");  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_stop, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_stop, "FW_CS_DSP");  static int cs_dsp_halo_start_core(struct cs_dsp *dsp)  { @@ -2991,7 +2991,7 @@ int cs_dsp_adsp2_init(struct cs_dsp *dsp)  	return cs_dsp_common_init(dsp);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp2_init, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp2_init, "FW_CS_DSP");  /**   * cs_dsp_halo_init() - Initialise a cs_dsp structure representing a HALO Core DSP @@ -3008,7 +3008,7 @@ int cs_dsp_halo_init(struct cs_dsp *dsp)  	return cs_dsp_common_init(dsp);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_halo_init, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_halo_init, "FW_CS_DSP");  /**   * cs_dsp_remove() - Clean a cs_dsp before deletion @@ -3028,7 +3028,7 @@ void cs_dsp_remove(struct cs_dsp *dsp)  		cs_dsp_free_ctl_blk(ctl);  	}  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_remove, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_remove, "FW_CS_DSP");  /**   * cs_dsp_read_raw_data_block() - Reads a block of data from DSP memory @@ -3065,7 +3065,7 @@ int cs_dsp_read_raw_data_block(struct cs_dsp *dsp, int mem_type, unsigned int me  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_read_raw_data_block, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_read_raw_data_block, "FW_CS_DSP");  /**   * cs_dsp_read_data_word() - Reads a word from DSP memory @@ -3089,7 +3089,7 @@ int cs_dsp_read_data_word(struct cs_dsp *dsp, int mem_type, unsigned int mem_add  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_read_data_word, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_read_data_word, "FW_CS_DSP");  /**   * cs_dsp_write_data_word() - Writes a word to DSP memory @@ -3115,7 +3115,7 @@ int cs_dsp_write_data_word(struct cs_dsp *dsp, int mem_type, unsigned int mem_ad  	return regmap_raw_write(dsp->regmap, reg, &val, sizeof(val));  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_write_data_word, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_write_data_word, "FW_CS_DSP");  /**   * cs_dsp_remove_padding() - Convert unpacked words to packed bytes @@ -3139,7 +3139,7 @@ void cs_dsp_remove_padding(u32 *buf, int nwords)  		*pack_out++ = (u8)(word >> 16);  	}  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_remove_padding, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_remove_padding, "FW_CS_DSP");  /**   * cs_dsp_adsp2_bus_error() - Handle a DSP bus error interrupt @@ -3209,7 +3209,7 @@ void cs_dsp_adsp2_bus_error(struct cs_dsp *dsp)  error:  	mutex_unlock(&dsp->pwr_lock);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp2_bus_error, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_adsp2_bus_error, "FW_CS_DSP");  /**   * cs_dsp_halo_bus_error() - Handle a DSP bus error interrupt @@ -3269,7 +3269,7 @@ void cs_dsp_halo_bus_error(struct cs_dsp *dsp)  exit_unlock:  	mutex_unlock(&dsp->pwr_lock);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_halo_bus_error, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_halo_bus_error, "FW_CS_DSP");  /**   * cs_dsp_halo_wdt_expire() - Handle DSP watchdog expiry @@ -3289,7 +3289,7 @@ void cs_dsp_halo_wdt_expire(struct cs_dsp *dsp)  	mutex_unlock(&dsp->pwr_lock);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_halo_wdt_expire, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_halo_wdt_expire, "FW_CS_DSP");  static const struct cs_dsp_ops cs_dsp_adsp1_ops = {  	.validate_version = cs_dsp_validate_version, @@ -3419,7 +3419,7 @@ int cs_dsp_chunk_write(struct cs_dsp_chunk *ch, int nbits, u32 val)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_chunk_write, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_chunk_write, "FW_CS_DSP");  /**   * cs_dsp_chunk_flush() - Pad remaining data with zero and commit to chunk @@ -3438,7 +3438,7 @@ int cs_dsp_chunk_flush(struct cs_dsp_chunk *ch)  	return cs_dsp_chunk_write(ch, CS_DSP_DATA_WORD_BITS - ch->cachebits, 0);  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_chunk_flush, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_chunk_flush, "FW_CS_DSP");  /**   * cs_dsp_chunk_read() - Parse data from a DSP memory chunk @@ -3480,7 +3480,7 @@ int cs_dsp_chunk_read(struct cs_dsp_chunk *ch, int nbits)  	return result;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_chunk_read, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_chunk_read, "FW_CS_DSP");  struct cs_dsp_wseq_op { @@ -3605,7 +3605,7 @@ int cs_dsp_wseq_init(struct cs_dsp *dsp, struct cs_dsp_wseq *wseqs, unsigned int  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_wseq_init, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_wseq_init, "FW_CS_DSP");  static struct cs_dsp_wseq_op *cs_dsp_wseq_find_op(u32 addr, u8 op_code,  						  struct list_head *wseq_ops) @@ -3720,7 +3720,7 @@ op_new_free:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_wseq_write, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_wseq_write, "FW_CS_DSP");  /**   * cs_dsp_wseq_multi_write() - Add or update multiple entries in a write sequence @@ -3752,7 +3752,7 @@ int cs_dsp_wseq_multi_write(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cs_dsp_wseq_multi_write, FW_CS_DSP); +EXPORT_SYMBOL_NS_GPL(cs_dsp_wseq_multi_write, "FW_CS_DSP");  MODULE_DESCRIPTION("Cirrus Logic DSP Support");  MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>"); diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig index e312d731f4a3..5fe61b9ab5f9 100644 --- a/drivers/firmware/efi/Kconfig +++ b/drivers/firmware/efi/Kconfig @@ -76,10 +76,6 @@ config EFI_ZBOOT  	bool "Enable the generic EFI decompressor"  	depends on EFI_GENERIC_STUB && !ARM  	select HAVE_KERNEL_GZIP -	select HAVE_KERNEL_LZ4 -	select HAVE_KERNEL_LZMA -	select HAVE_KERNEL_LZO -	select HAVE_KERNEL_XZ  	select HAVE_KERNEL_ZSTD  	help  	  Create the bootable image as an EFI application that carries the diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c index 552c78f5f059..a253b6144945 100644 --- a/drivers/firmware/efi/efi-pstore.c +++ b/drivers/firmware/efi/efi-pstore.c @@ -6,7 +6,7 @@  #include <linux/slab.h>  #include <linux/ucs2_string.h> -MODULE_IMPORT_NS(EFIVAR); +MODULE_IMPORT_NS("EFIVAR");  #define DUMP_NAME_LEN 66 diff --git a/drivers/firmware/efi/embedded-firmware.c b/drivers/firmware/efi/embedded-firmware.c index f5be8e22305b..b49a09d7e665 100644 --- a/drivers/firmware/efi/embedded-firmware.c +++ b/drivers/firmware/efi/embedded-firmware.c @@ -16,9 +16,9 @@  /* Exported for use by lib/test_firmware.c only */  LIST_HEAD(efi_embedded_fw_list); -EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_list, TEST_FIRMWARE); +EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_list, "TEST_FIRMWARE");  bool efi_embedded_fw_checked; -EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_checked, TEST_FIRMWARE); +EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_checked, "TEST_FIRMWARE");  static const struct dmi_system_id * const embedded_fw_table[] = {  #ifdef CONFIG_TOUCHSCREEN_DMI diff --git a/drivers/firmware/efi/esrt.c b/drivers/firmware/efi/esrt.c index 7a81c0ce4780..4bb7b0584bc9 100644 --- a/drivers/firmware/efi/esrt.c +++ b/drivers/firmware/efi/esrt.c @@ -75,8 +75,6 @@ static LIST_HEAD(entry_list);  struct esre_attribute {  	struct attribute attr;  	ssize_t (*show)(struct esre_entry *entry, char *buf); -	ssize_t (*store)(struct esre_entry *entry, -			 const char *buf, size_t count);  };  static struct esre_entry *to_entry(struct kobject *kobj) diff --git a/drivers/firmware/efi/libstub/Makefile.zboot b/drivers/firmware/efi/libstub/Makefile.zboot index 65ffd0b760b2..48842b5c106b 100644 --- a/drivers/firmware/efi/libstub/Makefile.zboot +++ b/drivers/firmware/efi/libstub/Makefile.zboot @@ -12,22 +12,16 @@ quiet_cmd_copy_and_pad = PAD     $@  $(obj)/vmlinux.bin: $(obj)/$(EFI_ZBOOT_PAYLOAD) FORCE  	$(call if_changed,copy_and_pad) -comp-type-$(CONFIG_KERNEL_GZIP)		:= gzip -comp-type-$(CONFIG_KERNEL_LZ4)		:= lz4 -comp-type-$(CONFIG_KERNEL_LZMA)		:= lzma -comp-type-$(CONFIG_KERNEL_LZO)		:= lzo -comp-type-$(CONFIG_KERNEL_XZ)		:= xzkern -comp-type-$(CONFIG_KERNEL_ZSTD)		:= zstd22 -  # in GZIP, the appended le32 carrying the uncompressed size is part of the  # format, but in other cases, we just append it at the end for convenience,  # causing the original tools to complain when checking image integrity. -# So disregard it when calculating the payload size in the zimage header. -zboot-method-y                         := $(comp-type-y)_with_size -zboot-size-len-y                       := 4 +comp-type-y				:= gzip +zboot-method-y				:= gzip +zboot-size-len-y			:= 0 -zboot-method-$(CONFIG_KERNEL_GZIP)     := gzip -zboot-size-len-$(CONFIG_KERNEL_GZIP)   := 0 +comp-type-$(CONFIG_KERNEL_ZSTD)		:= zstd +zboot-method-$(CONFIG_KERNEL_ZSTD)	:= zstd22_with_size +zboot-size-len-$(CONFIG_KERNEL_ZSTD)	:= 4  $(obj)/vmlinuz: $(obj)/vmlinux.bin FORCE  	$(call if_changed,$(zboot-method-y)) diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c index 4056ba7f3440..3700e9869767 100644 --- a/drivers/firmware/efi/vars.c +++ b/drivers/firmware/efi/vars.c @@ -149,7 +149,7 @@ int efivar_lock(void)  	}  	return 0;  } -EXPORT_SYMBOL_NS_GPL(efivar_lock, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_lock, "EFIVAR");  /*   * efivar_lock() - obtain the efivar lock if it is free @@ -165,7 +165,7 @@ int efivar_trylock(void)  	}  	return 0;  } -EXPORT_SYMBOL_NS_GPL(efivar_trylock, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_trylock, "EFIVAR");  /*   * efivar_unlock() - release the efivar lock @@ -174,7 +174,7 @@ void efivar_unlock(void)  {  	up(&efivars_lock);  } -EXPORT_SYMBOL_NS_GPL(efivar_unlock, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_unlock, "EFIVAR");  /*   * efivar_get_variable() - retrieve a variable identified by name/vendor @@ -186,7 +186,7 @@ efi_status_t efivar_get_variable(efi_char16_t *name, efi_guid_t *vendor,  {  	return __efivars->ops->get_variable(name, vendor, attr, size, data);  } -EXPORT_SYMBOL_NS_GPL(efivar_get_variable, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_get_variable, "EFIVAR");  /*   * efivar_get_next_variable() - enumerate the next name/vendor pair @@ -198,7 +198,7 @@ efi_status_t efivar_get_next_variable(unsigned long *name_size,  {  	return __efivars->ops->get_next_variable(name_size, name, vendor);  } -EXPORT_SYMBOL_NS_GPL(efivar_get_next_variable, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_get_next_variable, "EFIVAR");  /*   * efivar_set_variable_locked() - set a variable identified by name/vendor @@ -230,7 +230,7 @@ efi_status_t efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,  	return setvar(name, vendor, attr, data_size, data);  } -EXPORT_SYMBOL_NS_GPL(efivar_set_variable_locked, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_set_variable_locked, "EFIVAR");  /*   * efivar_set_variable() - set a variable identified by name/vendor @@ -252,7 +252,7 @@ efi_status_t efivar_set_variable(efi_char16_t *name, efi_guid_t *vendor,  	efivar_unlock();  	return status;  } -EXPORT_SYMBOL_NS_GPL(efivar_set_variable, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_set_variable, "EFIVAR");  efi_status_t efivar_query_variable_info(u32 attr,  					u64 *storage_space, @@ -264,4 +264,4 @@ efi_status_t efivar_query_variable_info(u32 attr,  	return __efivars->ops->query_variable_info(attr, storage_space,  			remaining_space, max_variable_size);  } -EXPORT_SYMBOL_NS_GPL(efivar_query_variable_info, EFIVAR); +EXPORT_SYMBOL_NS_GPL(efivar_query_variable_info, "EFIVAR"); diff --git a/drivers/firmware/imx/Kconfig b/drivers/firmware/imx/Kconfig index 477d3f32d99a..907cd149c40a 100644 --- a/drivers/firmware/imx/Kconfig +++ b/drivers/firmware/imx/Kconfig @@ -25,7 +25,6 @@ config IMX_SCU  config IMX_SCMI_MISC_DRV  	tristate "IMX SCMI MISC Protocol driver" -	depends on IMX_SCMI_MISC_EXT || COMPILE_TEST  	default y if ARCH_MXC  	help  	  The System Controller Management Interface firmware (SCMI FW) is diff --git a/drivers/firmware/microchip/mpfs-auto-update.c b/drivers/firmware/microchip/mpfs-auto-update.c index 38a03698cec9..e194f7acb2a9 100644 --- a/drivers/firmware/microchip/mpfs-auto-update.c +++ b/drivers/firmware/microchip/mpfs-auto-update.c @@ -402,10 +402,10 @@ static int mpfs_auto_update_available(struct mpfs_auto_update_priv *priv)  		return -EIO;  	/* -	 * Bit 5 of byte 1 is "UL_Auto Update" & if it is set, Auto Update is +	 * Bit 5 of byte 1 is "UL_IAP" & if it is set, Auto Update is  	 * not possible.  	 */ -	if (response_msg[1] & AUTO_UPDATE_FEATURE_ENABLED) +	if ((((u8 *)response_msg)[1] & AUTO_UPDATE_FEATURE_ENABLED))  		return -EPERM;  	return 0; diff --git a/drivers/fpga/intel-m10-bmc-sec-update.c b/drivers/fpga/intel-m10-bmc-sec-update.c index dd515083bbdd..10f678b9ed36 100644 --- a/drivers/fpga/intel-m10-bmc-sec-update.c +++ b/drivers/fpga/intel-m10-bmc-sec-update.c @@ -771,4 +771,4 @@ module_platform_driver(intel_m10bmc_sec_driver);  MODULE_AUTHOR("Intel Corporation");  MODULE_DESCRIPTION("Intel MAX10 BMC Secure Update");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(INTEL_M10_BMC_CORE); +MODULE_IMPORT_NS("INTEL_M10_BMC_CORE"); diff --git a/drivers/fsi/fsi-master-aspeed.c b/drivers/fsi/fsi-master-aspeed.c index 6f5e1bdf7e40..bff897f77fe5 100644 --- a/drivers/fsi/fsi-master-aspeed.c +++ b/drivers/fsi/fsi-master-aspeed.c @@ -666,7 +666,7 @@ static struct platform_driver fsi_master_aspeed_driver = {  		.of_match_table	= fsi_master_aspeed_match,  	},  	.probe	= fsi_master_aspeed_probe, -	.remove_new = fsi_master_aspeed_remove, +	.remove = fsi_master_aspeed_remove,  };  module_platform_driver(fsi_master_aspeed_driver); diff --git a/drivers/fsi/fsi-master-ast-cf.c b/drivers/fsi/fsi-master-ast-cf.c index a4c37ff8edd6..9f2fd444ceb6 100644 --- a/drivers/fsi/fsi-master-ast-cf.c +++ b/drivers/fsi/fsi-master-ast-cf.c @@ -1434,7 +1434,7 @@ static struct platform_driver fsi_master_acf = {  		.of_match_table	= fsi_master_acf_match,  	},  	.probe	= fsi_master_acf_probe, -	.remove_new = fsi_master_acf_remove, +	.remove = fsi_master_acf_remove,  };  module_platform_driver(fsi_master_acf); diff --git a/drivers/fsi/fsi-master-gpio.c b/drivers/fsi/fsi-master-gpio.c index f761344f4873..69de0b5b9cbd 100644 --- a/drivers/fsi/fsi-master-gpio.c +++ b/drivers/fsi/fsi-master-gpio.c @@ -888,7 +888,7 @@ static struct platform_driver fsi_master_gpio_driver = {  		.of_match_table	= fsi_master_gpio_match,  	},  	.probe	= fsi_master_gpio_probe, -	.remove_new = fsi_master_gpio_remove, +	.remove = fsi_master_gpio_remove,  };  module_platform_driver(fsi_master_gpio_driver); diff --git a/drivers/fsi/fsi-occ.c b/drivers/fsi/fsi-occ.c index a6d4c8f123a5..d3e6bf37878a 100644 --- a/drivers/fsi/fsi-occ.c +++ b/drivers/fsi/fsi-occ.c @@ -740,7 +740,7 @@ static struct platform_driver occ_driver = {  		.of_match_table	= occ_match,  	},  	.probe	= occ_probe, -	.remove_new = occ_remove, +	.remove = occ_remove,  };  static int occ_init(void) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 56fee58e281e..93ee3aa092f8 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -482,8 +482,9 @@ config GPIO_MT7621  	  Say yes here to support the Mediatek MT7621 SoC GPIO device.  config GPIO_MVEBU -	def_bool y +	bool "Marvell Orion and EBU GPIO support" if COMPILE_TEST  	depends on PLAT_ORION || ARCH_MVEBU || COMPILE_TEST +	default PLAT_ORION || ARCH_MVEBU  	select GENERIC_IRQ_CHIP  	select REGMAP_MMIO diff --git a/drivers/gpio/gpio-104-dio-48e.c b/drivers/gpio/gpio-104-dio-48e.c index 4df9becaf349..cf5a50102d49 100644 --- a/drivers/gpio/gpio-104-dio-48e.c +++ b/drivers/gpio/gpio-104-dio-48e.c @@ -22,7 +22,7 @@  #include "gpio-i8255.h" -MODULE_IMPORT_NS(I8255); +MODULE_IMPORT_NS("I8255");  #define DIO48E_EXTENT 16  #define MAX_NUM_DIO48E max_num_isa_dev(DIO48E_EXTENT) @@ -339,4 +339,4 @@ module_isa_driver_with_irq(dio48e_driver, num_dio48e, num_irq);  MODULE_AUTHOR("William Breathitt Gray <vilhelm.gray@gmail.com>");  MODULE_DESCRIPTION("ACCES 104-DIO-48E GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(I8254); +MODULE_IMPORT_NS("I8254"); diff --git a/drivers/gpio/gpio-104-idio-16.c b/drivers/gpio/gpio-104-idio-16.c index f03ccd0f534c..ffe7e1cb6b23 100644 --- a/drivers/gpio/gpio-104-idio-16.c +++ b/drivers/gpio/gpio-104-idio-16.c @@ -126,4 +126,4 @@ module_isa_driver_with_irq(idio_16_driver, num_idio_16, num_irq);  MODULE_AUTHOR("William Breathitt Gray <vilhelm.gray@gmail.com>");  MODULE_DESCRIPTION("ACCES 104-IDIO-16 GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(GPIO_IDIO_16); +MODULE_IMPORT_NS("GPIO_IDIO_16"); diff --git a/drivers/gpio/gpio-elkhartlake.c b/drivers/gpio/gpio-elkhartlake.c index 887c0fe99d39..95de52d2cc63 100644 --- a/drivers/gpio/gpio-elkhartlake.c +++ b/drivers/gpio/gpio-elkhartlake.c @@ -75,4 +75,4 @@ MODULE_AUTHOR("Pandith N <pandith.n@intel.com>");  MODULE_AUTHOR("Raag Jadav <raag.jadav@intel.com>");  MODULE_DESCRIPTION("Intel Elkhart Lake PSE GPIO driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(GPIO_TANGIER); +MODULE_IMPORT_NS("GPIO_TANGIER"); diff --git a/drivers/gpio/gpio-gpio-mm.c b/drivers/gpio/gpio-gpio-mm.c index 43d823a56e59..fb7c510bf2fa 100644 --- a/drivers/gpio/gpio-gpio-mm.c +++ b/drivers/gpio/gpio-gpio-mm.c @@ -18,7 +18,7 @@  #include "gpio-i8255.h" -MODULE_IMPORT_NS(I8255); +MODULE_IMPORT_NS("I8255");  #define GPIOMM_EXTENT 8  #define MAX_NUM_GPIOMM max_num_isa_dev(GPIOMM_EXTENT) diff --git a/drivers/gpio/gpio-graniterapids.c b/drivers/gpio/gpio-graniterapids.c index f2e911a3d2ca..ad6a045fd3d2 100644 --- a/drivers/gpio/gpio-graniterapids.c +++ b/drivers/gpio/gpio-graniterapids.c @@ -32,12 +32,14 @@  #define GNR_PINS_PER_REG 32  #define GNR_NUM_REGS DIV_ROUND_UP(GNR_NUM_PINS, GNR_PINS_PER_REG) -#define GNR_CFG_BAR		0x00 +#define GNR_CFG_PADBAR		0x00  #define GNR_CFG_LOCK_OFFSET	0x04 -#define GNR_GPI_STATUS_OFFSET	0x20 +#define GNR_GPI_STATUS_OFFSET	0x14  #define GNR_GPI_ENABLE_OFFSET	0x24 -#define GNR_CFG_DW_RX_MASK	GENMASK(25, 22) +#define GNR_CFG_DW_HOSTSW_MODE	BIT(27) +#define GNR_CFG_DW_RX_MASK	GENMASK(23, 22) +#define GNR_CFG_DW_INTSEL_MASK	GENMASK(21, 14)  #define GNR_CFG_DW_RX_DISABLE	FIELD_PREP(GNR_CFG_DW_RX_MASK, 2)  #define GNR_CFG_DW_RX_EDGE	FIELD_PREP(GNR_CFG_DW_RX_MASK, 1)  #define GNR_CFG_DW_RX_LEVEL	FIELD_PREP(GNR_CFG_DW_RX_MASK, 0) @@ -50,6 +52,7 @@   * struct gnr_gpio - Intel Granite Rapids-D vGPIO driver state   * @gc: GPIO controller interface   * @reg_base: base address of the GPIO registers + * @pad_base: base address of the vGPIO pad configuration registers   * @ro_bitmap: bitmap of read-only pins   * @lock: guard the registers   * @pad_backup: backup of the register state for suspend @@ -57,6 +60,7 @@  struct gnr_gpio {  	struct gpio_chip gc;  	void __iomem *reg_base; +	void __iomem *pad_base;  	DECLARE_BITMAP(ro_bitmap, GNR_NUM_PINS);  	raw_spinlock_t lock;  	u32 pad_backup[]; @@ -65,7 +69,7 @@ struct gnr_gpio {  static void __iomem *gnr_gpio_get_padcfg_addr(const struct gnr_gpio *priv,  					      unsigned int gpio)  { -	return priv->reg_base + gpio * sizeof(u32); +	return priv->pad_base + gpio * sizeof(u32);  }  static int gnr_gpio_configure_line(struct gpio_chip *gc, unsigned int gpio, @@ -88,6 +92,20 @@ static int gnr_gpio_configure_line(struct gpio_chip *gc, unsigned int gpio,  	return 0;  } +static int gnr_gpio_request(struct gpio_chip *gc, unsigned int gpio) +{ +	struct gnr_gpio *priv = gpiochip_get_data(gc); +	u32 dw; + +	dw = readl(gnr_gpio_get_padcfg_addr(priv, gpio)); +	if (!(dw & GNR_CFG_DW_HOSTSW_MODE)) { +		dev_warn(gc->parent, "GPIO %u is not owned by host", gpio); +		return -EBUSY; +	} + +	return 0; +} +  static int gnr_gpio_get(struct gpio_chip *gc, unsigned int gpio)  {  	const struct gnr_gpio *priv = gpiochip_get_data(gc); @@ -139,6 +157,7 @@ static int gnr_gpio_direction_output(struct gpio_chip *gc, unsigned int gpio, in  static const struct gpio_chip gnr_gpio_chip = {  	.owner		  = THIS_MODULE, +	.request	  = gnr_gpio_request,  	.get		  = gnr_gpio_get,  	.set		  = gnr_gpio_set,  	.get_direction    = gnr_gpio_get_direction, @@ -166,7 +185,7 @@ static void gnr_gpio_irq_ack(struct irq_data *d)  	guard(raw_spinlock_irqsave)(&priv->lock);  	reg = readl(addr); -	reg &= ~BIT(bit_idx); +	reg |= BIT(bit_idx);  	writel(reg, addr);  } @@ -209,10 +228,18 @@ static void gnr_gpio_irq_unmask(struct irq_data *d)  static int gnr_gpio_irq_set_type(struct irq_data *d, unsigned int type)  {  	struct gpio_chip *gc = irq_data_get_irq_chip_data(d); -	irq_hw_number_t pin = irqd_to_hwirq(d); -	u32 mask = GNR_CFG_DW_RX_MASK; +	struct gnr_gpio *priv = gpiochip_get_data(gc); +	irq_hw_number_t hwirq = irqd_to_hwirq(d); +	u32 reg;  	u32 set; +	/* Allow interrupts only if Interrupt Select field is non-zero */ +	reg = readl(gnr_gpio_get_padcfg_addr(priv, hwirq)); +	if (!(reg & GNR_CFG_DW_INTSEL_MASK)) { +		dev_dbg(gc->parent, "GPIO %lu cannot be used as IRQ", hwirq); +		return -EPERM; +	} +  	/* Falling edge and level low triggers not supported by the GPIO controller */  	switch (type) {  	case IRQ_TYPE_NONE: @@ -230,10 +257,11 @@ static int gnr_gpio_irq_set_type(struct irq_data *d, unsigned int type)  		return -EINVAL;  	} -	return gnr_gpio_configure_line(gc, pin, mask, set); +	return gnr_gpio_configure_line(gc, hwirq, GNR_CFG_DW_RX_MASK, set);  }  static const struct irq_chip gnr_gpio_irq_chip = { +	.name		= "gpio-graniterapids",  	.irq_ack	= gnr_gpio_irq_ack,  	.irq_mask	= gnr_gpio_irq_mask,  	.irq_unmask	= gnr_gpio_irq_unmask, @@ -291,6 +319,7 @@ static int gnr_gpio_probe(struct platform_device *pdev)  	struct gnr_gpio *priv;  	void __iomem *regs;  	int irq, ret; +	u32 offset;  	priv = devm_kzalloc(dev, struct_size(priv, pad_backup, num_backup_pins), GFP_KERNEL);  	if (!priv) @@ -302,6 +331,10 @@ static int gnr_gpio_probe(struct platform_device *pdev)  	if (IS_ERR(regs))  		return PTR_ERR(regs); +	priv->reg_base = regs; +	offset = readl(priv->reg_base + GNR_CFG_PADBAR); +	priv->pad_base = priv->reg_base + offset; +  	irq = platform_get_irq(pdev, 0);  	if (irq < 0)  		return irq; @@ -311,8 +344,6 @@ static int gnr_gpio_probe(struct platform_device *pdev)  	if (ret)  		return dev_err_probe(dev, ret, "failed to request interrupt\n"); -	priv->reg_base = regs + readl(regs + GNR_CFG_BAR); -  	gnr_gpio_init_pin_ro_bits(dev, priv->reg_base + GNR_CFG_LOCK_OFFSET,  				  priv->ro_bitmap); @@ -324,7 +355,6 @@ static int gnr_gpio_probe(struct platform_device *pdev)  	girq = &priv->gc.irq;  	gpio_irq_chip_set_chip(girq, &gnr_gpio_irq_chip); -	girq->chip->name	= dev_name(dev);  	girq->parent_handler	= NULL;  	girq->num_parents	= 0;  	girq->parents		= NULL; diff --git a/drivers/gpio/gpio-i8255.c b/drivers/gpio/gpio-i8255.c index 64ab80fc4a1e..953018bfa2b1 100644 --- a/drivers/gpio/gpio-i8255.c +++ b/drivers/gpio/gpio-i8255.c @@ -134,7 +134,7 @@ int devm_i8255_regmap_register(struct device *const dev,  	return PTR_ERR_OR_ZERO(devm_gpio_regmap_register(dev, &gpio_config));  } -EXPORT_SYMBOL_NS_GPL(devm_i8255_regmap_register, I8255); +EXPORT_SYMBOL_NS_GPL(devm_i8255_regmap_register, "I8255");  MODULE_AUTHOR("William Breathitt Gray");  MODULE_DESCRIPTION("Intel 8255 Programmable Peripheral Interface"); diff --git a/drivers/gpio/gpio-idio-16.c b/drivers/gpio/gpio-idio-16.c index 53b1eb876a12..0103be977c66 100644 --- a/drivers/gpio/gpio-idio-16.c +++ b/drivers/gpio/gpio-idio-16.c @@ -3,6 +3,9 @@   * GPIO library for the ACCES IDIO-16 family   * Copyright (C) 2022 William Breathitt Gray   */ + +#define DEFAULT_SYMBOL_NAMESPACE "GPIO_IDIO_16" +  #include <linux/bits.h>  #include <linux/device.h>  #include <linux/err.h> @@ -14,8 +17,6 @@  #include "gpio-idio-16.h" -#define DEFAULT_SYMBOL_NAMESPACE GPIO_IDIO_16 -  #define IDIO_16_DAT_BASE 0x0  #define IDIO_16_OUT_BASE IDIO_16_DAT_BASE  #define IDIO_16_IN_BASE (IDIO_16_DAT_BASE + 1) diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c index d67b912d884d..817ecb12d550 100644 --- a/drivers/gpio/gpio-ljca.c +++ b/drivers/gpio/gpio-ljca.c @@ -82,9 +82,9 @@ static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,  	int ret;  	mutex_lock(&ljca_gpio->trans_lock); +	packet->num = 1;  	packet->item[0].index = gpio_id;  	packet->item[0].value = config | ljca_gpio->connect_mode[gpio_id]; -	packet->num = 1;  	ret = ljca_transfer(ljca_gpio->ljca, LJCA_GPIO_CONFIG, (u8 *)packet,  			    struct_size(packet, item, packet->num), NULL, 0); @@ -492,4 +492,4 @@ MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");  MODULE_AUTHOR("Lixu Zhang <lixu.zhang@intel.com>");  MODULE_DESCRIPTION("Intel La Jolla Cove Adapter USB-GPIO driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LJCA); +MODULE_IMPORT_NS("LJCA"); diff --git a/drivers/gpio/gpio-loongson-64bit.c b/drivers/gpio/gpio-loongson-64bit.c index 6749d4dd6d64..7f4d78fd800e 100644 --- a/drivers/gpio/gpio-loongson-64bit.c +++ b/drivers/gpio/gpio-loongson-64bit.c @@ -237,9 +237,9 @@ static const struct loongson_gpio_chip_data loongson_gpio_ls2k2000_data1 = {  static const struct loongson_gpio_chip_data loongson_gpio_ls2k2000_data2 = {  	.label = "ls2k2000_gpio",  	.mode = BIT_CTRL_MODE, -	.conf_offset = 0x84, -	.in_offset = 0x88, -	.out_offset = 0x80, +	.conf_offset = 0x4, +	.in_offset = 0x8, +	.out_offset = 0x0,  };  static const struct loongson_gpio_chip_data loongson_gpio_ls3a5000_data = { diff --git a/drivers/gpio/gpio-menz127.c b/drivers/gpio/gpio-menz127.c index 3ccd2cb35b9c..ebe5da4933bc 100644 --- a/drivers/gpio/gpio-menz127.c +++ b/drivers/gpio/gpio-menz127.c @@ -201,4 +201,4 @@ MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");  MODULE_DESCRIPTION("MEN 16z127 GPIO Controller");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("mcb:16z127"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/gpio/gpio-merrifield.c b/drivers/gpio/gpio-merrifield.c index cd20604f26de..4335a5d8e4f6 100644 --- a/drivers/gpio/gpio-merrifield.c +++ b/drivers/gpio/gpio-merrifield.c @@ -142,4 +142,4 @@ module_pci_driver(mrfld_gpio_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Merrifield SoC GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(GPIO_TANGIER); +MODULE_IMPORT_NS("GPIO_TANGIER"); diff --git a/drivers/gpio/gpio-pci-idio-16.c b/drivers/gpio/gpio-pci-idio-16.c index 64f332c80550..476cea1b5ed7 100644 --- a/drivers/gpio/gpio-pci-idio-16.c +++ b/drivers/gpio/gpio-pci-idio-16.c @@ -112,4 +112,4 @@ module_pci_driver(idio_16_driver);  MODULE_AUTHOR("William Breathitt Gray <vilhelm.gray@gmail.com>");  MODULE_DESCRIPTION("ACCES PCI-IDIO-16 GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(GPIO_IDIO_16); +MODULE_IMPORT_NS("GPIO_IDIO_16"); diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c index f387dad81f29..686ae3d11ba3 100644 --- a/drivers/gpio/gpio-sim.c +++ b/drivers/gpio/gpio-sim.c @@ -1027,6 +1027,30 @@ static void gpio_sim_device_deactivate(struct gpio_sim_device *dev)  	dev->pdev = NULL;  } +static void +gpio_sim_device_lockup_configfs(struct gpio_sim_device *dev, bool lock) +{ +	struct configfs_subsystem *subsys = dev->group.cg_subsys; +	struct gpio_sim_bank *bank; +	struct gpio_sim_line *line; + +	/* +	 * The device only needs to depend on leaf line entries. This is +	 * sufficient to lock up all the configfs entries that the +	 * instantiated, alive device depends on. +	 */ +	list_for_each_entry(bank, &dev->bank_list, siblings) { +		list_for_each_entry(line, &bank->line_list, siblings) { +			if (lock) +				WARN_ON(configfs_depend_item_unlocked( +						subsys, &line->group.cg_item)); +			else +				configfs_undepend_item_unlocked( +						&line->group.cg_item); +		} +	} +} +  static ssize_t  gpio_sim_device_config_live_store(struct config_item *item,  				  const char *page, size_t count) @@ -1039,14 +1063,24 @@ gpio_sim_device_config_live_store(struct config_item *item,  	if (ret)  		return ret; -	guard(mutex)(&dev->lock); +	if (live) +		gpio_sim_device_lockup_configfs(dev, true); -	if (live == gpio_sim_device_is_live(dev)) -		ret = -EPERM; -	else if (live) -		ret = gpio_sim_device_activate(dev); -	else -		gpio_sim_device_deactivate(dev); +	scoped_guard(mutex, &dev->lock) { +		if (live == gpio_sim_device_is_live(dev)) +			ret = -EPERM; +		else if (live) +			ret = gpio_sim_device_activate(dev); +		else +			gpio_sim_device_deactivate(dev); +	} + +	/* +	 * Undepend is required only if device disablement (live == 0) +	 * succeeds or if device enablement (live == 1) fails. +	 */ +	if (live == !!ret) +		gpio_sim_device_lockup_configfs(dev, false);  	return ret ?: count;  } diff --git a/drivers/gpio/gpio-tangier.c b/drivers/gpio/gpio-tangier.c index 4b29abafecf6..a415e6d36173 100644 --- a/drivers/gpio/gpio-tangier.c +++ b/drivers/gpio/gpio-tangier.c @@ -459,7 +459,7 @@ int devm_tng_gpio_probe(struct device *dev, struct tng_gpio *gpio)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(devm_tng_gpio_probe, GPIO_TANGIER); +EXPORT_SYMBOL_NS_GPL(devm_tng_gpio_probe, "GPIO_TANGIER");  static int tng_gpio_suspend(struct device *dev)  { diff --git a/drivers/gpio/gpio-virtuser.c b/drivers/gpio/gpio-virtuser.c index 91b6352c957c..e89f299f2140 100644 --- a/drivers/gpio/gpio-virtuser.c +++ b/drivers/gpio/gpio-virtuser.c @@ -1410,7 +1410,7 @@ gpio_virtuser_make_lookup_table(struct gpio_virtuser_device *dev)  	size_t num_entries = gpio_virtuser_get_lookup_count(dev);  	struct gpio_virtuser_lookup_entry *entry;  	struct gpio_virtuser_lookup *lookup; -	unsigned int i = 0; +	unsigned int i = 0, idx;  	lockdep_assert_held(&dev->lock); @@ -1424,12 +1424,12 @@ gpio_virtuser_make_lookup_table(struct gpio_virtuser_device *dev)  		return -ENOMEM;  	list_for_each_entry(lookup, &dev->lookup_list, siblings) { +		idx = 0;  		list_for_each_entry(entry, &lookup->entry_list, siblings) { -			table->table[i] = +			table->table[i++] =  				GPIO_LOOKUP_IDX(entry->key,  						entry->offset < 0 ? U16_MAX : entry->offset, -						lookup->con_id, i, entry->flags); -			i++; +						lookup->con_id, idx++, entry->flags);  		}  	} @@ -1439,6 +1439,15 @@ gpio_virtuser_make_lookup_table(struct gpio_virtuser_device *dev)  	return 0;  } +static void +gpio_virtuser_remove_lookup_table(struct gpio_virtuser_device *dev) +{ +	gpiod_remove_lookup_table(dev->lookup_table); +	kfree(dev->lookup_table->dev_id); +	kfree(dev->lookup_table); +	dev->lookup_table = NULL; +} +  static struct fwnode_handle *  gpio_virtuser_make_device_swnode(struct gpio_virtuser_device *dev)  { @@ -1487,10 +1496,8 @@ gpio_virtuser_device_activate(struct gpio_virtuser_device *dev)  	pdevinfo.fwnode = swnode;  	ret = gpio_virtuser_make_lookup_table(dev); -	if (ret) { -		fwnode_remove_software_node(swnode); -		return ret; -	} +	if (ret) +		goto err_remove_swnode;  	reinit_completion(&dev->probe_completion);  	dev->driver_bound = false; @@ -1498,23 +1505,31 @@ gpio_virtuser_device_activate(struct gpio_virtuser_device *dev)  	pdev = platform_device_register_full(&pdevinfo);  	if (IS_ERR(pdev)) { +		ret = PTR_ERR(pdev);  		bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); -		fwnode_remove_software_node(swnode); -		return PTR_ERR(pdev); +		goto err_remove_lookup_table;  	}  	wait_for_completion(&dev->probe_completion);  	bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);  	if (!dev->driver_bound) { -		platform_device_unregister(pdev); -		fwnode_remove_software_node(swnode); -		return -ENXIO; +		ret = -ENXIO; +		goto err_unregister_pdev;  	}  	dev->pdev = pdev;  	return 0; + +err_unregister_pdev: +	platform_device_unregister(pdev); +err_remove_lookup_table: +	gpio_virtuser_remove_lookup_table(dev); +err_remove_swnode: +	fwnode_remove_software_node(swnode); + +	return ret;  }  static void @@ -1526,10 +1541,33 @@ gpio_virtuser_device_deactivate(struct gpio_virtuser_device *dev)  	swnode = dev_fwnode(&dev->pdev->dev);  	platform_device_unregister(dev->pdev); +	gpio_virtuser_remove_lookup_table(dev);  	fwnode_remove_software_node(swnode);  	dev->pdev = NULL; -	gpiod_remove_lookup_table(dev->lookup_table); -	kfree(dev->lookup_table); +} + +static void +gpio_virtuser_device_lockup_configfs(struct gpio_virtuser_device *dev, bool lock) +{ +	struct configfs_subsystem *subsys = dev->group.cg_subsys; +	struct gpio_virtuser_lookup_entry *entry; +	struct gpio_virtuser_lookup *lookup; + +	/* +	 * The device only needs to depend on leaf lookup entries. This is +	 * sufficient to lock up all the configfs entries that the +	 * instantiated, alive device depends on. +	 */ +	list_for_each_entry(lookup, &dev->lookup_list, siblings) { +		list_for_each_entry(entry, &lookup->entry_list, siblings) { +			if (lock) +				WARN_ON(configfs_depend_item_unlocked( +						subsys, &entry->group.cg_item)); +			else +				configfs_undepend_item_unlocked( +						&entry->group.cg_item); +		} +	}  }  static ssize_t @@ -1544,15 +1582,24 @@ gpio_virtuser_device_config_live_store(struct config_item *item,  	if (ret)  		return ret; -	guard(mutex)(&dev->lock); +	if (live) +		gpio_virtuser_device_lockup_configfs(dev, true); -	if (live == gpio_virtuser_device_is_live(dev)) -		return -EPERM; +	scoped_guard(mutex, &dev->lock) { +		if (live == gpio_virtuser_device_is_live(dev)) +			ret = -EPERM; +		else if (live) +			ret = gpio_virtuser_device_activate(dev); +		else +			gpio_virtuser_device_deactivate(dev); +	} -	if (live) -		ret = gpio_virtuser_device_activate(dev); -	else -		gpio_virtuser_device_deactivate(dev); +	/* +	 * Undepend is required only if device disablement (live == 0) +	 * succeeds or if device enablement (live == 1) fails. +	 */ +	if (live == !!ret) +		gpio_virtuser_device_lockup_configfs(dev, false);  	return ret ?: count;  } diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c index c6a8f2c82680..792d94c49077 100644 --- a/drivers/gpio/gpio-xilinx.c +++ b/drivers/gpio/gpio-xilinx.c @@ -65,7 +65,7 @@ struct xgpio_instance {  	DECLARE_BITMAP(state, 64);  	DECLARE_BITMAP(last_irq_read, 64);  	DECLARE_BITMAP(dir, 64); -	spinlock_t gpio_lock;	/* For serializing operations */ +	raw_spinlock_t gpio_lock;	/* For serializing operations */  	int irq;  	DECLARE_BITMAP(enable, 64);  	DECLARE_BITMAP(rising_edge, 64); @@ -179,14 +179,14 @@ static void xgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)  	struct xgpio_instance *chip = gpiochip_get_data(gc);  	int bit = xgpio_to_bit(chip, gpio); -	spin_lock_irqsave(&chip->gpio_lock, flags); +	raw_spin_lock_irqsave(&chip->gpio_lock, flags);  	/* Write to GPIO signal and set its direction to output */  	__assign_bit(bit, chip->state, val);  	xgpio_write_ch(chip, XGPIO_DATA_OFFSET, bit, chip->state); -	spin_unlock_irqrestore(&chip->gpio_lock, flags); +	raw_spin_unlock_irqrestore(&chip->gpio_lock, flags);  }  /** @@ -210,7 +210,7 @@ static void xgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,  	bitmap_remap(hw_mask, mask, chip->sw_map, chip->hw_map, 64);  	bitmap_remap(hw_bits, bits, chip->sw_map, chip->hw_map, 64); -	spin_lock_irqsave(&chip->gpio_lock, flags); +	raw_spin_lock_irqsave(&chip->gpio_lock, flags);  	bitmap_replace(state, chip->state, hw_bits, hw_mask, 64); @@ -218,7 +218,7 @@ static void xgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,  	bitmap_copy(chip->state, state, 64); -	spin_unlock_irqrestore(&chip->gpio_lock, flags); +	raw_spin_unlock_irqrestore(&chip->gpio_lock, flags);  }  /** @@ -236,13 +236,13 @@ static int xgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)  	struct xgpio_instance *chip = gpiochip_get_data(gc);  	int bit = xgpio_to_bit(chip, gpio); -	spin_lock_irqsave(&chip->gpio_lock, flags); +	raw_spin_lock_irqsave(&chip->gpio_lock, flags);  	/* Set the GPIO bit in shadow register and set direction as input */  	__set_bit(bit, chip->dir);  	xgpio_write_ch(chip, XGPIO_TRI_OFFSET, bit, chip->dir); -	spin_unlock_irqrestore(&chip->gpio_lock, flags); +	raw_spin_unlock_irqrestore(&chip->gpio_lock, flags);  	return 0;  } @@ -265,7 +265,7 @@ static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)  	struct xgpio_instance *chip = gpiochip_get_data(gc);  	int bit = xgpio_to_bit(chip, gpio); -	spin_lock_irqsave(&chip->gpio_lock, flags); +	raw_spin_lock_irqsave(&chip->gpio_lock, flags);  	/* Write state of GPIO signal */  	__assign_bit(bit, chip->state, val); @@ -275,7 +275,7 @@ static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)  	__clear_bit(bit, chip->dir);  	xgpio_write_ch(chip, XGPIO_TRI_OFFSET, bit, chip->dir); -	spin_unlock_irqrestore(&chip->gpio_lock, flags); +	raw_spin_unlock_irqrestore(&chip->gpio_lock, flags);  	return 0;  } @@ -398,7 +398,7 @@ static void xgpio_irq_mask(struct irq_data *irq_data)  	int bit = xgpio_to_bit(chip, irq_offset);  	u32 mask = BIT(bit / 32), temp; -	spin_lock_irqsave(&chip->gpio_lock, flags); +	raw_spin_lock_irqsave(&chip->gpio_lock, flags);  	__clear_bit(bit, chip->enable); @@ -408,7 +408,7 @@ static void xgpio_irq_mask(struct irq_data *irq_data)  		temp &= ~mask;  		xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, temp);  	} -	spin_unlock_irqrestore(&chip->gpio_lock, flags); +	raw_spin_unlock_irqrestore(&chip->gpio_lock, flags);  	gpiochip_disable_irq(&chip->gc, irq_offset);  } @@ -428,7 +428,7 @@ static void xgpio_irq_unmask(struct irq_data *irq_data)  	gpiochip_enable_irq(&chip->gc, irq_offset); -	spin_lock_irqsave(&chip->gpio_lock, flags); +	raw_spin_lock_irqsave(&chip->gpio_lock, flags);  	__set_bit(bit, chip->enable); @@ -447,7 +447,7 @@ static void xgpio_irq_unmask(struct irq_data *irq_data)  		xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, val);  	} -	spin_unlock_irqrestore(&chip->gpio_lock, flags); +	raw_spin_unlock_irqrestore(&chip->gpio_lock, flags);  }  /** @@ -512,7 +512,7 @@ static void xgpio_irqhandler(struct irq_desc *desc)  	chained_irq_enter(irqchip, desc); -	spin_lock(&chip->gpio_lock); +	raw_spin_lock(&chip->gpio_lock);  	xgpio_read_ch_all(chip, XGPIO_DATA_OFFSET, all); @@ -529,7 +529,7 @@ static void xgpio_irqhandler(struct irq_desc *desc)  	bitmap_copy(chip->last_irq_read, all, 64);  	bitmap_or(all, rising, falling, 64); -	spin_unlock(&chip->gpio_lock); +	raw_spin_unlock(&chip->gpio_lock);  	dev_dbg(gc->parent, "IRQ rising %*pb falling %*pb\n", 64, rising, 64, falling); @@ -620,7 +620,7 @@ static int xgpio_probe(struct platform_device *pdev)  	bitmap_set(chip->hw_map,  0, width[0]);  	bitmap_set(chip->hw_map, 32, width[1]); -	spin_lock_init(&chip->gpio_lock); +	raw_spin_lock_init(&chip->gpio_lock);  	chip->gc.base = -1;  	chip->gc.ngpio = bitmap_weight(chip->hw_map, 64); diff --git a/drivers/gpio/gpiolib-swnode.c b/drivers/gpio/gpiolib-swnode.c index 51d2475c05c5..f21dbc28cf2c 100644 --- a/drivers/gpio/gpiolib-swnode.c +++ b/drivers/gpio/gpiolib-swnode.c @@ -141,7 +141,7 @@ int swnode_gpio_count(const struct fwnode_handle *fwnode, const char *con_id)  const struct software_node swnode_gpio_undefined = {  	.name = GPIOLIB_SWNODE_UNDEFINED_NAME,  }; -EXPORT_SYMBOL_NS_GPL(swnode_gpio_undefined, GPIO_SWNODE); +EXPORT_SYMBOL_NS_GPL(swnode_gpio_undefined, "GPIO_SWNODE");  static int __init swnode_gpio_init(void)  { diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 5504721007cc..772fc7625639 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -99,6 +99,7 @@ config DRM_KUNIT_TEST  config DRM_KMS_HELPER  	tristate  	depends on DRM +	select FB_CORE if DRM_FBDEV_EMULATION  	help  	  CRTC helpers for KMS drivers. @@ -358,6 +359,7 @@ config DRM_TTM_HELPER  	tristate  	depends on DRM  	select DRM_TTM +	select FB_CORE if DRM_FBDEV_EMULATION  	select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION  	help  	  Helpers for ttm-based gem objects @@ -365,6 +367,7 @@ config DRM_TTM_HELPER  config DRM_GEM_DMA_HELPER  	tristate  	depends on DRM +	select FB_CORE if DRM_FBDEV_EMULATION  	select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION  	help  	  Choose this if you need the GEM DMA helper functions @@ -372,6 +375,7 @@ config DRM_GEM_DMA_HELPER  config DRM_GEM_SHMEM_HELPER  	tristate  	depends on DRM && MMU +	select FB_CORE if DRM_FBDEV_EMULATION  	select FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION  	help  	  Choose this if you need the GEM shmem helper functions diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 3afcd1e8aa54..c4e733c2e75e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -715,8 +715,9 @@ err:  void amdgpu_amdkfd_set_compute_idle(struct amdgpu_device *adev, bool idle)  {  	enum amd_powergating_state state = idle ? AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE; -	if (IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 11 && -	    ((adev->mes.kiq_version & AMDGPU_MES_VERSION_MASK) <= 64)) { +	if ((IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 11 && +	    ((adev->mes.kiq_version & AMDGPU_MES_VERSION_MASK) <= 64)) || +		(IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 12)) {  		pr_debug("GFXOFF is %s\n", idle ? "enabled" : "disabled");  		amdgpu_gfx_off_ctrl(adev, idle);  	} else if ((IP_VERSION_MAJ(amdgpu_ip_version(adev, GC_HWIP, 0)) == 9) && diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index d891ab779ca7..5df21529b3b1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -1801,13 +1801,18 @@ int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,  	if (dma_resv_locking_ctx((*bo)->tbo.base.resv) != &parser->exec.ticket)  		return -EINVAL; +	/* Make sure VRAM is allocated contigiously */  	(*bo)->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; -	amdgpu_bo_placement_from_domain(*bo, (*bo)->allowed_domains); -	for (i = 0; i < (*bo)->placement.num_placement; i++) -		(*bo)->placements[i].flags |= TTM_PL_FLAG_CONTIGUOUS; -	r = ttm_bo_validate(&(*bo)->tbo, &(*bo)->placement, &ctx); -	if (r) -		return r; +	if ((*bo)->tbo.resource->mem_type == TTM_PL_VRAM && +	    !((*bo)->tbo.resource->placement & TTM_PL_FLAG_CONTIGUOUS)) { + +		amdgpu_bo_placement_from_domain(*bo, (*bo)->allowed_domains); +		for (i = 0; i < (*bo)->placement.num_placement; i++) +			(*bo)->placements[i].flags |= TTM_PL_FLAG_CONTIGUOUS; +		r = ttm_bo_validate(&(*bo)->tbo, &(*bo)->placement, &ctx); +		if (r) +			return r; +	}  	return amdgpu_ttm_alloc_gart(&(*bo)->tbo);  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c index 946c48829f19..824f9da5b6ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c @@ -343,11 +343,10 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,  	coredump->skip_vram_check = skip_vram_check;  	coredump->reset_vram_lost = vram_lost; -	if (job && job->vm) { -		struct amdgpu_vm *vm = job->vm; +	if (job && job->pasid) {  		struct amdgpu_task_info *ti; -		ti = amdgpu_vm_get_task_info_vm(vm); +		ti = amdgpu_vm_get_task_info_pasid(adev, job->pasid);  		if (ti) {  			coredump->reset_task_info = *ti;  			amdgpu_vm_put_task_info(ti); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 9095c05e0269..cd4fac120834 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -145,7 +145,7 @@ const char *amdgpu_asic_name[] = {  	"LAST",  }; -#define AMDGPU_IP_BLK_MASK_ALL GENMASK(AMDGPU_MAX_IP_NUM - 1, 0) +#define AMDGPU_IP_BLK_MASK_ALL GENMASK(AMD_IP_BLOCK_TYPE_NUM  - 1, 0)  /*   * Default init level where all blocks are expected to be initialized. This is   * the level of initialization expected by default and also after a full reset @@ -417,6 +417,9 @@ bool amdgpu_device_supports_boco(struct drm_device *dev)  {  	struct amdgpu_device *adev = drm_to_adev(dev); +	if (!IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE)) +		return false; +  	if (adev->has_pr3 ||  	    ((adev->flags & AMD_IS_PX) && amdgpu_is_atpx_hybrid()))  		return true; @@ -3670,9 +3673,11 @@ static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev)  				continue;  			r = block->version->funcs->hw_init(&adev->ip_blocks[i]); -			DRM_INFO("RE-INIT-early: %s %s\n", block->version->funcs->name, r?"failed":"succeeded"); -			if (r) +			if (r) { +				dev_err(adev->dev, "RE-INIT-early: %s failed\n", +					 block->version->funcs->name);  				return r; +			}  			block->status.hw = true;  		}  	} @@ -3682,7 +3687,8 @@ static int amdgpu_device_ip_reinit_early_sriov(struct amdgpu_device *adev)  static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev)  { -	int i, r; +	struct amdgpu_ip_block *block; +	int i, r = 0;  	static enum amd_ip_block_type ip_order[] = {  		AMD_IP_BLOCK_TYPE_SMC, @@ -3697,34 +3703,28 @@ static int amdgpu_device_ip_reinit_late_sriov(struct amdgpu_device *adev)  	};  	for (i = 0; i < ARRAY_SIZE(ip_order); i++) { -		int j; -		struct amdgpu_ip_block *block; - -		for (j = 0; j < adev->num_ip_blocks; j++) { -			block = &adev->ip_blocks[j]; +		block = amdgpu_device_ip_get_ip_block(adev, ip_order[i]); -			if (block->version->type != ip_order[i] || -				!block->status.valid || -				block->status.hw) -				continue; +		if (!block) +			continue; +		if (block->status.valid && !block->status.hw) {  			if (block->version->type == AMD_IP_BLOCK_TYPE_SMC) { -				r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); -				if (r) -					return r; +				r = amdgpu_ip_block_resume(block);  			} else { -				r = block->version->funcs->hw_init(&adev->ip_blocks[i]); -				if (r) { -					DRM_ERROR("hw_init of IP block <%s> failed %d\n", -						  adev->ip_blocks[i].version->funcs->name, r); -					return r; -				} -				block->status.hw = true; +				r = block->version->funcs->hw_init(block); +			} + +			if (r) { +				dev_err(adev->dev, "RE-INIT-late: %s failed\n", +					 block->version->funcs->name); +				break;  			} +			block->status.hw = true;  		}  	} -	return 0; +	return r;  }  /** @@ -3765,7 +3765,7 @@ static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev)   *   * @adev: amdgpu_device pointer   * - * First resume function for hardware IPs.  The list of all the hardware + * Second resume function for hardware IPs.  The list of all the hardware   * IPs that make up the asic is walked and the resume callbacks are run for   * all blocks except COMMON, GMC, and IH.  resume puts the hardware into a   * functional state after a suspend and updates the software state as @@ -3783,6 +3783,7 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev)  		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||  		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||  		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH || +		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE ||  		    adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)  			continue;  		r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); @@ -3794,6 +3795,36 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev)  }  /** + * amdgpu_device_ip_resume_phase3 - run resume for hardware IPs + * + * @adev: amdgpu_device pointer + * + * Third resume function for hardware IPs.  The list of all the hardware + * IPs that make up the asic is walked and the resume callbacks are run for + * all DCE.  resume puts the hardware into a functional state after a suspend + * and updates the software state as necessary.  This function is also used + * for restoring the GPU after a GPU reset. + * + * Returns 0 on success, negative error code on failure. + */ +static int amdgpu_device_ip_resume_phase3(struct amdgpu_device *adev) +{ +	int i, r; + +	for (i = 0; i < adev->num_ip_blocks; i++) { +		if (!adev->ip_blocks[i].status.valid || adev->ip_blocks[i].status.hw) +			continue; +		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) { +			r = amdgpu_ip_block_resume(&adev->ip_blocks[i]); +			if (r) +				return r; +		} +	} + +	return 0; +} + +/**   * amdgpu_device_ip_resume - run resume for hardware IPs   *   * @adev: amdgpu_device pointer @@ -3822,6 +3853,13 @@ static int amdgpu_device_ip_resume(struct amdgpu_device *adev)  	if (adev->mman.buffer_funcs_ring->sched.ready)  		amdgpu_ttm_set_buffer_funcs_status(adev, true); +	if (r) +		return r; + +	amdgpu_fence_driver_hw_init(adev); + +	r = amdgpu_device_ip_resume_phase3(adev); +  	return r;  } @@ -4902,7 +4940,6 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients)  		dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r);  		goto exit;  	} -	amdgpu_fence_driver_hw_init(adev);  	if (!adev->in_s0ix) {  		r = amdgpu_amdkfd_resume(adev, adev->in_runpm); @@ -5487,6 +5524,10 @@ int amdgpu_device_reinit_after_reset(struct amdgpu_reset_context *reset_context)  				if (tmp_adev->mman.buffer_funcs_ring->sched.ready)  					amdgpu_ttm_set_buffer_funcs_status(tmp_adev, true); +				r = amdgpu_device_ip_resume_phase3(tmp_adev); +				if (r) +					goto out; +  				if (vram_lost)  					amdgpu_device_fill_reset_magic(tmp_adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.c index 2d4b67175b55..328a1b963548 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.c @@ -122,6 +122,10 @@ static int amdgpu_is_fw_attestation_supported(struct amdgpu_device *adev)  	if (adev->flags & AMD_IS_APU)  		return 0; +	if (amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(14, 0, 2) || +	    amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(14, 0, 3)) +		return 0; +  	if (adev->asic_type >= CHIP_SIENNA_CICHLID)  		return 1; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index 69a6b6dba0a5..1d155463d044 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c @@ -1989,6 +1989,7 @@ void amdgpu_gfx_enforce_isolation_ring_begin_use(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	u32 idx; +	bool sched_work = false;  	if (!adev->gfx.enable_cleaner_shader)  		return; @@ -2007,15 +2008,19 @@ void amdgpu_gfx_enforce_isolation_ring_begin_use(struct amdgpu_ring *ring)  	mutex_lock(&adev->enforce_isolation_mutex);  	if (adev->enforce_isolation[idx]) {  		if (adev->kfd.init_complete) -			amdgpu_gfx_kfd_sch_ctrl(adev, idx, false); +			sched_work = true;  	}  	mutex_unlock(&adev->enforce_isolation_mutex); + +	if (sched_work) +		amdgpu_gfx_kfd_sch_ctrl(adev, idx, false);  }  void amdgpu_gfx_enforce_isolation_ring_end_use(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	u32 idx; +	bool sched_work = false;  	if (!adev->gfx.enable_cleaner_shader)  		return; @@ -2031,9 +2036,12 @@ void amdgpu_gfx_enforce_isolation_ring_end_use(struct amdgpu_ring *ring)  	mutex_lock(&adev->enforce_isolation_mutex);  	if (adev->enforce_isolation[idx]) {  		if (adev->kfd.init_complete) -			amdgpu_gfx_kfd_sch_ctrl(adev, idx, true); +			sched_work = true;  	}  	mutex_unlock(&adev->enforce_isolation_mutex); + +	if (sched_work) +		amdgpu_gfx_kfd_sch_ctrl(adev, idx, true);  }  /* diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 8b512dc28df8..071f187f5e28 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -193,8 +193,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned int num_ibs,  	need_ctx_switch = ring->current_ctx != fence_ctx;  	if (ring->funcs->emit_pipeline_sync && job &&  	    ((tmp = amdgpu_sync_get_fence(&job->explicit_sync)) || -	     (amdgpu_sriov_vf(adev) && need_ctx_switch) || -	     amdgpu_vm_need_pipeline_sync(ring, job))) { +	     need_ctx_switch || amdgpu_vm_need_pipeline_sync(ring, job))) { +  		need_pipe_sync = true;  		if (tmp) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index b9d08bc96581..a21c510c408e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -255,7 +255,6 @@ void amdgpu_job_set_resources(struct amdgpu_job *job, struct amdgpu_bo *gds,  void amdgpu_job_free_resources(struct amdgpu_job *job)  { -	struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched);  	struct dma_fence *f;  	unsigned i; @@ -268,7 +267,7 @@ void amdgpu_job_free_resources(struct amdgpu_job *job)  		f = NULL;  	for (i = 0; i < job->num_ibs; ++i) -		amdgpu_ib_free(ring->adev, &job->ibs[i], f); +		amdgpu_ib_free(NULL, &job->ibs[i], f);  }  static void amdgpu_job_free_cb(struct drm_sched_job *s_job) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 9f922ec50ea2..c8180cad0abd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -61,7 +61,7 @@  #include "amdgpu_res_cursor.h"  #include "bif/bif_4_1_d.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  #define AMDGPU_TTM_VRAM_MAX_DW_READ	((size_t)128) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index 31fd30dcd593..65bb26215e86 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c @@ -551,6 +551,8 @@ static void amdgpu_uvd_force_into_uvd_segment(struct amdgpu_bo *abo)  	for (i = 0; i < abo->placement.num_placement; ++i) {  		abo->placements[i].fpfn = 0 >> PAGE_SHIFT;  		abo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT; +		if (abo->placements[i].mem_type == TTM_PL_VRAM) +			abo->placements[i].flags |= TTM_PL_FLAG_CONTIGUOUS;  	}  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 8d9bf7a0857f..c9c48b782ec1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -674,12 +674,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,  	pasid_mapping_needed &= adev->gmc.gmc_funcs->emit_pasid_mapping &&  		ring->funcs->emit_wreg; -	if (adev->gfx.enable_cleaner_shader && -	    ring->funcs->emit_cleaner_shader && -	    job->enforce_isolation) -		ring->funcs->emit_cleaner_shader(ring); - -	if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync) +	if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync && +	    !(job->enforce_isolation && !job->vmid))  		return 0;  	amdgpu_ring_ib_begin(ring); @@ -690,6 +686,11 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,  	if (need_pipe_sync)  		amdgpu_ring_emit_pipeline_sync(ring); +	if (adev->gfx.enable_cleaner_shader && +	    ring->funcs->emit_cleaner_shader && +	    job->enforce_isolation) +		ring->funcs->emit_cleaner_shader(ring); +  	if (vm_flush_needed) {  		trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr);  		amdgpu_ring_emit_vm_flush(ring, job->vmid, job->vm_pd_addr); @@ -1265,10 +1266,9 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va,  	 * next command submission.  	 */  	if (amdgpu_vm_is_bo_always_valid(vm, bo)) { -		uint32_t mem_type = bo->tbo.resource->mem_type; - -		if (!(bo->preferred_domains & -		      amdgpu_mem_type_to_domain(mem_type))) +		if (bo->tbo.resource && +		    !(bo->preferred_domains & +		      amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type)))  			amdgpu_vm_bo_evicted(&bo_va->base);  		else  			amdgpu_vm_bo_idle(&bo_va->base); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 7d26a962f811..ff5e52025266 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -567,7 +567,6 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,  		else  			remaining_size -= size;  	} -	mutex_unlock(&mgr->lock);  	if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS && adjust_dcc_size) {  		struct drm_buddy_block *dcc_block; @@ -584,6 +583,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,  				     (u64)vres->base.size,  				     &vres->blocks);  	} +	mutex_unlock(&mgr->lock);  	vres->base.start = 0;  	size = max_t(u64, amdgpu_vram_mgr_blocks_size(&vres->blocks), diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c index fe7c48f2fb2a..da327ab48a57 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c @@ -4123,7 +4123,7 @@ static int gfx_v12_0_set_clockgating_state(void *handle,  	if (amdgpu_sriov_vf(adev))  		return 0; -	switch (adev->ip_versions[GC_HWIP][0]) { +	switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {  	case IP_VERSION(12, 0, 0):  	case IP_VERSION(12, 0, 1):  		gfx_v12_0_update_gfx_clock_gating(adev, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c index e2b3dda57030..54459254bd37 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c @@ -45,6 +45,8 @@ MODULE_FIRMWARE("amdgpu/gc_9_4_3_mec.bin");  MODULE_FIRMWARE("amdgpu/gc_9_4_4_mec.bin");  MODULE_FIRMWARE("amdgpu/gc_9_4_3_rlc.bin");  MODULE_FIRMWARE("amdgpu/gc_9_4_4_rlc.bin"); +MODULE_FIRMWARE("amdgpu/gc_9_4_3_sjt_mec.bin"); +MODULE_FIRMWARE("amdgpu/gc_9_4_4_sjt_mec.bin");  #define GFX9_MEC_HPD_SIZE 4096  #define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L @@ -574,8 +576,12 @@ static int gfx_v9_4_3_init_cp_compute_microcode(struct amdgpu_device *adev,  {  	int err; -	err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, -				   "amdgpu/%s_mec.bin", chip_name); +	if (amdgpu_sriov_vf(adev)) +		err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, +				"amdgpu/%s_sjt_mec.bin", chip_name); +	else +		err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, +				"amdgpu/%s_mec.bin", chip_name);  	if (err)  		goto out;  	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1); diff --git a/drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c b/drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c index e019249883fb..194026e9be33 100644 --- a/drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/hdp_v4_0.c @@ -40,10 +40,12 @@  static void hdp_v4_0_flush_hdp(struct amdgpu_device *adev,  				struct amdgpu_ring *ring)  { -	if (!ring || !ring->funcs->emit_wreg) +	if (!ring || !ring->funcs->emit_wreg) {  		WREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); -	else +		RREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2); +	} else {  		amdgpu_ring_emit_wreg(ring, (adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); +	}  }  static void hdp_v4_0_invalidate_hdp(struct amdgpu_device *adev, @@ -54,11 +56,13 @@ static void hdp_v4_0_invalidate_hdp(struct amdgpu_device *adev,  	    amdgpu_ip_version(adev, HDP_HWIP, 0) == IP_VERSION(4, 4, 5))  		return; -	if (!ring || !ring->funcs->emit_wreg) +	if (!ring || !ring->funcs->emit_wreg) {  		WREG32_SOC15_NO_KIQ(HDP, 0, mmHDP_READ_CACHE_INVALIDATE, 1); -	else +		RREG32_SOC15_NO_KIQ(HDP, 0, mmHDP_READ_CACHE_INVALIDATE); +	} else {  		amdgpu_ring_emit_wreg(ring, SOC15_REG_OFFSET(  			HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 1); +	}  }  static void hdp_v4_0_query_ras_error_count(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/hdp_v5_0.c b/drivers/gpu/drm/amd/amdgpu/hdp_v5_0.c index ed7facacf2fe..d3962d469088 100644 --- a/drivers/gpu/drm/amd/amdgpu/hdp_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/hdp_v5_0.c @@ -31,10 +31,12 @@  static void hdp_v5_0_flush_hdp(struct amdgpu_device *adev,  				struct amdgpu_ring *ring)  { -	if (!ring || !ring->funcs->emit_wreg) +	if (!ring || !ring->funcs->emit_wreg) {  		WREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); -	else +		RREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2); +	} else {  		amdgpu_ring_emit_wreg(ring, (adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); +	}  }  static void hdp_v5_0_invalidate_hdp(struct amdgpu_device *adev, @@ -42,6 +44,7 @@ static void hdp_v5_0_invalidate_hdp(struct amdgpu_device *adev,  {  	if (!ring || !ring->funcs->emit_wreg) {  		WREG32_SOC15_NO_KIQ(HDP, 0, mmHDP_READ_CACHE_INVALIDATE, 1); +		RREG32_SOC15_NO_KIQ(HDP, 0, mmHDP_READ_CACHE_INVALIDATE);  	} else {  		amdgpu_ring_emit_wreg(ring, SOC15_REG_OFFSET(  					HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 1); diff --git a/drivers/gpu/drm/amd/amdgpu/hdp_v5_2.c b/drivers/gpu/drm/amd/amdgpu/hdp_v5_2.c index 29c3484ae1f1..f52552c5fa27 100644 --- a/drivers/gpu/drm/amd/amdgpu/hdp_v5_2.c +++ b/drivers/gpu/drm/amd/amdgpu/hdp_v5_2.c @@ -31,13 +31,15 @@  static void hdp_v5_2_flush_hdp(struct amdgpu_device *adev,  				struct amdgpu_ring *ring)  { -	if (!ring || !ring->funcs->emit_wreg) +	if (!ring || !ring->funcs->emit_wreg) {  		WREG32_NO_KIQ((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2,  			0); -	else +		RREG32_NO_KIQ((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2); +	} else {  		amdgpu_ring_emit_wreg(ring,  			(adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2,  			0); +	}  }  static void hdp_v5_2_update_mem_power_gating(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c b/drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c index 33736d361dd0..6948fe9956ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/hdp_v6_0.c @@ -34,10 +34,12 @@  static void hdp_v6_0_flush_hdp(struct amdgpu_device *adev,  				struct amdgpu_ring *ring)  { -	if (!ring || !ring->funcs->emit_wreg) +	if (!ring || !ring->funcs->emit_wreg) {  		WREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); -	else +		RREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2); +	} else {  		amdgpu_ring_emit_wreg(ring, (adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); +	}  }  static void hdp_v6_0_update_clock_gating(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/hdp_v7_0.c b/drivers/gpu/drm/amd/amdgpu/hdp_v7_0.c index 1c99bb09e2a1..63820329f67e 100644 --- a/drivers/gpu/drm/amd/amdgpu/hdp_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/hdp_v7_0.c @@ -31,10 +31,12 @@  static void hdp_v7_0_flush_hdp(struct amdgpu_device *adev,  				struct amdgpu_ring *ring)  { -	if (!ring || !ring->funcs->emit_wreg) +	if (!ring || !ring->funcs->emit_wreg) {  		WREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); -	else +		RREG32((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2); +	} else {  		amdgpu_ring_emit_wreg(ring, (adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); +	}  }  static void hdp_v7_0_update_clock_gating(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c index 7319299f25ae..03b8b7cd5229 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c @@ -604,7 +604,7 @@ static void jpeg_v1_0_set_irq_funcs(struct amdgpu_device *adev)  static void jpeg_v1_0_ring_begin_use(struct amdgpu_ring *ring)  {  	struct	amdgpu_device *adev = ring->adev; -	bool	set_clocks = !cancel_delayed_work_sync(&adev->jpeg.idle_work); +	bool	set_clocks = !cancel_delayed_work_sync(&adev->vcn.idle_work);  	int		cnt = 0;  	mutex_lock(&adev->vcn.vcn1_jpeg1_workaround); diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v4_1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v4_1_0.c index 0fbc3be81f14..f2ab5001b492 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v4_1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v4_1_0.c @@ -108,7 +108,7 @@ mmhub_v4_1_0_print_l2_protection_fault_status(struct amdgpu_device *adev,  	dev_err(adev->dev,  		"MMVM_L2_PROTECTION_FAULT_STATUS_LO32:0x%08X\n",  		status); -	switch (adev->ip_versions[MMHUB_HWIP][0]) { +	switch (amdgpu_ip_version(adev, MMHUB_HWIP, 0)) {  	case IP_VERSION(4, 1, 0):  		mmhub_cid = mmhub_client_ids_v4_1_0[cid][rw];  		break; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c index b1b57dcc5a73..d1032e9992b4 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c @@ -271,8 +271,19 @@ const struct nbio_hdp_flush_reg nbio_v7_0_hdp_flush_reg = {  	.ref_and_mask_sdma1 = GPU_HDP_FLUSH_DONE__SDMA1_MASK,  }; +#define regRCC_DEV0_EPF6_STRAP4                                                                         0xd304 +#define regRCC_DEV0_EPF6_STRAP4_BASE_IDX                                                                5 +  static void nbio_v7_0_init_registers(struct amdgpu_device *adev)  { +	uint32_t data; + +	switch (amdgpu_ip_version(adev, NBIO_HWIP, 0)) { +	case IP_VERSION(2, 5, 0): +		data = RREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF6_STRAP4) & ~BIT(23); +		WREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF6_STRAP4, data); +		break; +	}  }  #define MMIO_REG_HOLE_OFFSET (0x80000 - PAGE_SIZE) diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c index 814ab59fdd4a..41421da63a08 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_11.c @@ -275,7 +275,7 @@ static void nbio_v7_11_init_registers(struct amdgpu_device *adev)  	if (def != data)  		WREG32_SOC15(NBIO, 0, regBIF_BIF256_CI256_RC3X4_USB4_PCIE_MST_CTRL_3, data); -	switch (adev->ip_versions[NBIO_HWIP][0]) { +	switch (amdgpu_ip_version(adev, NBIO_HWIP, 0)) {  	case IP_VERSION(7, 11, 0):  	case IP_VERSION(7, 11, 1):  	case IP_VERSION(7, 11, 2): diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c index 1ac730328516..3fb6d2aa7e3b 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c @@ -247,7 +247,7 @@ static void nbio_v7_7_init_registers(struct amdgpu_device *adev)  	if (def != data)  		WREG32_SOC15(NBIO, 0, regBIF0_PCIE_MST_CTRL_3, data); -	switch (adev->ip_versions[NBIO_HWIP][0]) { +	switch (amdgpu_ip_version(adev, NBIO_HWIP, 0)) {  	case IP_VERSION(7, 7, 0):  		data = RREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF5_STRAP4) & ~BIT(23);  		WREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF5_STRAP4, data); diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c index 079131aeb2f7..3c8ab8698af8 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c @@ -1288,7 +1288,7 @@ static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,  					   struct amdgpu_job *job,  					   struct amdgpu_ib *ib)  { -	struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched); +	struct amdgpu_ring *ring = amdgpu_job_ring(job);  	unsigned i;  	/* No patching necessary for the first instance */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c index 723f1220e1cc..e5324c5bc6c7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c @@ -1423,6 +1423,7 @@ err:  static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev, +						   bool cache_line_size_missing,  						   struct kfd_gpu_cache_info *pcache_info)  {  	struct amdgpu_device *adev = kdev->adev; @@ -1437,6 +1438,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  					CRAT_CACHE_FLAGS_SIMD_CACHE);  		pcache_info[i].num_cu_shared = adev->gfx.config.gc_num_tcp_per_wpg / 2;  		pcache_info[i].cache_line_size = adev->gfx.config.gc_tcp_cache_line_size; +		if (cache_line_size_missing && !pcache_info[i].cache_line_size) +			pcache_info[i].cache_line_size = 128;  		i++;  	}  	/* Scalar L1 Instruction Cache per SQC */ @@ -1449,6 +1452,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  					CRAT_CACHE_FLAGS_SIMD_CACHE);  		pcache_info[i].num_cu_shared = adev->gfx.config.gc_num_sqc_per_wgp * 2;  		pcache_info[i].cache_line_size = adev->gfx.config.gc_instruction_cache_line_size; +		if (cache_line_size_missing && !pcache_info[i].cache_line_size) +			pcache_info[i].cache_line_size = 128;  		i++;  	}  	/* Scalar L1 Data Cache per SQC */ @@ -1460,6 +1465,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  					CRAT_CACHE_FLAGS_SIMD_CACHE);  		pcache_info[i].num_cu_shared = adev->gfx.config.gc_num_sqc_per_wgp * 2;  		pcache_info[i].cache_line_size = adev->gfx.config.gc_scalar_data_cache_line_size; +		if (cache_line_size_missing && !pcache_info[i].cache_line_size) +			pcache_info[i].cache_line_size = 64;  		i++;  	}  	/* GL1 Data Cache per SA */ @@ -1472,7 +1479,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  					CRAT_CACHE_FLAGS_DATA_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE);  		pcache_info[i].num_cu_shared = adev->gfx.config.max_cu_per_sh; -		pcache_info[i].cache_line_size = 0; +		if (cache_line_size_missing) +			pcache_info[i].cache_line_size = 128;  		i++;  	}  	/* L2 Data Cache per GPU (Total Tex Cache) */ @@ -1484,6 +1492,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  					CRAT_CACHE_FLAGS_SIMD_CACHE);  		pcache_info[i].num_cu_shared = adev->gfx.config.max_cu_per_sh;  		pcache_info[i].cache_line_size = adev->gfx.config.gc_tcc_cache_line_size; +		if (cache_line_size_missing && !pcache_info[i].cache_line_size) +			pcache_info[i].cache_line_size = 128;  		i++;  	}  	/* L3 Data Cache per GPU */ @@ -1494,7 +1504,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  					CRAT_CACHE_FLAGS_DATA_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE);  		pcache_info[i].num_cu_shared = adev->gfx.config.max_cu_per_sh; -		pcache_info[i].cache_line_size = 0; +		pcache_info[i].cache_line_size = 64;  		i++;  	}  	return i; @@ -1510,6 +1520,8 @@ static int kfd_fill_gpu_cache_info_from_gfx_config_v2(struct kfd_dev *kdev,  	if (adev->gfx.config.gc_tcp_size_per_cu) {  		pcache_info[i].cache_size = adev->gfx.config.gc_tcp_size_per_cu;  		pcache_info[i].cache_level = 1; +		/* Cacheline size not available in IP discovery for gc943,gc944 */ +		pcache_info[i].cache_line_size = 128;  		pcache_info[i].flags = (CRAT_CACHE_FLAGS_ENABLED |  					CRAT_CACHE_FLAGS_DATA_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE); @@ -1521,6 +1533,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config_v2(struct kfd_dev *kdev,  		pcache_info[i].cache_size =  			adev->gfx.config.gc_l1_instruction_cache_size_per_sqc;  		pcache_info[i].cache_level = 1; +		pcache_info[i].cache_line_size = 64;  		pcache_info[i].flags = (CRAT_CACHE_FLAGS_ENABLED |  					CRAT_CACHE_FLAGS_INST_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE); @@ -1531,6 +1544,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config_v2(struct kfd_dev *kdev,  	if (adev->gfx.config.gc_l1_data_cache_size_per_sqc) {  		pcache_info[i].cache_size = adev->gfx.config.gc_l1_data_cache_size_per_sqc;  		pcache_info[i].cache_level = 1; +		pcache_info[i].cache_line_size = 64;  		pcache_info[i].flags = (CRAT_CACHE_FLAGS_ENABLED |  					CRAT_CACHE_FLAGS_DATA_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE); @@ -1541,6 +1555,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config_v2(struct kfd_dev *kdev,  	if (adev->gfx.config.gc_tcc_size) {  		pcache_info[i].cache_size = adev->gfx.config.gc_tcc_size;  		pcache_info[i].cache_level = 2; +		pcache_info[i].cache_line_size = 128;  		pcache_info[i].flags = (CRAT_CACHE_FLAGS_ENABLED |  					CRAT_CACHE_FLAGS_DATA_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE); @@ -1551,6 +1566,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config_v2(struct kfd_dev *kdev,  	if (adev->gmc.mall_size) {  		pcache_info[i].cache_size = adev->gmc.mall_size / 1024;  		pcache_info[i].cache_level = 3; +		pcache_info[i].cache_line_size = 64;  		pcache_info[i].flags = (CRAT_CACHE_FLAGS_ENABLED |  					CRAT_CACHE_FLAGS_DATA_CACHE |  					CRAT_CACHE_FLAGS_SIMD_CACHE); @@ -1563,6 +1579,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config_v2(struct kfd_dev *kdev,  int kfd_get_gpu_cache_info(struct kfd_node *kdev, struct kfd_gpu_cache_info **pcache_info)  {  	int num_of_cache_types = 0; +	bool cache_line_size_missing = false;  	switch (kdev->adev->asic_type) {  	case CHIP_KAVERI: @@ -1686,10 +1703,17 @@ int kfd_get_gpu_cache_info(struct kfd_node *kdev, struct kfd_gpu_cache_info **pc  		case IP_VERSION(11, 5, 0):  		case IP_VERSION(11, 5, 1):  		case IP_VERSION(11, 5, 2): +			/* Cacheline size not available in IP discovery for gc11. +			 * kfd_fill_gpu_cache_info_from_gfx_config to hard code it +			 */ +			cache_line_size_missing = true; +			fallthrough;  		case IP_VERSION(12, 0, 0):  		case IP_VERSION(12, 0, 1):  			num_of_cache_types = -				kfd_fill_gpu_cache_info_from_gfx_config(kdev->kfd, *pcache_info); +				kfd_fill_gpu_cache_info_from_gfx_config(kdev->kfd, +									cache_line_size_missing, +									*pcache_info);  			break;  		default:  			*pcache_info = dummy_cache_info; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debug.c b/drivers/gpu/drm/amd/amdkfd/kfd_debug.c index 312dfa84f29f..a8abc3091801 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_debug.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_debug.c @@ -350,10 +350,27 @@ int kfd_dbg_set_mes_debug_mode(struct kfd_process_device *pdd, bool sq_trap_en)  {  	uint32_t spi_dbg_cntl = pdd->spi_dbg_override | pdd->spi_dbg_launch_mode;  	uint32_t flags = pdd->process->dbg_flags; +	struct amdgpu_device *adev = pdd->dev->adev; +	int r;  	if (!kfd_dbg_is_per_vmid_supported(pdd->dev))  		return 0; +	if (!pdd->proc_ctx_cpu_ptr) { +			r = amdgpu_amdkfd_alloc_gtt_mem(adev, +				AMDGPU_MES_PROC_CTX_SIZE, +				&pdd->proc_ctx_bo, +				&pdd->proc_ctx_gpu_addr, +				&pdd->proc_ctx_cpu_ptr, +				false); +		if (r) { +			dev_err(adev->dev, +			"failed to allocate process context bo\n"); +			return r; +		} +		memset(pdd->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE); +	} +  	return amdgpu_mes_set_shader_debugger(pdd->dev->adev, pdd->proc_ctx_gpu_addr, spi_dbg_cntl,  						pdd->watch_points, flags, sq_trap_en);  } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index 956198da7859..9b51dd75fefc 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c @@ -235,6 +235,9 @@ static void kfd_device_info_init(struct kfd_dev *kfd,  			 */  			kfd->device_info.needs_pci_atomics = true;  			kfd->device_info.no_atomic_fw_version = kfd->adev->gfx.rs64_enable ? 509 : 0; +		} else if (gc_version < IP_VERSION(13, 0, 0)) { +			kfd->device_info.needs_pci_atomics = true; +			kfd->device_info.no_atomic_fw_version = 2090;  		} else {  			kfd->device_info.needs_pci_atomics = true;  		} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index c79fe9069e22..16b5daaa272f 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -207,6 +207,21 @@ static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,  	if (!down_read_trylock(&adev->reset_domain->sem))  		return -EIO; +	if (!pdd->proc_ctx_cpu_ptr) { +		r = amdgpu_amdkfd_alloc_gtt_mem(adev, +				AMDGPU_MES_PROC_CTX_SIZE, +				&pdd->proc_ctx_bo, +				&pdd->proc_ctx_gpu_addr, +				&pdd->proc_ctx_cpu_ptr, +				false); +		if (r) { +			dev_err(adev->dev, +				"failed to allocate process context bo\n"); +			return r; +		} +		memset(pdd->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE); +	} +  	memset(&queue_input, 0x0, sizeof(struct mes_add_queue_input));  	queue_input.process_id = qpd->pqm->process->pasid;  	queue_input.page_table_base_addr =  qpd->page_table_base; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index eacfeb32f35d..4b275937d05e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c @@ -306,7 +306,7 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,  		spage = migrate_pfn_to_page(migrate->src[i]);  		if (spage && !is_zone_device_page(spage)) {  			src[i] = dma_map_page(dev, spage, 0, PAGE_SIZE, -					      DMA_TO_DEVICE); +					      DMA_BIDIRECTIONAL);  			r = dma_mapping_error(dev, src[i]);  			if (r) {  				dev_err(dev, "%s: fail %d dma_map_page\n", @@ -629,7 +629,7 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange,  			goto out_oom;  		} -		dst[i] = dma_map_page(dev, dpage, 0, PAGE_SIZE, DMA_FROM_DEVICE); +		dst[i] = dma_map_page(dev, dpage, 0, PAGE_SIZE, DMA_BIDIRECTIONAL);  		r = dma_mapping_error(dev, dst[i]);  		if (r) {  			dev_err(adev->dev, "%s: fail %d dma_map_page\n", __func__, r); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index 87cd52cf4ee9..edfe0b4788f4 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c @@ -1076,7 +1076,8 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)  		kfd_free_process_doorbells(pdd->dev->kfd, pdd); -		if (pdd->dev->kfd->shared_resources.enable_mes) +		if (pdd->dev->kfd->shared_resources.enable_mes && +			pdd->proc_ctx_cpu_ptr)  			amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev,  						   &pdd->proc_ctx_bo);  		/* @@ -1159,7 +1160,8 @@ static void kfd_process_wq_release(struct work_struct *work)  	 */  	synchronize_rcu();  	ef = rcu_access_pointer(p->ef); -	dma_fence_signal(ef); +	if (ef) +		dma_fence_signal(ef);  	kfd_process_remove_sysfs(p); @@ -1608,7 +1610,6 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev,  							struct kfd_process *p)  {  	struct kfd_process_device *pdd = NULL; -	int retval = 0;  	if (WARN_ON_ONCE(p->n_pdds >= MAX_GPU_INSTANCE))  		return NULL; @@ -1632,21 +1633,6 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev,  	pdd->user_gpu_id = dev->id;  	atomic64_set(&pdd->evict_duration_counter, 0); -	if (dev->kfd->shared_resources.enable_mes) { -		retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev, -						AMDGPU_MES_PROC_CTX_SIZE, -						&pdd->proc_ctx_bo, -						&pdd->proc_ctx_gpu_addr, -						&pdd->proc_ctx_cpu_ptr, -						false); -		if (retval) { -			dev_err(dev->adev->dev, -				"failed to allocate process context bo\n"); -			goto err_free_pdd; -		} -		memset(pdd->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE); -	} -  	p->pdds[p->n_pdds++] = pdd;  	if (kfd_dbg_is_per_vmid_supported(pdd->dev))  		pdd->spi_dbg_override = pdd->dev->kfd2kgd->disable_debug_trap( @@ -1658,10 +1644,6 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev,  	idr_init(&pdd->alloc_idr);  	return pdd; - -err_free_pdd: -	kfree(pdd); -	return NULL;  }  /** diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c index c76db22a1000..59b92d66e958 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c @@ -212,13 +212,17 @@ static void pqm_clean_queue_resource(struct process_queue_manager *pqm,  void pqm_uninit(struct process_queue_manager *pqm)  {  	struct process_queue_node *pqn, *next; -	struct kfd_process_device *pdd;  	list_for_each_entry_safe(pqn, next, &pqm->queues, process_queue_list) {  		if (pqn->q) { -			pdd = kfd_get_process_device_data(pqn->q->device, pqm->process); -			kfd_queue_unref_bo_vas(pdd, &pqn->q->properties); -			kfd_queue_release_buffers(pdd, &pqn->q->properties); +			struct kfd_process_device *pdd = kfd_get_process_device_data(pqn->q->device, +										     pqm->process); +			if (pdd) { +				kfd_queue_unref_bo_vas(pdd, &pqn->q->properties); +				kfd_queue_release_buffers(pdd, &pqn->q->properties); +			} else { +				WARN_ON(!pdd); +			}  			pqm_clean_queue_resource(pqm, pqn);  		} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index f0a6816709ca..5f216d626cbb 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -3481,6 +3481,8 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)  		caps->aux_support = false;  	else if (amdgpu_backlight == 1)  		caps->aux_support = true; +	if (caps->aux_support) +		aconnector->dc_link->backlight_control_type = BACKLIGHT_CONTROL_AMD_AUX;  	luminance_range = &conn_base->display_info.luminance_range; @@ -8398,16 +8400,6 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,  				 struct amdgpu_crtc *acrtc,  				 struct dm_crtc_state *acrtc_state)  { -	/* -	 * We have no guarantee that the frontend index maps to the same -	 * backend index - some even map to more than one. -	 * -	 * TODO: Use a different interrupt or check DC itself for the mapping. -	 */ -	int irq_type = -		amdgpu_display_crtc_idx_to_irq_type( -			adev, -			acrtc->crtc_id);  	struct drm_vblank_crtc_config config = {0};  	struct dc_crtc_timing *timing;  	int offdelay; @@ -8433,28 +8425,7 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,  		drm_crtc_vblank_on_config(&acrtc->base,  					  &config); - -		amdgpu_irq_get( -			adev, -			&adev->pageflip_irq, -			irq_type); -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) -		amdgpu_irq_get( -			adev, -			&adev->vline0_irq, -			irq_type); -#endif  	} else { -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) -		amdgpu_irq_put( -			adev, -			&adev->vline0_irq, -			irq_type); -#endif -		amdgpu_irq_put( -			adev, -			&adev->pageflip_irq, -			irq_type);  		drm_crtc_vblank_off(&acrtc->base);  	}  } @@ -8925,6 +8896,7 @@ static void amdgpu_dm_enable_self_refresh(struct amdgpu_crtc *acrtc_attach,  	struct replay_settings *pr = &acrtc_state->stream->link->replay_settings;  	struct amdgpu_dm_connector *aconn =  		(struct amdgpu_dm_connector *)acrtc_state->stream->dm_stream_context; +	bool vrr_active = amdgpu_dm_crtc_vrr_active(acrtc_state);  	if (acrtc_state->update_type > UPDATE_TYPE_FAST) {  		if (pr->config.replay_supported && !pr->replay_feature_enabled) @@ -8951,14 +8923,15 @@ static void amdgpu_dm_enable_self_refresh(struct amdgpu_crtc *acrtc_attach,  		 * adequate number of fast atomic commits to notify KMD  		 * of update events. See `vblank_control_worker()`.  		 */ -		if (acrtc_attach->dm_irq_params.allow_sr_entry && +		if (!vrr_active && +		    acrtc_attach->dm_irq_params.allow_sr_entry &&  #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY  		    !amdgpu_dm_crc_window_is_activated(acrtc_state->base.crtc) &&  #endif  		    (current_ts - psr->psr_dirty_rects_change_timestamp_ns) > 500000000) {  			if (pr->replay_feature_enabled && !pr->replay_allow_active)  				amdgpu_dm_replay_enable(acrtc_state->stream, true); -			if (psr->psr_version >= DC_PSR_VERSION_SU_1 && +			if (psr->psr_version == DC_PSR_VERSION_SU_1 &&  			    !psr->psr_allow_active && !aconn->disallow_edp_enter_psr)  				amdgpu_dm_psr_enable(acrtc_state->stream);  		} @@ -9129,7 +9102,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,  				acrtc_state->stream->link->psr_settings.psr_dirty_rects_change_timestamp_ns =  				timestamp_ns;  				if (acrtc_state->stream->link->psr_settings.psr_allow_active) -					amdgpu_dm_psr_disable(acrtc_state->stream); +					amdgpu_dm_psr_disable(acrtc_state->stream, true);  				mutex_unlock(&dm->dc_lock);  			}  		} @@ -9295,11 +9268,11 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,  			bundle->stream_update.abm_level = &acrtc_state->abm_level;  		mutex_lock(&dm->dc_lock); -		if (acrtc_state->update_type > UPDATE_TYPE_FAST) { +		if ((acrtc_state->update_type > UPDATE_TYPE_FAST) || vrr_active) {  			if (acrtc_state->stream->link->replay_settings.replay_allow_active)  				amdgpu_dm_replay_disable(acrtc_state->stream);  			if (acrtc_state->stream->link->psr_settings.psr_allow_active) -				amdgpu_dm_psr_disable(acrtc_state->stream); +				amdgpu_dm_psr_disable(acrtc_state->stream, true);  		}  		mutex_unlock(&dm->dc_lock); @@ -11153,8 +11126,8 @@ dm_get_plane_scale(struct drm_plane_state *plane_state,  	int plane_src_w, plane_src_h;  	dm_get_oriented_plane_size(plane_state, &plane_src_w, &plane_src_h); -	*out_plane_scale_w = plane_state->crtc_w * 1000 / plane_src_w; -	*out_plane_scale_h = plane_state->crtc_h * 1000 / plane_src_h; +	*out_plane_scale_w = plane_src_w ? plane_state->crtc_w * 1000 / plane_src_w : 0; +	*out_plane_scale_h = plane_src_h ? plane_state->crtc_h * 1000 / plane_src_h : 0;  }  /* @@ -11408,6 +11381,25 @@ static int dm_crtc_get_cursor_mode(struct amdgpu_device *adev,  	return 0;  } +static bool amdgpu_dm_crtc_mem_type_changed(struct drm_device *dev, +					    struct drm_atomic_state *state, +					    struct drm_crtc_state *crtc_state) +{ +	struct drm_plane *plane; +	struct drm_plane_state *new_plane_state, *old_plane_state; + +	drm_for_each_plane_mask(plane, dev, crtc_state->plane_mask) { +		new_plane_state = drm_atomic_get_plane_state(state, plane); +		old_plane_state = drm_atomic_get_plane_state(state, plane); + +		if (old_plane_state->fb && new_plane_state->fb && +		    get_mem_type(old_plane_state->fb) != get_mem_type(new_plane_state->fb)) +			return true; +	} + +	return false; +} +  /**   * amdgpu_dm_atomic_check() - Atomic check implementation for AMDgpu DM.   * @@ -11605,10 +11597,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,  	/* Remove exiting planes if they are modified */  	for_each_oldnew_plane_in_descending_zpos(state, plane, old_plane_state, new_plane_state) { -		if (old_plane_state->fb && new_plane_state->fb && -		    get_mem_type(old_plane_state->fb) != -		    get_mem_type(new_plane_state->fb)) -			lock_and_validation_needed = true;  		ret = dm_update_plane_state(dc, state, plane,  					    old_plane_state, @@ -11903,9 +11891,11 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,  		/*  		 * Only allow async flips for fast updates that don't change -		 * the FB pitch, the DCC state, rotation, etc. +		 * the FB pitch, the DCC state, rotation, mem_type, etc.  		 */ -		if (new_crtc_state->async_flip && lock_and_validation_needed) { +		if (new_crtc_state->async_flip && +		    (lock_and_validation_needed || +		     amdgpu_dm_crtc_mem_type_changed(dev, state, new_crtc_state))) {  			drm_dbg_atomic(crtc->dev,  				       "[CRTC:%d:%s] async flips are only supported for fast updates\n",  				       crtc->base.id, crtc->name); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index 6464a8378387..2227cd8e4a89 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -697,6 +697,8 @@ struct amdgpu_dm_connector {  	struct drm_dp_mst_port *mst_output_port;  	struct amdgpu_dm_connector *mst_root;  	struct drm_dp_aux *dsc_aux; +	uint32_t mst_local_bw; +	uint16_t vc_full_pbn;  	struct mutex handle_mst_msg_ready;  	/* TODO see if we can merge with ddc_bus or make a dm_connector */ diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c index f936a35fa9eb..0f6ba7b1575d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c @@ -30,6 +30,7 @@  #include "amdgpu_dm.h"  #include "dc.h"  #include "amdgpu_securedisplay.h" +#include "amdgpu_dm_psr.h"  static const char *const pipe_crc_sources[] = {  	"none", @@ -224,6 +225,10 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,  	mutex_lock(&adev->dm.dc_lock); +	/* For PSR1, check that the panel has exited PSR */ +	if (stream_state->link->psr_settings.psr_version < DC_PSR_VERSION_SU_1) +		amdgpu_dm_psr_wait_disable(stream_state); +  	/* Enable or disable CRTC CRC generation */  	if (dm_is_crc_source_crtc(source) || source == AMDGPU_DM_PIPE_CRC_SOURCE_NONE) {  		if (!dc_stream_configure_crc(stream_state->ctx->dc, @@ -357,6 +362,17 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)  	} +	/* +	 * Reading the CRC requires the vblank interrupt handler to be +	 * enabled. Keep a reference until CRC capture stops. +	 */ +	enabled = amdgpu_dm_is_valid_crc_source(cur_crc_src); +	if (!enabled && enable) { +		ret = drm_crtc_vblank_get(crtc); +		if (ret) +			goto cleanup; +	} +  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)  	/* Reset secure_display when we change crc source from debugfs */  	amdgpu_dm_set_crc_window_default(crtc, crtc_state->stream); @@ -367,16 +383,7 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)  		goto cleanup;  	} -	/* -	 * Reading the CRC requires the vblank interrupt handler to be -	 * enabled. Keep a reference until CRC capture stops. -	 */ -	enabled = amdgpu_dm_is_valid_crc_source(cur_crc_src);  	if (!enabled && enable) { -		ret = drm_crtc_vblank_get(crtc); -		if (ret) -			goto cleanup; -  		if (dm_is_crc_source_dprx(source)) {  			if (drm_dp_start_crc(aux, crtc)) {  				DRM_DEBUG_DRIVER("dp start crc failed\n"); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c index 64a041c2af05..36a830a7440f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c @@ -93,7 +93,7 @@ int amdgpu_dm_crtc_set_vupdate_irq(struct drm_crtc *crtc, bool enable)  	return rc;  } -bool amdgpu_dm_crtc_vrr_active(struct dm_crtc_state *dm_state) +bool amdgpu_dm_crtc_vrr_active(const struct dm_crtc_state *dm_state)  {  	return dm_state->freesync_config.state == VRR_STATE_ACTIVE_VARIABLE ||  	       dm_state->freesync_config.state == VRR_STATE_ACTIVE_FIXED; @@ -142,7 +142,7 @@ static void amdgpu_dm_crtc_set_panel_sr_feature(  		amdgpu_dm_replay_enable(vblank_work->stream, true);  	} else if (vblank_enabled) {  		if (link->psr_settings.psr_version < DC_PSR_VERSION_SU_1 && is_sr_active) -			amdgpu_dm_psr_disable(vblank_work->stream); +			amdgpu_dm_psr_disable(vblank_work->stream, false);  	} else if (link->psr_settings.psr_feature_enabled &&  		allow_sr_entry && !is_sr_active && !is_crc_window_active) { diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h index 17e948753f59..c1212947a77b 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.h @@ -37,7 +37,7 @@ int amdgpu_dm_crtc_set_vupdate_irq(struct drm_crtc *crtc, bool enable);  bool amdgpu_dm_crtc_vrr_active_irq(struct amdgpu_crtc *acrtc); -bool amdgpu_dm_crtc_vrr_active(struct dm_crtc_state *dm_state); +bool amdgpu_dm_crtc_vrr_active(const struct dm_crtc_state *dm_state);  int amdgpu_dm_crtc_enable_vblank(struct drm_crtc *crtc); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index 6a97bb2d9160..8b7c1a428f64 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -3606,7 +3606,7 @@ static int crc_win_update_set(void *data, u64 val)  		/* PSR may write to OTG CRC window control register,  		 * so close it before starting secure_display.  		 */ -		amdgpu_dm_psr_disable(acrtc->dm_irq_params.stream); +		amdgpu_dm_psr_disable(acrtc->dm_irq_params.stream, true);  		spin_lock_irq(&adev_to_drm(adev)->event_lock); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index b0fea0856866..6cbbb71d752b 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -907,14 +907,14 @@ dm_helpers_probe_acpi_edid(void *data, u8 *buf, unsigned int block, size_t len)  	struct drm_connector *connector = data;  	struct acpi_device *acpidev = ACPI_COMPANION(connector->dev->dev);  	unsigned char start = block * EDID_LENGTH; -	void *edid; +	struct edid *edid;  	int r;  	if (!acpidev)  		return -ENODEV;  	/* fetch the entire edid from BIOS */ -	r = acpi_video_get_edid(acpidev, ACPI_VIDEO_DISPLAY_LCD, -1, &edid); +	r = acpi_video_get_edid(acpidev, ACPI_VIDEO_DISPLAY_LCD, -1, (void *)&edid);  	if (r < 0) {  		drm_dbg(connector->dev, "Failed to get EDID from ACPI: %d\n", r);  		return r; @@ -924,7 +924,14 @@ dm_helpers_probe_acpi_edid(void *data, u8 *buf, unsigned int block, size_t len)  		goto cleanup;  	} -	memcpy(buf, edid + start, len); +	/* sanity check */ +	if (edid->revision < 4 || !(edid->input & DRM_EDID_INPUT_DIGITAL) || +	    (edid->input & DRM_EDID_DIGITAL_TYPE_MASK) == DRM_EDID_DIGITAL_TYPE_UNDEF) { +		r = -EINVAL; +		goto cleanup; +	} + +	memcpy(buf, (void *)edid + start, len);  	r = 0;  cleanup: diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 6e4359490613..1080075ccb17 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -155,6 +155,17 @@ amdgpu_dm_mst_connector_late_register(struct drm_connector *connector)  	return 0;  } + +static inline void +amdgpu_dm_mst_reset_mst_connector_setting(struct amdgpu_dm_connector *aconnector) +{ +	aconnector->drm_edid = NULL; +	aconnector->dsc_aux = NULL; +	aconnector->mst_output_port->passthrough_aux = NULL; +	aconnector->mst_local_bw = 0; +	aconnector->vc_full_pbn = 0; +} +  static void  amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector)  { @@ -182,9 +193,7 @@ amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector)  		dc_sink_release(dc_sink);  		aconnector->dc_sink = NULL; -		aconnector->drm_edid = NULL; -		aconnector->dsc_aux = NULL; -		port->passthrough_aux = NULL; +		amdgpu_dm_mst_reset_mst_connector_setting(aconnector);  	}  	aconnector->mst_status = MST_STATUS_DEFAULT; @@ -504,9 +513,7 @@ dm_dp_mst_detect(struct drm_connector *connector,  		dc_sink_release(aconnector->dc_sink);  		aconnector->dc_sink = NULL; -		aconnector->drm_edid = NULL; -		aconnector->dsc_aux = NULL; -		port->passthrough_aux = NULL; +		amdgpu_dm_mst_reset_mst_connector_setting(aconnector);  		amdgpu_dm_set_mst_status(&aconnector->mst_status,  			MST_REMOTE_EDID | MST_ALLOCATE_NEW_PAYLOAD | MST_CLEAR_ALLOCATED_PAYLOAD, @@ -1819,9 +1826,18 @@ enum dc_status dm_dp_mst_is_port_support_mode(  			struct drm_dp_mst_port *immediate_upstream_port = NULL;  			uint32_t end_link_bw = 0; -			/*Get last DP link BW capability*/ -			if (dp_get_link_current_set_bw(&aconnector->mst_output_port->aux, &end_link_bw)) { -				if (stream_kbps > end_link_bw) { +			/*Get last DP link BW capability. Mode shall be supported by Legacy peer*/ +			if (aconnector->mst_output_port->pdt != DP_PEER_DEVICE_DP_LEGACY_CONV && +				aconnector->mst_output_port->pdt != DP_PEER_DEVICE_NONE) { +				if (aconnector->vc_full_pbn != aconnector->mst_output_port->full_pbn) { +					dp_get_link_current_set_bw(&aconnector->mst_output_port->aux, &end_link_bw); +					aconnector->vc_full_pbn = aconnector->mst_output_port->full_pbn; +					aconnector->mst_local_bw = end_link_bw; +				} else { +					end_link_bw = aconnector->mst_local_bw; +				} + +				if (end_link_bw > 0 && stream_kbps > end_link_bw) {  					DRM_DEBUG_DRIVER("MST_DSC dsc decode at last link."  							 "Mode required bw can't fit into last link\n");  					return DC_FAIL_BANDWIDTH_VALIDATE; @@ -1835,11 +1851,15 @@ enum dc_status dm_dp_mst_is_port_support_mode(  			if (immediate_upstream_port) {  				virtual_channel_bw_in_kbps = kbps_from_pbn(immediate_upstream_port->full_pbn);  				virtual_channel_bw_in_kbps = min(root_link_bw_in_kbps, virtual_channel_bw_in_kbps); -				if (bw_range.min_kbps > virtual_channel_bw_in_kbps) { -					DRM_DEBUG_DRIVER("MST_DSC dsc decode at last link." -							 "Max dsc compression can't fit into MST available bw\n"); -					return DC_FAIL_BANDWIDTH_VALIDATE; -				} +			} else { +				/* For topology LCT 1 case - only one mstb*/ +				virtual_channel_bw_in_kbps = root_link_bw_in_kbps; +			} + +			if (bw_range.min_kbps > virtual_channel_bw_in_kbps) { +				DRM_DEBUG_DRIVER("MST_DSC dsc decode at last link." +						 "Max dsc compression can't fit into MST available bw\n"); +				return DC_FAIL_BANDWIDTH_VALIDATE;  			}  		} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c index f40240aafe98..45858bf1523d 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c @@ -201,14 +201,13 @@ void amdgpu_dm_psr_enable(struct dc_stream_state *stream)   *   * Return: true if success   */ -bool amdgpu_dm_psr_disable(struct dc_stream_state *stream) +bool amdgpu_dm_psr_disable(struct dc_stream_state *stream, bool wait)  { -	unsigned int power_opt = 0;  	bool psr_enable = false;  	DRM_DEBUG_DRIVER("Disabling psr...\n"); -	return dc_link_set_psr_allow_active(stream->link, &psr_enable, true, false, &power_opt); +	return dc_link_set_psr_allow_active(stream->link, &psr_enable, wait, false, NULL);  }  /* @@ -251,3 +250,33 @@ bool amdgpu_dm_psr_is_active_allowed(struct amdgpu_display_manager *dm)  	return allow_active;  } + +/** + * amdgpu_dm_psr_wait_disable() - Wait for eDP panel to exit PSR + * @stream: stream state attached to the eDP link + * + * Waits for a max of 500ms for the eDP panel to exit PSR. + * + * Return: true if panel exited PSR, false otherwise. + */ +bool amdgpu_dm_psr_wait_disable(struct dc_stream_state *stream) +{ +	enum dc_psr_state psr_state = PSR_STATE0; +	struct dc_link *link = stream->link; +	int retry_count; + +	if (link == NULL) +		return false; + +	for (retry_count = 0; retry_count <= 1000; retry_count++) { +		dc_link_get_psr_state(link, &psr_state); +		if (psr_state == PSR_STATE0) +			break; +		udelay(500); +	} + +	if (retry_count == 1000) +		return false; + +	return true; +} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h index cd2d45c2b5ef..e2366321a3c1 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.h @@ -34,8 +34,9 @@  void amdgpu_dm_set_psr_caps(struct dc_link *link);  void amdgpu_dm_psr_enable(struct dc_stream_state *stream);  bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream); -bool amdgpu_dm_psr_disable(struct dc_stream_state *stream); +bool amdgpu_dm_psr_disable(struct dc_stream_state *stream, bool wait);  bool amdgpu_dm_psr_disable_all(struct amdgpu_display_manager *dm);  bool amdgpu_dm_psr_is_active_allowed(struct amdgpu_display_manager *dm); +bool amdgpu_dm_psr_wait_disable(struct dc_stream_state *stream);  #endif /* AMDGPU_DM_AMDGPU_DM_PSR_H_ */ diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 1dd26d5df6b9..2723558049d6 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -4510,7 +4510,7 @@ static bool commit_minimal_transition_based_on_current_context(struct dc *dc,  	struct pipe_split_policy_backup policy;  	struct dc_state *intermediate_context;  	struct dc_state *old_current_state = dc->current_state; -	struct dc_surface_update srf_updates[MAX_SURFACE_NUM] = {0}; +	struct dc_surface_update srf_updates[MAX_SURFACES] = {0};  	int surface_count;  	/* @@ -6109,3 +6109,21 @@ struct dc_power_profile dc_get_power_profile_for_dc_state(const struct dc_state  		profile.power_level = dc->res_pool->funcs->get_power_profile(context);  	return profile;  } + +/* + ********************************************************************************** + * dc_get_det_buffer_size_from_state() - extracts detile buffer size from dc state + * + * Called when DM wants to log detile buffer size from dc_state + * + ********************************************************************************** + */ +unsigned int dc_get_det_buffer_size_from_state(const struct dc_state *context) +{ +	struct dc *dc = context->clk_mgr->ctx->dc; + +	if (dc->res_pool->funcs->get_det_buffer_size) +		return dc->res_pool->funcs->get_det_buffer_size(context); +	else +		return 0; +} diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c index 619fad17de55..626f75b6ad00 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c @@ -2094,7 +2094,8 @@ int resource_get_odm_slice_dst_width(struct pipe_ctx *otg_master,  	count = resource_get_odm_slice_count(otg_master);  	h_active = timing->h_addressable +  			timing->h_border_left + -			timing->h_border_right; +			timing->h_border_right + +			otg_master->hblank_borrow;  	width = h_active / count;  	if (otg_master->stream_res.tg) @@ -4027,6 +4028,41 @@ fail:  }  /** + * decide_hblank_borrow - Decides the horizontal blanking borrow value for a given pipe context. + * @pipe_ctx: Pointer to the pipe context structure. + * + * This function calculates the horizontal blanking borrow value for a given pipe context based on the + * display stream compression (DSC) configuration. If the horizontal active pixels (hactive) are less + * than the total width of the DSC slices, it sets the hblank_borrow value to the difference. If the + * total horizontal timing minus the hblank_borrow value is less than 32, it resets the hblank_borrow + * value to 0. + */ +static void decide_hblank_borrow(struct pipe_ctx *pipe_ctx) +{ +	uint32_t hactive; +	uint32_t ceil_slice_width; +	struct dc_stream_state *stream = NULL; + +	if (!pipe_ctx) +		return; + +	stream = pipe_ctx->stream; + +	if (stream->timing.flags.DSC) { +		hactive = stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right; + +		/* Assume if determined slices does not divide Hactive evenly, Hborrow is needed for padding*/ +		if (hactive % stream->timing.dsc_cfg.num_slices_h != 0) { +			ceil_slice_width = (hactive / stream->timing.dsc_cfg.num_slices_h) + 1; +			pipe_ctx->hblank_borrow = ceil_slice_width * stream->timing.dsc_cfg.num_slices_h - hactive; + +			if (stream->timing.h_total - hactive - pipe_ctx->hblank_borrow < 32) +				pipe_ctx->hblank_borrow = 0; +		} +	} +} + +/**   * dc_validate_global_state() - Determine if hardware can support a given state   *   * @dc: dc struct for this driver @@ -4064,6 +4100,10 @@ enum dc_status dc_validate_global_state(  			if (pipe_ctx->stream != stream)  				continue; +			/* Decide whether hblank borrow is needed and save it in pipe_ctx */ +			if (dc->debug.enable_hblank_borrow) +				decide_hblank_borrow(pipe_ctx); +  			if (dc->res_pool->funcs->patch_unknown_plane_state &&  					pipe_ctx->plane_state &&  					pipe_ctx->plane_state->tiling_info.gfx9.swizzle == DC_SW_UNKNOWN) { diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_state.c b/drivers/gpu/drm/amd/display/dc/core/dc_state.c index e006f816ff2f..1b2cce127981 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_state.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_state.c @@ -483,9 +483,9 @@ bool dc_state_add_plane(  	if (stream_status == NULL) {  		dm_error("Existing stream not found; failed to attach surface!\n");  		goto out; -	} else if (stream_status->plane_count == MAX_SURFACE_NUM) { +	} else if (stream_status->plane_count == MAX_SURFACES) {  		dm_error("Surface: can not attach plane_state %p! Maximum is: %d\n", -				plane_state, MAX_SURFACE_NUM); +				plane_state, MAX_SURFACES);  		goto out;  	} else if (!otg_master_pipe) {  		goto out; @@ -600,7 +600,7 @@ bool dc_state_rem_all_planes_for_stream(  {  	int i, old_plane_count;  	struct dc_stream_status *stream_status = NULL; -	struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 }; +	struct dc_plane_state *del_planes[MAX_SURFACES] = { 0 };  	for (i = 0; i < state->stream_count; i++)  		if (state->streams[i] == stream) { @@ -875,7 +875,7 @@ bool dc_state_rem_all_phantom_planes_for_stream(  {  	int i, old_plane_count;  	struct dc_stream_status *stream_status = NULL; -	struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 }; +	struct dc_plane_state *del_planes[MAX_SURFACES] = { 0 };  	for (i = 0; i < state->stream_count; i++)  		if (state->streams[i] == phantom_stream) { diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index 104051935884..08c5a315b3a6 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -57,7 +57,7 @@ struct dmub_notification;  #define DC_VER "3.2.310" -#define MAX_SURFACES 3 +#define MAX_SURFACES 4  #define MAX_PLANES 6  #define MAX_STREAMS 6  #define MIN_VIEWPORT_SIZE 12 @@ -290,6 +290,7 @@ struct dc_caps {  	uint16_t subvp_vertical_int_margin_us;  	bool seamless_odm;  	uint32_t max_v_total; +	bool vtotal_limited_by_fp2;  	uint32_t max_disp_clock_khz_at_vmin;  	uint8_t subvp_drr_vblank_start_margin_us;  	bool cursor_not_scaled; @@ -1068,6 +1069,7 @@ struct dc_debug_options {  	unsigned int scale_to_sharpness_policy;  	bool skip_full_updated_if_possible;  	unsigned int enable_oled_edp_power_up_opt; +	bool enable_hblank_borrow;  }; @@ -1396,7 +1398,7 @@ struct dc_scratch_space {  	 * store current value in plane states so we can still recover  	 * a valid current state during dc update.  	 */ -	struct dc_plane_state plane_states[MAX_SURFACE_NUM]; +	struct dc_plane_state plane_states[MAX_SURFACES];  	struct dc_stream_state stream_state;  }; @@ -2550,6 +2552,8 @@ struct dc_power_profile {  struct dc_power_profile dc_get_power_profile_for_dc_state(const struct dc_state *context); +unsigned int dc_get_det_buffer_size_from_state(const struct dc_state *context); +  /* DSC Interfaces */  #include "dc_dsc.h" diff --git a/drivers/gpu/drm/amd/display/dc/dc_spl_translate.c b/drivers/gpu/drm/amd/display/dc/dc_spl_translate.c index c8d8e335fa37..0e310fd48b5c 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_spl_translate.c +++ b/drivers/gpu/drm/amd/display/dc/dc_spl_translate.c @@ -120,7 +120,7 @@ void translate_SPL_in_params_from_pipe_ctx(struct pipe_ctx *pipe_ctx, struct spl  	spl_in->odm_slice_index = resource_get_odm_slice_index(pipe_ctx);  	// Make spl input basic out info output_size width point to stream h active  	spl_in->basic_out.output_size.width = -		stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right; +		stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right + pipe_ctx->hblank_borrow;  	// Make spl input basic out info output_size height point to v active  	spl_in->basic_out.output_size.height =  		stream->timing.v_addressable + stream->timing.v_border_bottom + stream->timing.v_border_top; diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h index 413970588a26..860506c6bda4 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_stream.h +++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h @@ -56,7 +56,7 @@ struct dc_stream_status {  	int plane_count;  	int audio_inst;  	struct timing_sync_info timing_sync_info; -	struct dc_plane_state *plane_states[MAX_SURFACE_NUM]; +	struct dc_plane_state *plane_states[MAX_SURFACES];  	bool is_abm_supported;  	struct mall_stream_config mall_stream_config;  	bool fpo_in_use; diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h index edf4df1d03b5..9466b63644d5 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_types.h @@ -76,7 +76,6 @@ struct dc_perf_trace {  	unsigned long last_entry_write;  }; -#define MAX_SURFACE_NUM 6  #define NUM_PIXEL_FORMATS 10  enum tiling_mode { diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c index bf636b28e3e1..5bb8b78bf250 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c @@ -63,7 +63,8 @@ void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,  bool should_use_dmub_lock(struct dc_link *link)  { -	if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1) +	if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1 || +	    link->psr_settings.psr_version == DC_PSR_VERSION_1)  		return true;  	if (link->replay_settings.replay_feature_enabled) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c index beed7adbbd43..47d785204f29 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn35/dcn35_fpu.c @@ -195,9 +195,9 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_5_soc = {  	.dcn_downspread_percent = 0.5,  	.gpuvm_min_page_size_bytes = 4096,  	.hostvm_min_page_size_bytes = 4096, -	.do_urgent_latency_adjustment = 1, +	.do_urgent_latency_adjustment = 0,  	.urgent_latency_adjustment_fabric_clock_component_us = 0, -	.urgent_latency_adjustment_fabric_clock_reference_mhz = 3000, +	.urgent_latency_adjustment_fabric_clock_reference_mhz = 0,  };  void dcn35_build_wm_range_table_fpu(struct clk_mgr *clk_mgr) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h b/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h index 072bd0539605..6b2ab4ec2b5f 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h +++ b/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h @@ -66,11 +66,15 @@ static inline double dml_max5(double a, double b, double c, double d, double e)  static inline double dml_ceil(double a, double granularity)  { +	if (granularity == 0) +		return 0;  	return (double) dcn_bw_ceil2(a, granularity);  }  static inline double dml_floor(double a, double granularity)  { +	if (granularity == 0) +		return 0;  	return (double) dcn_bw_floor2(a, granularity);  } @@ -114,11 +118,15 @@ static inline double dml_ceil_2(double f)  static inline double dml_ceil_ex(double x, double granularity)  { +	if (granularity == 0) +		return 0;  	return (double) dcn_bw_ceil2(x, granularity);  }  static inline double dml_floor_ex(double x, double granularity)  { +	if (granularity == 0) +		return 0;  	return (double) dcn_bw_floor2(x, granularity);  } diff --git a/drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c b/drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c index d851c081e376..8dabb1ac0b68 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/display_mode_core.c @@ -1222,6 +1222,7 @@ static dml_bool_t CalculatePrefetchSchedule(struct display_mode_lib_scratch_st *  	s->dst_y_prefetch_oto = s->Tvm_oto_lines + 2 * s->Tr0_oto_lines + s->Lsw_oto;  	s->dst_y_prefetch_equ = p->VStartup - (*p->TSetup + dml_max(p->TWait + p->TCalc, *p->Tdmdl)) / s->LineTime - (*p->DSTYAfterScaler + (dml_float_t) *p->DSTXAfterScaler / (dml_float_t)p->myPipe->HTotal); +	s->dst_y_prefetch_equ = dml_min(s->dst_y_prefetch_equ, 63.75); // limit to the reg limit of U6.2 for DST_Y_PREFETCH  #ifdef __DML_VBA_DEBUG__  	dml_print("DML::%s: HTotal = %u\n", __func__, p->myPipe->HTotal); diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c index 138b4b1e42ed..c6a5a8614679 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_translation_helper.c @@ -339,11 +339,22 @@ void dml21_apply_soc_bb_overrides(struct dml2_initialize_instance_in_out *dml_in  	// }  } +static unsigned int calc_max_hardware_v_total(const struct dc_stream_state *stream) +{ +	unsigned int max_hw_v_total = stream->ctx->dc->caps.max_v_total; + +	if (stream->ctx->dc->caps.vtotal_limited_by_fp2) { +		max_hw_v_total -= stream->timing.v_front_porch + 1; +	} + +	return max_hw_v_total; +} +  static void populate_dml21_timing_config_from_stream_state(struct dml2_timing_cfg *timing,  		struct dc_stream_state *stream,  		struct dml2_context *dml_ctx)  { -	unsigned int hblank_start, vblank_start; +	unsigned int hblank_start, vblank_start, min_hardware_refresh_in_uhz;  	timing->h_active = stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right;  	timing->v_active = stream->timing.v_addressable + stream->timing.v_border_bottom + stream->timing.v_border_top; @@ -371,11 +382,23 @@ static void populate_dml21_timing_config_from_stream_state(struct dml2_timing_cf  		- stream->timing.v_border_top - stream->timing.v_border_bottom;  	timing->drr_config.enabled = stream->ignore_msa_timing_param; -	timing->drr_config.min_refresh_uhz = stream->timing.min_refresh_in_uhz;  	timing->drr_config.drr_active_variable = stream->vrr_active_variable;  	timing->drr_config.drr_active_fixed = stream->vrr_active_fixed;  	timing->drr_config.disallowed = !stream->allow_freesync; +	/* limit min refresh rate to DC cap */ +	min_hardware_refresh_in_uhz = stream->timing.min_refresh_in_uhz; +	if (stream->ctx->dc->caps.max_v_total != 0) { +		min_hardware_refresh_in_uhz = div64_u64((stream->timing.pix_clk_100hz * 100000000ULL), +				(stream->timing.h_total * (long long)calc_max_hardware_v_total(stream))); +	} + +	if (stream->timing.min_refresh_in_uhz > min_hardware_refresh_in_uhz) { +		timing->drr_config.min_refresh_uhz = stream->timing.min_refresh_in_uhz; +	} else { +		timing->drr_config.min_refresh_uhz = min_hardware_refresh_in_uhz; +	} +  	if (dml_ctx->config.callbacks.get_max_flickerless_instant_vtotal_increase &&  			stream->ctx->dc->config.enable_fpo_flicker_detection == 1)  		timing->drr_config.max_instant_vtotal_delta = dml_ctx->config.callbacks.get_max_flickerless_instant_vtotal_increase(stream, false); @@ -422,6 +445,21 @@ static void populate_dml21_timing_config_from_stream_state(struct dml2_timing_cf  	timing->vblank_nom = timing->v_total - timing->v_active;  } +/** + * adjust_dml21_hblank_timing_config_from_pipe_ctx - Adjusts the horizontal blanking timing configuration + *                                                   based on the pipe context. + * @timing: Pointer to the dml2_timing_cfg structure to be adjusted. + * @pipe: Pointer to the pipe_ctx structure containing the horizontal blanking borrow value. + * + * This function modifies the horizontal active and blank end timings by adding and subtracting + * the horizontal blanking borrow value from the pipe context, respectively. + */ +static void adjust_dml21_hblank_timing_config_from_pipe_ctx(struct dml2_timing_cfg *timing, struct pipe_ctx *pipe) +{ +	timing->h_active += pipe->hblank_borrow; +	timing->h_blank_end -= pipe->hblank_borrow; +} +  static void populate_dml21_output_config_from_stream_state(struct dml2_link_output_cfg *output,  		struct dc_stream_state *stream, const struct pipe_ctx *pipe)  { @@ -709,6 +747,7 @@ static const struct scaler_data *get_scaler_data_for_plane(  			temp_pipe->plane_state = pipe->plane_state;  			temp_pipe->plane_res.scl_data.taps = pipe->plane_res.scl_data.taps;  			temp_pipe->stream_res = pipe->stream_res; +			temp_pipe->hblank_borrow = pipe->hblank_borrow;  			dml_ctx->config.callbacks.build_scaling_params(temp_pipe);  			break;  		} @@ -973,6 +1012,7 @@ bool dml21_map_dc_state_into_dml_display_cfg(const struct dc *in_dc, struct dc_s  		ASSERT(disp_cfg_stream_location >= 0 && disp_cfg_stream_location <= __DML2_WRAPPER_MAX_STREAMS_PLANES__);  		populate_dml21_timing_config_from_stream_state(&dml_dispcfg->stream_descriptors[disp_cfg_stream_location].timing, context->streams[stream_index], dml_ctx); +		adjust_dml21_hblank_timing_config_from_pipe_ctx(&dml_dispcfg->stream_descriptors[disp_cfg_stream_location].timing, &context->res_ctx.pipe_ctx[stream_index]);  		populate_dml21_output_config_from_stream_state(&dml_dispcfg->stream_descriptors[disp_cfg_stream_location].output, context->streams[stream_index], &context->res_ctx.pipe_ctx[stream_index]);  		populate_dml21_stream_overrides_from_stream_state(&dml_dispcfg->stream_descriptors[disp_cfg_stream_location], context->streams[stream_index]); @@ -1111,12 +1151,12 @@ void dml21_populate_pipe_ctx_dlg_params(struct dml2_context *dml_ctx, struct dc_  	struct dc_crtc_timing *timing = &pipe_ctx->stream->timing;  	union dml2_global_sync_programming *global_sync = &stream_programming->global_sync; -	hactive = timing->h_addressable + timing->h_border_left + timing->h_border_right; +	hactive = timing->h_addressable + timing->h_border_left + timing->h_border_right + pipe_ctx->hblank_borrow;  	vactive = timing->v_addressable + timing->v_border_bottom + timing->v_border_top;  	hblank_start = pipe_ctx->stream->timing.h_total - pipe_ctx->stream->timing.h_front_porch;  	vblank_start = pipe_ctx->stream->timing.v_total - pipe_ctx->stream->timing.v_front_porch; -	hblank_end = hblank_start - timing->h_addressable - timing->h_border_left - timing->h_border_right; +	hblank_end = hblank_start - timing->h_addressable - timing->h_border_left - timing->h_border_right - pipe_ctx->hblank_borrow;  	vblank_end = vblank_start - timing->v_addressable - timing->v_border_top - timing->v_border_bottom;  	if (dml_ctx->config.svp_pstate.callbacks.get_pipe_subvp_type(context, pipe_ctx) == SUBVP_PHANTOM) { diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c index 601320b1be81..ecfa3c898e09 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.c @@ -579,8 +579,8 @@ static void CalculateBytePerPixelAndBlockSizes(  {  	*BytePerPixelDETY = 0;  	*BytePerPixelDETC = 0; -	*BytePerPixelY = 0; -	*BytePerPixelC = 0; +	*BytePerPixelY = 1; +	*BytePerPixelC = 1;  	if (SourcePixelFormat == dml2_444_64) {  		*BytePerPixelDETY = 8; diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c b/drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c index 3d29169dd6bb..6b3b8803e0ae 100644 --- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_mall_phantom.c @@ -813,7 +813,7 @@ static bool remove_all_phantom_planes_for_stream(struct dml2_context *ctx, struc  {  	int i, old_plane_count;  	struct dc_stream_status *stream_status = NULL; -	struct dc_plane_state *del_planes[MAX_SURFACE_NUM] = { 0 }; +	struct dc_plane_state *del_planes[MAX_SURFACES] = { 0 };  	for (i = 0; i < context->stream_count; i++)  			if (context->streams[i] == stream) { diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c index d7f8b2dcaa6b..d9136d252ee1 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c @@ -1049,7 +1049,8 @@ void dcn32_update_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)  		}  		/* Enable DSC hw block */ -		dsc_cfg.pic_width = (stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right) / opp_cnt; +		dsc_cfg.pic_width = (stream->timing.h_addressable + pipe_ctx->hblank_borrow + +				stream->timing.h_border_left + stream->timing.h_border_right) / opp_cnt;  		dsc_cfg.pic_height = stream->timing.v_addressable + stream->timing.v_border_top + stream->timing.v_border_bottom;  		dsc_cfg.pixel_encoding = stream->timing.pixel_encoding;  		dsc_cfg.color_depth = stream->timing.display_color_depth; @@ -1397,12 +1398,12 @@ void dcn32_disable_link_output(struct dc_link *link,  	link_hwss->disable_link_output(link, link_res, signal);  	link->phy_state.symclk_state = SYMCLK_OFF_TX_OFF; - -	if (signal == SIGNAL_TYPE_EDP && -			link->dc->hwss.edp_power_control && -			!link->skip_implict_edp_power_control) -		link->dc->hwss.edp_power_control(link, false); -	else if (dmcu != NULL && dmcu->funcs->unlock_phy) +	/* +	 * Add the logic to extract BOTH power up and power down sequences +	 * from enable/disable link output and only call edp panel control +	 * in enable_link_dp and disable_link_dp once. +	 */ +	if (dmcu != NULL && dmcu->funcs->unlock_phy)  		dmcu->funcs->unlock_phy(dmcu);  	dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_DISABLE_LINK_PHY); diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c index 5de11e2837c0..307782592789 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c @@ -820,6 +820,7 @@ enum dc_status dcn401_enable_stream_timing(  	int opp_cnt = 1;  	int opp_inst[MAX_PIPES] = {0};  	struct pipe_ctx *opp_heads[MAX_PIPES] = {0}; +	struct dc_crtc_timing patched_crtc_timing = stream->timing;  	bool manual_mode;  	unsigned int tmds_div = PIXEL_RATE_DIV_NA;  	unsigned int unused_div = PIXEL_RATE_DIV_NA; @@ -874,9 +875,13 @@ enum dc_status dcn401_enable_stream_timing(  	if (dc->hwseq->funcs.PLAT_58856_wa && (!dc_is_dp_signal(stream->signal)))  		dc->hwseq->funcs.PLAT_58856_wa(context, pipe_ctx); +	/* if we are borrowing from hblank, h_addressable needs to be adjusted */ +	if (dc->debug.enable_hblank_borrow) +		patched_crtc_timing.h_addressable = patched_crtc_timing.h_addressable + pipe_ctx->hblank_borrow; +  	pipe_ctx->stream_res.tg->funcs->program_timing(  			pipe_ctx->stream_res.tg, -			&stream->timing, +			&patched_crtc_timing,  			pipe_ctx->pipe_dlg_param.vready_offset,  			pipe_ctx->pipe_dlg_param.vstartup_start,  			pipe_ctx->pipe_dlg_param.vupdate_offset, diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h index 8597e866bfe6..2edd5b38ce4f 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h +++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h @@ -219,6 +219,7 @@ struct resource_funcs {  	 * Get indicator of power from a context that went through full validation  	 */  	int (*get_power_profile)(const struct dc_state *context); +	unsigned int (*get_det_buffer_size)(const struct dc_state *context);  };  struct audio_support{ @@ -477,6 +478,8 @@ struct pipe_ctx {  	/* subvp_index: only valid if the pipe is a SUBVP_MAIN*/  	uint8_t subvp_index;  	struct pixel_rate_divider pixel_rate_divider; +	/* pixels borrowed from hblank to hactive */ +	uint8_t hblank_borrow;  };  /* Data used for dynamic link encoder assignment. diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c index 41cab9ad6885..5d66bfc7fe6e 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c @@ -808,7 +808,8 @@ void link_set_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)  		enum optc_dsc_mode optc_dsc_mode;  		/* Enable DSC hw block */ -		dsc_cfg.pic_width = (stream->timing.h_addressable + stream->timing.h_border_left + stream->timing.h_border_right) / opp_cnt; +		dsc_cfg.pic_width = (stream->timing.h_addressable + pipe_ctx->hblank_borrow + +				stream->timing.h_border_left + stream->timing.h_border_right) / opp_cnt;  		dsc_cfg.pic_height = stream->timing.v_addressable + stream->timing.v_border_top + stream->timing.v_border_bottom;  		dsc_cfg.pixel_encoding = stream->timing.pixel_encoding;  		dsc_cfg.color_depth = stream->timing.display_color_depth; diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c index 189d0c85872e..7a5b9aa5292c 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn20/dcn20_resource.c @@ -1510,6 +1510,7 @@ bool dcn20_split_stream_for_odm(  	if (prev_odm_pipe->plane_state) {  		struct scaler_data *sd = &prev_odm_pipe->plane_res.scl_data; +		struct output_pixel_processor *opp = next_odm_pipe->stream_res.opp;  		int new_width;  		/* HACTIVE halved for odm combine */ @@ -1543,7 +1544,28 @@ bool dcn20_split_stream_for_odm(  		sd->viewport_c.x += dc_fixpt_floor(dc_fixpt_mul_int(  				sd->ratios.horz_c, sd->h_active - sd->recout.x));  		sd->recout.x = 0; + +		/* +		 * When odm is used in YcbCr422 or 420 colour space, a split screen +		 * will be seen with the previous calculations since the extra left +		 *  edge pixel is accounted for in fmt but not in viewport. +		 * +		 * Below are calculations which fix the split by fixing the calculations +		 * if there is an extra left edge pixel. +		 */ +		if (opp && opp->funcs->opp_get_left_edge_extra_pixel_count +				&& opp->funcs->opp_get_left_edge_extra_pixel_count( +					opp, next_odm_pipe->stream->timing.pixel_encoding, +					resource_is_pipe_type(next_odm_pipe, OTG_MASTER)) == 1) { +			sd->h_active += 1; +			sd->recout.width += 1; +			sd->viewport.x -= dc_fixpt_ceil(dc_fixpt_mul_int(sd->ratios.horz, 1)); +			sd->viewport_c.x -= dc_fixpt_ceil(dc_fixpt_mul_int(sd->ratios.horz, 1)); +			sd->viewport_c.width += dc_fixpt_ceil(dc_fixpt_mul_int(sd->ratios.horz, 1)); +			sd->viewport.width += dc_fixpt_ceil(dc_fixpt_mul_int(sd->ratios.horz, 1)); +		}  	} +  	if (!next_odm_pipe->top_pipe)  		next_odm_pipe->stream_res.opp = pool->opps[next_odm_pipe->pipe_idx];  	else @@ -2132,6 +2154,7 @@ bool dcn20_fast_validate_bw(  			ASSERT(0);  		}  	} +  	/* Actual dsc count per stream dsc validation*/  	if (!dcn20_validate_dsc(dc, context)) {  		context->bw_ctx.dml.vba.ValidationStatus[context->bw_ctx.dml.vba.soc.num_states] = diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c index cd31e4f16c14..bfd0eccbed28 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn30/dcn30_resource.c @@ -2353,6 +2353,7 @@ static bool dcn30_resource_construct(  	dc->caps.dp_hdmi21_pcon_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* read VBIOS LTTPR caps */  	{ diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c index 02af8b8f4d27..7baefc910a3d 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn302/dcn302_resource.c @@ -1233,6 +1233,7 @@ static bool dcn302_resource_construct(  	dc->caps.extended_aux_timeout_support = true;  	dc->caps.dmcub_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* Color pipeline capabilities */  	dc->caps.color.dpp.dcn_arch = 1; diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c index 7002a8dd358a..8a57d46ad15f 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn303/dcn303_resource.c @@ -1178,6 +1178,7 @@ static bool dcn303_resource_construct(  	dc->caps.extended_aux_timeout_support = true;  	dc->caps.dmcub_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* Color pipeline capabilities */  	dc->caps.color.dpp.dcn_arch = 1; diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c index c16cf1c8f7f9..54ec3d8e920c 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.c @@ -1720,6 +1720,12 @@ int dcn31_populate_dml_pipes_from_context(  	return pipe_cnt;  } +unsigned int dcn31_get_det_buffer_size( +	const struct dc_state *context) +{ +	return context->bw_ctx.dml.ip.det_buffer_size_kbytes; +} +  void dcn31_calculate_wm_and_dlg(  		struct dc *dc, struct dc_state *context,  		display_e2e_pipe_params_st *pipes, @@ -1842,6 +1848,7 @@ static struct resource_funcs dcn31_res_pool_funcs = {  	.update_bw_bounding_box = dcn31_update_bw_bounding_box,  	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,  	.get_panel_config_defaults = dcn31_get_panel_config_defaults, +	.get_det_buffer_size = dcn31_get_det_buffer_size,  };  static struct clock_source *dcn30_clock_source_create( diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h index 901436591ed4..551ad912f7be 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn31/dcn31_resource.h @@ -63,6 +63,9 @@ struct resource_pool *dcn31_create_resource_pool(  		const struct dc_init_data *init_data,  		struct dc *dc); +unsigned int dcn31_get_det_buffer_size( +	const struct dc_state *context); +  /*temp: B0 specific before switch to dcn313 headers*/  #ifndef regPHYPLLF_PIXCLK_RESYNC_CNTL  #define regPHYPLLF_PIXCLK_RESYNC_CNTL 0x007e diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c index c0f48c78e968..2794473f2aff 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c @@ -1777,6 +1777,7 @@ static struct resource_funcs dcn314_res_pool_funcs = {  	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,  	.get_panel_config_defaults = dcn314_get_panel_config_defaults,  	.get_preferred_eng_id_dpia = dcn314_get_preferred_eng_id_dpia, +	.get_det_buffer_size = dcn31_get_det_buffer_size,  };  static struct clock_source *dcn30_clock_source_create( diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c index 6c3295259a81..4ee33eb3381d 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn315/dcn315_resource.c @@ -1845,6 +1845,7 @@ static struct resource_funcs dcn315_res_pool_funcs = {  	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,  	.get_panel_config_defaults = dcn315_get_panel_config_defaults,  	.get_power_profile = dcn315_get_power_profile, +	.get_det_buffer_size = dcn31_get_det_buffer_size,  };  static bool dcn315_resource_construct( diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c index 6edaaadcb173..79eddbafe3c2 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn316/dcn316_resource.c @@ -1719,6 +1719,7 @@ static struct resource_funcs dcn316_res_pool_funcs = {  	.update_bw_bounding_box = dcn316_update_bw_bounding_box,  	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,  	.get_panel_config_defaults = dcn316_get_panel_config_defaults, +	.get_det_buffer_size = dcn31_get_det_buffer_size,  };  static bool dcn316_resource_construct( diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c index 01d1a11d5545..12d247a7ec45 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c @@ -2189,6 +2189,7 @@ static bool dcn32_resource_construct(  	dc->caps.dmcub_support = true;  	dc->caps.seamless_odm = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* Color pipeline capabilities */  	dc->caps.color.dpp.dcn_arch = 1; @@ -2803,6 +2804,7 @@ struct pipe_ctx *dcn32_acquire_free_pipe_as_secondary_opp_head(  		free_pipe->plane_res.xfm = pool->transforms[free_pipe_idx];  		free_pipe->plane_res.dpp = pool->dpps[free_pipe_idx];  		free_pipe->plane_res.mpcc_inst = pool->dpps[free_pipe_idx]->inst; +		free_pipe->hblank_borrow = otg_master->hblank_borrow;  		if (free_pipe->stream->timing.flags.DSC == 1) {  			dcn20_acquire_dsc(free_pipe->stream->ctx->dc,  					&new_ctx->res_ctx, diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c index 5cb74fd9cb7d..06b9479c8bd3 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn321/dcn321_resource.c @@ -1742,6 +1742,7 @@ static bool dcn321_resource_construct(  	dc->caps.extended_aux_timeout_support = true;  	dc->caps.dmcub_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* Color pipeline capabilities */  	dc->caps.color.dpp.dcn_arch = 1; diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c index 6cc2960b6104..89e2adcf2a28 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c @@ -1778,6 +1778,7 @@ static struct resource_funcs dcn35_res_pool_funcs = {  	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,  	.get_panel_config_defaults = dcn35_get_panel_config_defaults,  	.get_preferred_eng_id_dpia = dcn35_get_preferred_eng_id_dpia, +	.get_det_buffer_size = dcn31_get_det_buffer_size,  };  static bool dcn35_resource_construct( @@ -1849,6 +1850,7 @@ static bool dcn35_resource_construct(  	dc->caps.zstate_support = true;  	dc->caps.ips_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* Color pipeline capabilities */  	dc->caps.color.dpp.dcn_arch = 1; diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c index d87e2641cda1..263a37c1cd3a 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c @@ -1757,6 +1757,7 @@ static struct resource_funcs dcn351_res_pool_funcs = {  	.patch_unknown_plane_state = dcn20_patch_unknown_plane_state,  	.get_panel_config_defaults = dcn35_get_panel_config_defaults,  	.get_preferred_eng_id_dpia = dcn351_get_preferred_eng_id_dpia, +	.get_det_buffer_size = dcn31_get_det_buffer_size,  };  static bool dcn351_resource_construct( @@ -1828,6 +1829,7 @@ static bool dcn351_resource_construct(  	dc->caps.zstate_support = true;  	dc->caps.ips_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	/* Color pipeline capabilities */  	dc->caps.color.dpp.dcn_arch = 1; diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c index db93bac247c0..2a3dabfe3cea 100644 --- a/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c @@ -1864,6 +1864,7 @@ static bool dcn401_resource_construct(  	dc->caps.extended_aux_timeout_support = true;  	dc->caps.dmcub_support = true;  	dc->caps.max_v_total = (1 << 15) - 1; +	dc->caps.vtotal_limited_by_fp2 = true;  	if (ASICREV_IS_GC_12_0_1_A0(dc->ctx->asic_id.hw_internal_rev))  		dc->caps.dcc_plane_width_limit = 7680; diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index f980a84dceef..2b3964529539 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -122,6 +122,17 @@ static unsigned int calc_duration_in_us_from_v_total(  	return duration_in_us;  } +static unsigned int calc_max_hardware_v_total(const struct dc_stream_state *stream) +{ +	unsigned int max_hw_v_total = stream->ctx->dc->caps.max_v_total; + +	if (stream->ctx->dc->caps.vtotal_limited_by_fp2) { +		max_hw_v_total -= stream->timing.v_front_porch + 1; +	} + +	return max_hw_v_total; +} +  unsigned int mod_freesync_calc_v_total_from_refresh(  		const struct dc_stream_state *stream,  		unsigned int refresh_in_uhz) @@ -1016,7 +1027,7 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,  	if (stream->ctx->dc->caps.max_v_total != 0 && stream->timing.h_total != 0) {  		min_hardware_refresh_in_uhz = div64_u64((stream->timing.pix_clk_100hz * 100000000ULL), -			(stream->timing.h_total * (long long)stream->ctx->dc->caps.max_v_total)); +			(stream->timing.h_total * (long long)calc_max_hardware_v_total(stream)));  	}  	/* Limit minimum refresh rate to what can be supported by hardware */  	min_refresh_in_uhz = min_hardware_refresh_in_uhz > in_config->min_refresh_in_uhz ? diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h index 67a5de573943..d7acdd42d80f 100644 --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h @@ -164,6 +164,7 @@ enum amd_pp_task {  };  enum PP_SMC_POWER_PROFILE { +	PP_SMC_POWER_PROFILE_UNKNOWN = -1,  	PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT = 0x0,  	PP_SMC_POWER_PROFILE_FULLSCREEN3D = 0x1,  	PP_SMC_POWER_PROFILE_POWERSAVING  = 0x2, diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index 136e8193867c..e8ae7681bf0a 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -1361,7 +1361,11 @@ static ssize_t amdgpu_set_pp_mclk_od(struct device *dev,   * create a custom set of heuristics, write a string of numbers to the file   * starting with the number of the custom profile along with a setting   * for each heuristic parameter.  Due to differences across asic families - * the heuristic parameters vary from family to family. + * the heuristic parameters vary from family to family. Additionally, + * you can apply the custom heuristics to different clock domains.  Each + * clock domain is considered a distinct operation so if you modify the + * gfxclk heuristics and then the memclk heuristics, the all of the + * custom heuristics will be retained until you switch to another profile.   *   */ diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c index b8355293518f..21bd635bcdfc 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c @@ -72,6 +72,10 @@ static int smu_set_power_limit(void *handle, uint32_t limit);  static int smu_set_fan_speed_rpm(void *handle, uint32_t speed);  static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled);  static int smu_set_mp1_state(void *handle, enum pp_mp1_state mp1_state); +static void smu_power_profile_mode_get(struct smu_context *smu, +				       enum PP_SMC_POWER_PROFILE profile_mode); +static void smu_power_profile_mode_put(struct smu_context *smu, +				       enum PP_SMC_POWER_PROFILE profile_mode);  static int smu_sys_get_pp_feature_mask(void *handle,  				       char *buf) @@ -760,6 +764,7 @@ static int smu_early_init(struct amdgpu_ip_block *ip_block)  	smu->smu_baco.platform_support = false;  	smu->smu_baco.maco_support = false;  	smu->user_dpm_profile.fan_mode = -1; +	smu->power_profile_mode = PP_SMC_POWER_PROFILE_UNKNOWN;  	mutex_init(&smu->message_lock); @@ -1244,6 +1249,21 @@ static bool smu_is_workload_profile_available(struct smu_context *smu,  	return smu->workload_map && smu->workload_map[profile].valid_mapping;  } +static void smu_init_power_profile(struct smu_context *smu) +{ +	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_UNKNOWN) { +		if (smu->is_apu || +		    !smu_is_workload_profile_available( +			    smu, PP_SMC_POWER_PROFILE_FULLSCREEN3D)) +			smu->power_profile_mode = +				PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; +		else +			smu->power_profile_mode = +				PP_SMC_POWER_PROFILE_FULLSCREEN3D; +	} +	smu_power_profile_mode_get(smu, smu->power_profile_mode); +} +  static int smu_sw_init(struct amdgpu_ip_block *ip_block)  {  	struct amdgpu_device *adev = ip_block->adev; @@ -1259,42 +1279,13 @@ static int smu_sw_init(struct amdgpu_ip_block *ip_block)  	INIT_WORK(&smu->interrupt_work, smu_interrupt_work_fn);  	atomic64_set(&smu->throttle_int_counter, 0);  	smu->watermarks_bitmap = 0; -	smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; -	smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; -	smu->user_dpm_profile.user_workload_mask = 0;  	atomic_set(&smu->smu_power.power_gate.vcn_gated, 1);  	atomic_set(&smu->smu_power.power_gate.jpeg_gated, 1);  	atomic_set(&smu->smu_power.power_gate.vpe_gated, 1);  	atomic_set(&smu->smu_power.power_gate.umsch_mm_gated, 1); -	smu->workload_priority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT] = 0; -	smu->workload_priority[PP_SMC_POWER_PROFILE_FULLSCREEN3D] = 1; -	smu->workload_priority[PP_SMC_POWER_PROFILE_POWERSAVING] = 2; -	smu->workload_priority[PP_SMC_POWER_PROFILE_VIDEO] = 3; -	smu->workload_priority[PP_SMC_POWER_PROFILE_VR] = 4; -	smu->workload_priority[PP_SMC_POWER_PROFILE_COMPUTE] = 5; -	smu->workload_priority[PP_SMC_POWER_PROFILE_CUSTOM] = 6; - -	if (smu->is_apu || -	    !smu_is_workload_profile_available(smu, PP_SMC_POWER_PROFILE_FULLSCREEN3D)) { -		smu->driver_workload_mask = -			1 << smu->workload_priority[PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT]; -	} else { -		smu->driver_workload_mask = -			1 << smu->workload_priority[PP_SMC_POWER_PROFILE_FULLSCREEN3D]; -		smu->default_power_profile_mode = PP_SMC_POWER_PROFILE_FULLSCREEN3D; -	} - -	smu->workload_mask = smu->driver_workload_mask | -							smu->user_dpm_profile.user_workload_mask; -	smu->workload_setting[0] = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; -	smu->workload_setting[1] = PP_SMC_POWER_PROFILE_FULLSCREEN3D; -	smu->workload_setting[2] = PP_SMC_POWER_PROFILE_POWERSAVING; -	smu->workload_setting[3] = PP_SMC_POWER_PROFILE_VIDEO; -	smu->workload_setting[4] = PP_SMC_POWER_PROFILE_VR; -	smu->workload_setting[5] = PP_SMC_POWER_PROFILE_COMPUTE; -	smu->workload_setting[6] = PP_SMC_POWER_PROFILE_CUSTOM; +	smu_init_power_profile(smu);  	smu->display_config = &adev->pm.pm_display_cfg;  	smu->smu_dpm.dpm_level = AMD_DPM_FORCED_LEVEL_AUTO; @@ -1347,6 +1338,11 @@ static int smu_sw_fini(struct amdgpu_ip_block *ip_block)  		return ret;  	} +	if (smu->custom_profile_params) { +		kfree(smu->custom_profile_params); +		smu->custom_profile_params = NULL; +	} +  	smu_fini_microcode(smu);  	return 0; @@ -2131,6 +2127,9 @@ static int smu_suspend(struct amdgpu_ip_block *ip_block)  	if (!ret)  		adev->gfx.gfx_off_entrycount = count; +	/* clear this on suspend so it will get reprogrammed on resume */ +	smu->workload_mask = 0; +  	return 0;  } @@ -2243,25 +2242,49 @@ static int smu_enable_umd_pstate(void *handle,  }  static int smu_bump_power_profile_mode(struct smu_context *smu, -					   long *param, -					   uint32_t param_size) +				       long *custom_params, +				       u32 custom_params_max_idx)  { -	int ret = 0; +	u32 workload_mask = 0; +	int i, ret = 0; + +	for (i = 0; i < PP_SMC_POWER_PROFILE_COUNT; i++) { +		if (smu->workload_refcount[i]) +			workload_mask |= 1 << i; +	} + +	if (smu->workload_mask == workload_mask) +		return 0;  	if (smu->ppt_funcs->set_power_profile_mode) -		ret = smu->ppt_funcs->set_power_profile_mode(smu, param, param_size); +		ret = smu->ppt_funcs->set_power_profile_mode(smu, workload_mask, +							     custom_params, +							     custom_params_max_idx); + +	if (!ret) +		smu->workload_mask = workload_mask;  	return ret;  } +static void smu_power_profile_mode_get(struct smu_context *smu, +				       enum PP_SMC_POWER_PROFILE profile_mode) +{ +	smu->workload_refcount[profile_mode]++; +} + +static void smu_power_profile_mode_put(struct smu_context *smu, +				       enum PP_SMC_POWER_PROFILE profile_mode) +{ +	if (smu->workload_refcount[profile_mode]) +		smu->workload_refcount[profile_mode]--; +} +  static int smu_adjust_power_state_dynamic(struct smu_context *smu,  					  enum amd_dpm_forced_level level, -					  bool skip_display_settings, -					  bool init) +					  bool skip_display_settings)  {  	int ret = 0; -	int index = 0; -	long workload[1];  	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);  	if (!skip_display_settings) { @@ -2298,14 +2321,8 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu,  	}  	if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL && -		smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) { -		index = fls(smu->workload_mask); -		index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0; -		workload[0] = smu->workload_setting[index]; - -		if (init || smu->power_profile_mode != workload[0]) -			smu_bump_power_profile_mode(smu, workload, 0); -	} +	    smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) +		smu_bump_power_profile_mode(smu, NULL, 0);  	return ret;  } @@ -2324,13 +2341,13 @@ static int smu_handle_task(struct smu_context *smu,  		ret = smu_pre_display_config_changed(smu);  		if (ret)  			return ret; -		ret = smu_adjust_power_state_dynamic(smu, level, false, false); +		ret = smu_adjust_power_state_dynamic(smu, level, false);  		break;  	case AMD_PP_TASK_COMPLETE_INIT: -		ret = smu_adjust_power_state_dynamic(smu, level, true, true); +		ret = smu_adjust_power_state_dynamic(smu, level, true);  		break;  	case AMD_PP_TASK_READJUST_POWER_STATE: -		ret = smu_adjust_power_state_dynamic(smu, level, true, false); +		ret = smu_adjust_power_state_dynamic(smu, level, true);  		break;  	default:  		break; @@ -2352,12 +2369,11 @@ static int smu_handle_dpm_task(void *handle,  static int smu_switch_power_profile(void *handle,  				    enum PP_SMC_POWER_PROFILE type, -				    bool en) +				    bool enable)  {  	struct smu_context *smu = handle;  	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); -	long workload[1]; -	uint32_t index; +	int ret;  	if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)  		return -EOPNOTSUPP; @@ -2365,24 +2381,21 @@ static int smu_switch_power_profile(void *handle,  	if (!(type < PP_SMC_POWER_PROFILE_CUSTOM))  		return -EINVAL; -	if (!en) { -		smu->driver_workload_mask &= ~(1 << smu->workload_priority[type]); -		index = fls(smu->workload_mask); -		index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0; -		workload[0] = smu->workload_setting[index]; -	} else { -		smu->driver_workload_mask |= (1 << smu->workload_priority[type]); -		index = fls(smu->workload_mask); -		index = index <= WORKLOAD_POLICY_MAX ? index - 1 : 0; -		workload[0] = smu->workload_setting[index]; -	} - -	smu->workload_mask = smu->driver_workload_mask | -						 smu->user_dpm_profile.user_workload_mask; -  	if (smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL && -		smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) -		smu_bump_power_profile_mode(smu, workload, 0); +	    smu_dpm_ctx->dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM) { +		if (enable) +			smu_power_profile_mode_get(smu, type); +		else +			smu_power_profile_mode_put(smu, type); +		ret = smu_bump_power_profile_mode(smu, NULL, 0); +		if (ret) { +			if (enable) +				smu_power_profile_mode_put(smu, type); +			else +				smu_power_profile_mode_get(smu, type); +			return ret; +		} +	}  	return 0;  } @@ -3074,21 +3087,33 @@ static int smu_set_power_profile_mode(void *handle,  				      uint32_t param_size)  {  	struct smu_context *smu = handle; -	int ret; +	bool custom = false; +	int ret = 0;  	if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled ||  	    !smu->ppt_funcs->set_power_profile_mode)  		return -EOPNOTSUPP; -	if (smu->user_dpm_profile.user_workload_mask & -	   (1 << smu->workload_priority[param[param_size]])) -	   return 0; +	if (param[param_size] == PP_SMC_POWER_PROFILE_CUSTOM) { +		custom = true; +		/* clear frontend mask so custom changes propogate */ +		smu->workload_mask = 0; +	} -	smu->user_dpm_profile.user_workload_mask = -		(1 << smu->workload_priority[param[param_size]]); -	smu->workload_mask = smu->user_dpm_profile.user_workload_mask | -		smu->driver_workload_mask; -	ret = smu_bump_power_profile_mode(smu, param, param_size); +	if ((param[param_size] != smu->power_profile_mode) || custom) { +		/* clear the old user preference */ +		smu_power_profile_mode_put(smu, smu->power_profile_mode); +		/* set the new user preference */ +		smu_power_profile_mode_get(smu, param[param_size]); +		ret = smu_bump_power_profile_mode(smu, +						  custom ? param : NULL, +						  custom ? param_size : 0); +		if (ret) +			smu_power_profile_mode_put(smu, param[param_size]); +		else +			/* store the user's preference */ +			smu->power_profile_mode = param[param_size]; +	}  	return ret;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h index d665c47f19b7..3925815358ce 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h @@ -240,7 +240,6 @@ struct smu_user_dpm_profile {  	/* user clock state information */  	uint32_t clk_mask[SMU_CLK_COUNT];  	uint32_t clk_dependency; -	uint32_t user_workload_mask;  };  #define SMU_TABLE_INIT(tables, table_id, s, a, d)	\ @@ -557,12 +556,13 @@ struct smu_context {  	uint32_t hard_min_uclk_req_from_dal;  	bool disable_uclk_switch; +	/* asic agnostic workload mask */  	uint32_t workload_mask; -	uint32_t driver_workload_mask; -	uint32_t workload_priority[WORKLOAD_POLICY_MAX]; -	uint32_t workload_setting[WORKLOAD_POLICY_MAX]; +	/* default/user workload preference */  	uint32_t power_profile_mode; -	uint32_t default_power_profile_mode; +	uint32_t workload_refcount[PP_SMC_POWER_PROFILE_COUNT]; +	/* backend specific custom workload settings */ +	long *custom_profile_params;  	bool pm_enabled;  	bool is_apu; @@ -733,9 +733,12 @@ struct pptable_funcs {  	 * @set_power_profile_mode: Set a power profile mode. Also used to  	 *                          create/set custom power profile modes.  	 * &input: Power profile mode parameters. -	 * &size: Size of &input. +	 * &workload_mask: mask of workloads to enable +	 * &custom_params: custom profile parameters +	 * &custom_params_max_idx: max valid idx into custom_params  	 */ -	int (*set_power_profile_mode)(struct smu_context *smu, long *input, uint32_t size); +	int (*set_power_profile_mode)(struct smu_context *smu, u32 workload_mask, +				      long *custom_params, u32 custom_params_max_idx);  	/**  	 * @dpm_set_vcn_enable: Enable/disable VCN engine dynamic power diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h index ae3563d71fa0..356d9422b411 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h @@ -303,5 +303,7 @@ int smu_v13_0_set_wbrf_exclusion_ranges(struct smu_context *smu,  int smu_v13_0_get_boot_freq_by_index(struct smu_context *smu,  				     enum smu_clk_type clk_type,  				     uint32_t *value); + +void smu_v13_0_interrupt_work(struct smu_context *smu);  #endif  #endif diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c index 12125303bb79..8aa61a9f7778 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c @@ -1445,97 +1445,120 @@ static int arcturus_get_power_profile_mode(struct smu_context *smu,  	return size;  } -static int arcturus_set_power_profile_mode(struct smu_context *smu, -					   long *input, -					   uint32_t size) +#define ARCTURUS_CUSTOM_PARAMS_COUNT 10 +#define ARCTURUS_CUSTOM_PARAMS_CLOCK_COUNT 2 +#define ARCTURUS_CUSTOM_PARAMS_SIZE (ARCTURUS_CUSTOM_PARAMS_CLOCK_COUNT * ARCTURUS_CUSTOM_PARAMS_COUNT * sizeof(long)) + +static int arcturus_set_power_profile_mode_coeff(struct smu_context *smu, +						 long *input)  {  	DpmActivityMonitorCoeffInt_t activity_monitor; -	int workload_type = 0; -	uint32_t profile_mode = input[size]; -	int ret = 0; +	int ret, idx; -	if (profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", profile_mode); -		return -EINVAL; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +				   WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor), +				   false); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +		return ret;  	} -	if ((profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) && -	     (smu->smc_fw_version >= 0x360d00)) { -		if (size != 10) -			return -EINVAL; +	idx = 0 * ARCTURUS_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Gfxclk */ +		activity_monitor.Gfx_FPS = input[idx + 1]; +		activity_monitor.Gfx_UseRlcBusy = input[idx + 2]; +		activity_monitor.Gfx_MinActiveFreqType = input[idx + 3]; +		activity_monitor.Gfx_MinActiveFreq = input[idx + 4]; +		activity_monitor.Gfx_BoosterFreqType = input[idx + 5]; +		activity_monitor.Gfx_BoosterFreq = input[idx + 6]; +		activity_monitor.Gfx_PD_Data_limit_c = input[idx + 7]; +		activity_monitor.Gfx_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor.Gfx_PD_Data_error_rate_coeff = input[idx + 9]; +	} +	idx = 1 * ARCTURUS_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Uclk */ +		activity_monitor.Mem_FPS = input[idx + 1]; +		activity_monitor.Mem_UseRlcBusy = input[idx + 2]; +		activity_monitor.Mem_MinActiveFreqType = input[idx + 3]; +		activity_monitor.Mem_MinActiveFreq = input[idx + 4]; +		activity_monitor.Mem_BoosterFreqType = input[idx + 5]; +		activity_monitor.Mem_BoosterFreq = input[idx + 6]; +		activity_monitor.Mem_PD_Data_limit_c = input[idx + 7]; +		activity_monitor.Mem_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor.Mem_PD_Data_error_rate_coeff = input[idx + 9]; +	} -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, -				       WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor), -				       false); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); -			return ret; -		} +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +				   WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor), +				   true); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +		return ret; +	} -		switch (input[0]) { -		case 0: /* Gfxclk */ -			activity_monitor.Gfx_FPS = input[1]; -			activity_monitor.Gfx_UseRlcBusy = input[2]; -			activity_monitor.Gfx_MinActiveFreqType = input[3]; -			activity_monitor.Gfx_MinActiveFreq = input[4]; -			activity_monitor.Gfx_BoosterFreqType = input[5]; -			activity_monitor.Gfx_BoosterFreq = input[6]; -			activity_monitor.Gfx_PD_Data_limit_c = input[7]; -			activity_monitor.Gfx_PD_Data_error_coeff = input[8]; -			activity_monitor.Gfx_PD_Data_error_rate_coeff = input[9]; -			break; -		case 1: /* Uclk */ -			activity_monitor.Mem_FPS = input[1]; -			activity_monitor.Mem_UseRlcBusy = input[2]; -			activity_monitor.Mem_MinActiveFreqType = input[3]; -			activity_monitor.Mem_MinActiveFreq = input[4]; -			activity_monitor.Mem_BoosterFreqType = input[5]; -			activity_monitor.Mem_BoosterFreq = input[6]; -			activity_monitor.Mem_PD_Data_limit_c = input[7]; -			activity_monitor.Mem_PD_Data_error_coeff = input[8]; -			activity_monitor.Mem_PD_Data_error_rate_coeff = input[9]; -			break; -		default: +	return ret; +} + +static int arcturus_set_power_profile_mode(struct smu_context *smu, +					   u32 workload_mask, +					   long *custom_params, +					   u32 custom_params_max_idx) +{ +	u32 backend_workload_mask = 0; +	int ret, idx = -1, i; + +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask); + +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_CUSTOM)) { +		if (smu->smc_fw_version < 0x360d00)  			return -EINVAL; +		if (!smu->custom_profile_params) { +			smu->custom_profile_params = +				kzalloc(ARCTURUS_CUSTOM_PARAMS_SIZE, GFP_KERNEL); +			if (!smu->custom_profile_params) +				return -ENOMEM;  		} - -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, -				       WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor), -				       true); +		if (custom_params && custom_params_max_idx) { +			if (custom_params_max_idx != ARCTURUS_CUSTOM_PARAMS_COUNT) +				return -EINVAL; +			if (custom_params[0] >= ARCTURUS_CUSTOM_PARAMS_CLOCK_COUNT) +				return -EINVAL; +			idx = custom_params[0] * ARCTURUS_CUSTOM_PARAMS_COUNT; +			smu->custom_profile_params[idx] = 1; +			for (i = 1; i < custom_params_max_idx; i++) +				smu->custom_profile_params[idx + i] = custom_params[i]; +		} +		ret = arcturus_set_power_profile_mode_coeff(smu, +							    smu->custom_profile_params);  		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +			if (idx != -1) +				smu->custom_profile_params[idx] = 0;  			return ret;  		} -	} - -	/* -	 * Conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT -	 * Not all profile modes are supported on arcturus. -	 */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       profile_mode); -	if (workload_type < 0) { -		dev_dbg(smu->adev->dev, "Unsupported power profile mode %d on arcturus\n", profile_mode); -		return -EINVAL; +	} else if (smu->custom_profile_params) { +		memset(smu->custom_profile_params, 0, ARCTURUS_CUSTOM_PARAMS_SIZE);  	}  	ret = smu_cmn_send_smc_msg_with_param(smu, -					  SMU_MSG_SetWorkloadMask, -					  smu->workload_mask, -					  NULL); +					      SMU_MSG_SetWorkloadMask, +					      backend_workload_mask, +					      NULL);  	if (ret) { -		dev_err(smu->adev->dev, "Fail to set workload type %d\n", workload_type); +		dev_err(smu->adev->dev, "Failed to set workload mask 0x%08x\n", +			workload_mask); +		if (idx != -1) +			smu->custom_profile_params[idx] = 0;  		return ret;  	} -	smu_cmn_assign_power_profile(smu); - -	return 0; +	return ret;  }  static int arcturus_set_performance_level(struct smu_context *smu, diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c index 211635dabed8..7fad5dfb39c4 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c @@ -2006,90 +2006,122 @@ static int navi10_get_power_profile_mode(struct smu_context *smu, char *buf)  	return size;  } -static int navi10_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size) +#define NAVI10_CUSTOM_PARAMS_COUNT 10 +#define NAVI10_CUSTOM_PARAMS_CLOCKS_COUNT 3 +#define NAVI10_CUSTOM_PARAMS_SIZE (NAVI10_CUSTOM_PARAMS_CLOCKS_COUNT * NAVI10_CUSTOM_PARAMS_COUNT * sizeof(long)) + +static int navi10_set_power_profile_mode_coeff(struct smu_context *smu, +					       long *input)  {  	DpmActivityMonitorCoeffInt_t activity_monitor; -	int workload_type, ret = 0; +	int ret, idx; -	smu->power_profile_mode = input[size]; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor), false); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +		return ret; +	} -	if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", smu->power_profile_mode); -		return -EINVAL; +	idx = 0 * NAVI10_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Gfxclk */ +		activity_monitor.Gfx_FPS = input[idx + 1]; +		activity_monitor.Gfx_MinFreqStep = input[idx + 2]; +		activity_monitor.Gfx_MinActiveFreqType = input[idx + 3]; +		activity_monitor.Gfx_MinActiveFreq = input[idx + 4]; +		activity_monitor.Gfx_BoosterFreqType = input[idx + 5]; +		activity_monitor.Gfx_BoosterFreq = input[idx + 6]; +		activity_monitor.Gfx_PD_Data_limit_c = input[idx + 7]; +		activity_monitor.Gfx_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor.Gfx_PD_Data_error_rate_coeff = input[idx + 9]; +	} +	idx = 1 * NAVI10_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Socclk */ +		activity_monitor.Soc_FPS = input[idx + 1]; +		activity_monitor.Soc_MinFreqStep = input[idx + 2]; +		activity_monitor.Soc_MinActiveFreqType = input[idx + 3]; +		activity_monitor.Soc_MinActiveFreq = input[idx + 4]; +		activity_monitor.Soc_BoosterFreqType = input[idx + 5]; +		activity_monitor.Soc_BoosterFreq = input[idx + 6]; +		activity_monitor.Soc_PD_Data_limit_c = input[idx + 7]; +		activity_monitor.Soc_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor.Soc_PD_Data_error_rate_coeff = input[idx + 9]; +	} +	idx = 2 * NAVI10_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Memclk */ +		activity_monitor.Mem_FPS = input[idx + 1]; +		activity_monitor.Mem_MinFreqStep = input[idx + 2]; +		activity_monitor.Mem_MinActiveFreqType = input[idx + 3]; +		activity_monitor.Mem_MinActiveFreq = input[idx + 4]; +		activity_monitor.Mem_BoosterFreqType = input[idx + 5]; +		activity_monitor.Mem_BoosterFreq = input[idx + 6]; +		activity_monitor.Mem_PD_Data_limit_c = input[idx + 7]; +		activity_monitor.Mem_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor.Mem_PD_Data_error_rate_coeff = input[idx + 9]; +	} + +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor), true); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +		return ret;  	} -	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { -		if (size != 10) -			return -EINVAL; +	return ret; +} -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor), false); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); -			return ret; -		} +static int navi10_set_power_profile_mode(struct smu_context *smu, +					 u32 workload_mask, +					 long *custom_params, +					 u32 custom_params_max_idx) +{ +	u32 backend_workload_mask = 0; +	int ret, idx = -1, i; -		switch (input[0]) { -		case 0: /* Gfxclk */ -			activity_monitor.Gfx_FPS = input[1]; -			activity_monitor.Gfx_MinFreqStep = input[2]; -			activity_monitor.Gfx_MinActiveFreqType = input[3]; -			activity_monitor.Gfx_MinActiveFreq = input[4]; -			activity_monitor.Gfx_BoosterFreqType = input[5]; -			activity_monitor.Gfx_BoosterFreq = input[6]; -			activity_monitor.Gfx_PD_Data_limit_c = input[7]; -			activity_monitor.Gfx_PD_Data_error_coeff = input[8]; -			activity_monitor.Gfx_PD_Data_error_rate_coeff = input[9]; -			break; -		case 1: /* Socclk */ -			activity_monitor.Soc_FPS = input[1]; -			activity_monitor.Soc_MinFreqStep = input[2]; -			activity_monitor.Soc_MinActiveFreqType = input[3]; -			activity_monitor.Soc_MinActiveFreq = input[4]; -			activity_monitor.Soc_BoosterFreqType = input[5]; -			activity_monitor.Soc_BoosterFreq = input[6]; -			activity_monitor.Soc_PD_Data_limit_c = input[7]; -			activity_monitor.Soc_PD_Data_error_coeff = input[8]; -			activity_monitor.Soc_PD_Data_error_rate_coeff = input[9]; -			break; -		case 2: /* Memclk */ -			activity_monitor.Mem_FPS = input[1]; -			activity_monitor.Mem_MinFreqStep = input[2]; -			activity_monitor.Mem_MinActiveFreqType = input[3]; -			activity_monitor.Mem_MinActiveFreq = input[4]; -			activity_monitor.Mem_BoosterFreqType = input[5]; -			activity_monitor.Mem_BoosterFreq = input[6]; -			activity_monitor.Mem_PD_Data_limit_c = input[7]; -			activity_monitor.Mem_PD_Data_error_coeff = input[8]; -			activity_monitor.Mem_PD_Data_error_rate_coeff = input[9]; -			break; -		default: -			return -EINVAL; -		} +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask); -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor), true); +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_CUSTOM)) { +		if (!smu->custom_profile_params) { +			smu->custom_profile_params = kzalloc(NAVI10_CUSTOM_PARAMS_SIZE, GFP_KERNEL); +			if (!smu->custom_profile_params) +				return -ENOMEM; +		} +		if (custom_params && custom_params_max_idx) { +			if (custom_params_max_idx != NAVI10_CUSTOM_PARAMS_COUNT) +				return -EINVAL; +			if (custom_params[0] >= NAVI10_CUSTOM_PARAMS_CLOCKS_COUNT) +				return -EINVAL; +			idx = custom_params[0] * NAVI10_CUSTOM_PARAMS_COUNT; +			smu->custom_profile_params[idx] = 1; +			for (i = 1; i < custom_params_max_idx; i++) +				smu->custom_profile_params[idx + i] = custom_params[i]; +		} +		ret = navi10_set_power_profile_mode_coeff(smu, +							  smu->custom_profile_params);  		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +			if (idx != -1) +				smu->custom_profile_params[idx] = 0;  			return ret;  		} +	} else if (smu->custom_profile_params) { +		memset(smu->custom_profile_params, 0, NAVI10_CUSTOM_PARAMS_SIZE);  	} -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       smu->power_profile_mode); -	if (workload_type < 0) -		return -EINVAL; -  	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask, -				    smu->workload_mask, NULL); -	if (ret) -		dev_err(smu->adev->dev, "[%s] Failed to set work load mask!", __func__); -	else -		smu_cmn_assign_power_profile(smu); +					      backend_workload_mask, NULL); +	if (ret) { +		dev_err(smu->adev->dev, "Failed to set workload mask 0x%08x\n", +			workload_mask); +		if (idx != -1) +			smu->custom_profile_params[idx] = 0; +		return ret; +	}  	return ret;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c index d0ed0d060a8a..286777ada1df 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c @@ -1708,93 +1708,126 @@ static int sienna_cichlid_get_power_profile_mode(struct smu_context *smu, char *  	return size;  } -static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size) +#define SIENNA_CICHLID_CUSTOM_PARAMS_COUNT 10 +#define SIENNA_CICHLID_CUSTOM_PARAMS_CLOCK_COUNT 3 +#define SIENNA_CICHLID_CUSTOM_PARAMS_SIZE (SIENNA_CICHLID_CUSTOM_PARAMS_CLOCK_COUNT * SIENNA_CICHLID_CUSTOM_PARAMS_COUNT * sizeof(long)) + +static int sienna_cichlid_set_power_profile_mode_coeff(struct smu_context *smu, +						       long *input)  {  	DpmActivityMonitorCoeffIntExternal_t activity_monitor_external;  	DpmActivityMonitorCoeffInt_t *activity_monitor =  		&(activity_monitor_external.DpmActivityMonitorCoeffInt); -	int workload_type, ret = 0; +	int ret, idx; -	smu->power_profile_mode = input[size]; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), false); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +		return ret; +	} -	if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", smu->power_profile_mode); -		return -EINVAL; +	idx = 0 * SIENNA_CICHLID_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Gfxclk */ +		activity_monitor->Gfx_FPS = input[idx + 1]; +		activity_monitor->Gfx_MinFreqStep = input[idx + 2]; +		activity_monitor->Gfx_MinActiveFreqType = input[idx + 3]; +		activity_monitor->Gfx_MinActiveFreq = input[idx + 4]; +		activity_monitor->Gfx_BoosterFreqType = input[idx + 5]; +		activity_monitor->Gfx_BoosterFreq = input[idx + 6]; +		activity_monitor->Gfx_PD_Data_limit_c = input[idx + 7]; +		activity_monitor->Gfx_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor->Gfx_PD_Data_error_rate_coeff = input[idx + 9]; +	} +	idx = 1 * SIENNA_CICHLID_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Socclk */ +		activity_monitor->Fclk_FPS = input[idx + 1]; +		activity_monitor->Fclk_MinFreqStep = input[idx + 2]; +		activity_monitor->Fclk_MinActiveFreqType = input[idx + 3]; +		activity_monitor->Fclk_MinActiveFreq = input[idx + 4]; +		activity_monitor->Fclk_BoosterFreqType = input[idx + 5]; +		activity_monitor->Fclk_BoosterFreq = input[idx + 6]; +		activity_monitor->Fclk_PD_Data_limit_c = input[idx + 7]; +		activity_monitor->Fclk_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor->Fclk_PD_Data_error_rate_coeff = input[idx + 9]; +	} +	idx = 2 * SIENNA_CICHLID_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Memclk */ +		activity_monitor->Mem_FPS = input[idx + 1]; +		activity_monitor->Mem_MinFreqStep = input[idx + 2]; +		activity_monitor->Mem_MinActiveFreqType = input[idx + 3]; +		activity_monitor->Mem_MinActiveFreq = input[idx + 4]; +		activity_monitor->Mem_BoosterFreqType = input[idx + 5]; +		activity_monitor->Mem_BoosterFreq = input[idx + 6]; +		activity_monitor->Mem_PD_Data_limit_c = input[idx + 7]; +		activity_monitor->Mem_PD_Data_error_coeff = input[idx + 8]; +		activity_monitor->Mem_PD_Data_error_rate_coeff = input[idx + 9];  	} -	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { -		if (size != 10) -			return -EINVAL; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), true); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +		return ret; +	} -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor_external), false); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); -			return ret; -		} +	return ret; +} -		switch (input[0]) { -		case 0: /* Gfxclk */ -			activity_monitor->Gfx_FPS = input[1]; -			activity_monitor->Gfx_MinFreqStep = input[2]; -			activity_monitor->Gfx_MinActiveFreqType = input[3]; -			activity_monitor->Gfx_MinActiveFreq = input[4]; -			activity_monitor->Gfx_BoosterFreqType = input[5]; -			activity_monitor->Gfx_BoosterFreq = input[6]; -			activity_monitor->Gfx_PD_Data_limit_c = input[7]; -			activity_monitor->Gfx_PD_Data_error_coeff = input[8]; -			activity_monitor->Gfx_PD_Data_error_rate_coeff = input[9]; -			break; -		case 1: /* Socclk */ -			activity_monitor->Fclk_FPS = input[1]; -			activity_monitor->Fclk_MinFreqStep = input[2]; -			activity_monitor->Fclk_MinActiveFreqType = input[3]; -			activity_monitor->Fclk_MinActiveFreq = input[4]; -			activity_monitor->Fclk_BoosterFreqType = input[5]; -			activity_monitor->Fclk_BoosterFreq = input[6]; -			activity_monitor->Fclk_PD_Data_limit_c = input[7]; -			activity_monitor->Fclk_PD_Data_error_coeff = input[8]; -			activity_monitor->Fclk_PD_Data_error_rate_coeff = input[9]; -			break; -		case 2: /* Memclk */ -			activity_monitor->Mem_FPS = input[1]; -			activity_monitor->Mem_MinFreqStep = input[2]; -			activity_monitor->Mem_MinActiveFreqType = input[3]; -			activity_monitor->Mem_MinActiveFreq = input[4]; -			activity_monitor->Mem_BoosterFreqType = input[5]; -			activity_monitor->Mem_BoosterFreq = input[6]; -			activity_monitor->Mem_PD_Data_limit_c = input[7]; -			activity_monitor->Mem_PD_Data_error_coeff = input[8]; -			activity_monitor->Mem_PD_Data_error_rate_coeff = input[9]; -			break; -		default: -			return -EINVAL; -		} +static int sienna_cichlid_set_power_profile_mode(struct smu_context *smu, +						 u32 workload_mask, +						 long *custom_params, +						 u32 custom_params_max_idx) +{ +	u32 backend_workload_mask = 0; +	int ret, idx = -1, i; + +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask); -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor_external), true); +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_CUSTOM)) { +		if (!smu->custom_profile_params) { +			smu->custom_profile_params = +				kzalloc(SIENNA_CICHLID_CUSTOM_PARAMS_SIZE, GFP_KERNEL); +			if (!smu->custom_profile_params) +				return -ENOMEM; +		} +		if (custom_params && custom_params_max_idx) { +			if (custom_params_max_idx != SIENNA_CICHLID_CUSTOM_PARAMS_COUNT) +				return -EINVAL; +			if (custom_params[0] >= SIENNA_CICHLID_CUSTOM_PARAMS_CLOCK_COUNT) +				return -EINVAL; +			idx = custom_params[0] * SIENNA_CICHLID_CUSTOM_PARAMS_COUNT; +			smu->custom_profile_params[idx] = 1; +			for (i = 1; i < custom_params_max_idx; i++) +				smu->custom_profile_params[idx + i] = custom_params[i]; +		} +		ret = sienna_cichlid_set_power_profile_mode_coeff(smu, +								  smu->custom_profile_params);  		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +			if (idx != -1) +				smu->custom_profile_params[idx] = 0;  			return ret;  		} +	} else if (smu->custom_profile_params) { +		memset(smu->custom_profile_params, 0, SIENNA_CICHLID_CUSTOM_PARAMS_SIZE);  	} -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       smu->power_profile_mode); -	if (workload_type < 0) -		return -EINVAL; -  	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask, -				    smu->workload_mask, NULL); -	if (ret) -		dev_err(smu->adev->dev, "[%s] Failed to set work load mask!", __func__); -	else -		smu_cmn_assign_power_profile(smu); +					      backend_workload_mask, NULL); +	if (ret) { +		dev_err(smu->adev->dev, "Failed to set workload mask 0x%08x\n", +			workload_mask); +		if (idx != -1) +			smu->custom_profile_params[idx] = 0; +		return ret; +	}  	return ret;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c index f89c487dce72..a55ea76d7399 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c @@ -1056,42 +1056,27 @@ static int vangogh_get_power_profile_mode(struct smu_context *smu,  	return size;  } -static int vangogh_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size) +static int vangogh_set_power_profile_mode(struct smu_context *smu, +					  u32 workload_mask, +					  long *custom_params, +					  u32 custom_params_max_idx)  { -	int workload_type, ret; -	uint32_t profile_mode = input[size]; +	u32 backend_workload_mask = 0; +	int ret; -	if (profile_mode >= PP_SMC_POWER_PROFILE_COUNT) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", profile_mode); -		return -EINVAL; -	} - -	if (profile_mode == PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT || -			profile_mode == PP_SMC_POWER_PROFILE_POWERSAVING) -		return 0; - -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       profile_mode); -	if (workload_type < 0) { -		dev_dbg(smu->adev->dev, "Unsupported power profile mode %d on VANGOGH\n", -					profile_mode); -		return -EINVAL; -	} +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask);  	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ActiveProcessNotify, -				    smu->workload_mask, -				    NULL); +					      backend_workload_mask, +					      NULL);  	if (ret) { -		dev_err_once(smu->adev->dev, "Fail to set workload type %d\n", -					workload_type); +		dev_err_once(smu->adev->dev, "Fail to set workload mask 0x%08x\n", +			     workload_mask);  		return ret;  	} -	smu_cmn_assign_power_profile(smu); - -	return 0; +	return ret;  }  static int vangogh_set_soft_freq_limited_range(struct smu_context *smu, diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c index 75a9ea87f419..37d82a71a2d7 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c @@ -864,44 +864,27 @@ static int renoir_force_clk_levels(struct smu_context *smu,  	return ret;  } -static int renoir_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size) +static int renoir_set_power_profile_mode(struct smu_context *smu, +					 u32 workload_mask, +					 long *custom_params, +					 u32 custom_params_max_idx)  { -	int workload_type, ret; -	uint32_t profile_mode = input[size]; +	int ret; +	u32 backend_workload_mask = 0; -	if (profile_mode > PP_SMC_POWER_PROFILE_CUSTOM) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", profile_mode); -		return -EINVAL; -	} - -	if (profile_mode == PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT || -			profile_mode == PP_SMC_POWER_PROFILE_POWERSAVING) -		return 0; - -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       profile_mode); -	if (workload_type < 0) { -		/* -		 * TODO: If some case need switch to powersave/default power mode -		 * then can consider enter WORKLOAD_COMPUTE/WORKLOAD_CUSTOM for power saving. -		 */ -		dev_dbg(smu->adev->dev, "Unsupported power profile mode %d on RENOIR\n", profile_mode); -		return -EINVAL; -	} +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask);  	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ActiveProcessNotify, -				    smu->workload_mask, -				    NULL); +					      backend_workload_mask, +					      NULL);  	if (ret) { -		dev_err_once(smu->adev->dev, "Fail to set workload type %d\n", workload_type); +		dev_err_once(smu->adev->dev, "Failed to set workload mask 0x08%x\n", +			     workload_mask);  		return ret;  	} -	smu_cmn_assign_power_profile(smu); - -	return 0; +	return ret;  }  static int renoir_set_peak_clock_by_device(struct smu_context *smu) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c index 2bfea740dace..2d1e7ebd1bac 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c @@ -1320,11 +1320,11 @@ static int smu_v13_0_set_irq_state(struct amdgpu_device *adev,  	return 0;  } -static int smu_v13_0_ack_ac_dc_interrupt(struct smu_context *smu) +void smu_v13_0_interrupt_work(struct smu_context *smu)  { -	return smu_cmn_send_smc_msg(smu, -				    SMU_MSG_ReenableAcDcInterrupt, -				    NULL); +	smu_cmn_send_smc_msg(smu, +			     SMU_MSG_ReenableAcDcInterrupt, +			     NULL);  }  #define THM_11_0__SRCID__THM_DIG_THERM_L2H		0		/* ASIC_TEMP > CG_THERMAL_INT.DIG_THERM_INTH  */ @@ -1377,12 +1377,12 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,  			switch (ctxid) {  			case SMU_IH_INTERRUPT_CONTEXT_ID_AC:  				dev_dbg(adev->dev, "Switched to AC mode!\n"); -				smu_v13_0_ack_ac_dc_interrupt(smu); +				schedule_work(&smu->interrupt_work);  				adev->pm.ac_power = true;  				break;  			case SMU_IH_INTERRUPT_CONTEXT_ID_DC:  				dev_dbg(adev->dev, "Switched to DC mode!\n"); -				smu_v13_0_ack_ac_dc_interrupt(smu); +				schedule_work(&smu->interrupt_work);  				adev->pm.ac_power = false;  				break;  			case SMU_IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING: diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c index 80c6b1e523aa..0551a3311217 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c @@ -2571,111 +2571,129 @@ static int smu_v13_0_0_get_power_profile_mode(struct smu_context *smu,  	return size;  } -static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu, -					      long *input, -					      uint32_t size) +#define SMU_13_0_0_CUSTOM_PARAMS_COUNT 9 +#define SMU_13_0_0_CUSTOM_PARAMS_CLOCK_COUNT 2 +#define SMU_13_0_0_CUSTOM_PARAMS_SIZE (SMU_13_0_0_CUSTOM_PARAMS_CLOCK_COUNT * SMU_13_0_0_CUSTOM_PARAMS_COUNT * sizeof(long)) + +static int smu_v13_0_0_set_power_profile_mode_coeff(struct smu_context *smu, +						    long *input)  {  	DpmActivityMonitorCoeffIntExternal_t activity_monitor_external;  	DpmActivityMonitorCoeffInt_t *activity_monitor =  		&(activity_monitor_external.DpmActivityMonitorCoeffInt); -	int workload_type, ret = 0; -	u32 workload_mask; - -	smu->power_profile_mode = input[size]; +	int ret, idx; -	if (smu->power_profile_mode >= PP_SMC_POWER_PROFILE_COUNT) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", smu->power_profile_mode); -		return -EINVAL; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +				   WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), +				   false); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +		return ret;  	} -	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { -		if (size != 9) -			return -EINVAL; - -		ret = smu_cmn_update_table(smu, -					   SMU_TABLE_ACTIVITY_MONITOR_COEFF, -					   WORKLOAD_PPLIB_CUSTOM_BIT, -					   (void *)(&activity_monitor_external), -					   false); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); -			return ret; -		} - -		switch (input[0]) { -		case 0: /* Gfxclk */ -			activity_monitor->Gfx_FPS = input[1]; -			activity_monitor->Gfx_MinActiveFreqType = input[2]; -			activity_monitor->Gfx_MinActiveFreq = input[3]; -			activity_monitor->Gfx_BoosterFreqType = input[4]; -			activity_monitor->Gfx_BoosterFreq = input[5]; -			activity_monitor->Gfx_PD_Data_limit_c = input[6]; -			activity_monitor->Gfx_PD_Data_error_coeff = input[7]; -			activity_monitor->Gfx_PD_Data_error_rate_coeff = input[8]; -			break; -		case 1: /* Fclk */ -			activity_monitor->Fclk_FPS = input[1]; -			activity_monitor->Fclk_MinActiveFreqType = input[2]; -			activity_monitor->Fclk_MinActiveFreq = input[3]; -			activity_monitor->Fclk_BoosterFreqType = input[4]; -			activity_monitor->Fclk_BoosterFreq = input[5]; -			activity_monitor->Fclk_PD_Data_limit_c = input[6]; -			activity_monitor->Fclk_PD_Data_error_coeff = input[7]; -			activity_monitor->Fclk_PD_Data_error_rate_coeff = input[8]; -			break; -		default: -			return -EINVAL; -		} +	idx = 0 * SMU_13_0_0_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Gfxclk */ +		activity_monitor->Gfx_FPS = input[idx + 1]; +		activity_monitor->Gfx_MinActiveFreqType = input[idx + 2]; +		activity_monitor->Gfx_MinActiveFreq = input[idx + 3]; +		activity_monitor->Gfx_BoosterFreqType = input[idx + 4]; +		activity_monitor->Gfx_BoosterFreq = input[idx + 5]; +		activity_monitor->Gfx_PD_Data_limit_c = input[idx + 6]; +		activity_monitor->Gfx_PD_Data_error_coeff = input[idx + 7]; +		activity_monitor->Gfx_PD_Data_error_rate_coeff = input[idx + 8]; +	} +	idx = 1 * SMU_13_0_0_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Fclk */ +		activity_monitor->Fclk_FPS = input[idx + 1]; +		activity_monitor->Fclk_MinActiveFreqType = input[idx + 2]; +		activity_monitor->Fclk_MinActiveFreq = input[idx + 3]; +		activity_monitor->Fclk_BoosterFreqType = input[idx + 4]; +		activity_monitor->Fclk_BoosterFreq = input[idx + 5]; +		activity_monitor->Fclk_PD_Data_limit_c = input[idx + 6]; +		activity_monitor->Fclk_PD_Data_error_coeff = input[idx + 7]; +		activity_monitor->Fclk_PD_Data_error_rate_coeff = input[idx + 8]; +	} -		ret = smu_cmn_update_table(smu, -					   SMU_TABLE_ACTIVITY_MONITOR_COEFF, -					   WORKLOAD_PPLIB_CUSTOM_BIT, -					   (void *)(&activity_monitor_external), -					   true); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); -			return ret; -		} +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +				   WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), +				   true); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +		return ret;  	} -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       smu->power_profile_mode); +	return ret; +} -	if (workload_type < 0) -		return -EINVAL; +static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu, +					      u32 workload_mask, +					      long *custom_params, +					      u32 custom_params_max_idx) +{ +	u32 backend_workload_mask = 0; +	int workload_type, ret, idx = -1, i; -	workload_mask = 1 << workload_type; +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask);  	/* Add optimizations for SMU13.0.0/10.  Reuse the power saving profile */ -	if ((amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 0) && -	     ((smu->adev->pm.fw_version == 0x004e6601) || -	      (smu->adev->pm.fw_version >= 0x004e7300))) || -	    (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) && -	     smu->adev->pm.fw_version >= 0x00504500)) { +	if ((workload_mask & (1 << PP_SMC_POWER_PROFILE_COMPUTE)) && +	    ((amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 0) && +	      ((smu->adev->pm.fw_version == 0x004e6601) || +	       (smu->adev->pm.fw_version >= 0x004e7300))) || +	     (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 10) && +	      smu->adev->pm.fw_version >= 0x00504500))) {  		workload_type = smu_cmn_to_asic_specific_index(smu,  							       CMN2ASIC_MAPPING_WORKLOAD,  							       PP_SMC_POWER_PROFILE_POWERSAVING);  		if (workload_type >= 0) -			workload_mask |= 1 << workload_type; +			backend_workload_mask |= 1 << workload_type;  	} -	smu->workload_mask |= workload_mask; -	ret = smu_cmn_send_smc_msg_with_param(smu, -					       SMU_MSG_SetWorkloadMask, -					       smu->workload_mask, -					       NULL); -	if (!ret) { -		smu_cmn_assign_power_profile(smu); -		if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_POWERSAVING) { -			workload_type = smu_cmn_to_asic_specific_index(smu, -							       CMN2ASIC_MAPPING_WORKLOAD, -							       PP_SMC_POWER_PROFILE_FULLSCREEN3D); -			smu->power_profile_mode = smu->workload_mask & (1 << workload_type) -										? PP_SMC_POWER_PROFILE_FULLSCREEN3D -										: PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT; +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_CUSTOM)) { +		if (!smu->custom_profile_params) { +			smu->custom_profile_params = +				kzalloc(SMU_13_0_0_CUSTOM_PARAMS_SIZE, GFP_KERNEL); +			if (!smu->custom_profile_params) +				return -ENOMEM;  		} +		if (custom_params && custom_params_max_idx) { +			if (custom_params_max_idx != SMU_13_0_0_CUSTOM_PARAMS_COUNT) +				return -EINVAL; +			if (custom_params[0] >= SMU_13_0_0_CUSTOM_PARAMS_CLOCK_COUNT) +				return -EINVAL; +			idx = custom_params[0] * SMU_13_0_0_CUSTOM_PARAMS_COUNT; +			smu->custom_profile_params[idx] = 1; +			for (i = 1; i < custom_params_max_idx; i++) +				smu->custom_profile_params[idx + i] = custom_params[i]; +		} +		ret = smu_v13_0_0_set_power_profile_mode_coeff(smu, +							       smu->custom_profile_params); +		if (ret) { +			if (idx != -1) +				smu->custom_profile_params[idx] = 0; +			return ret; +		} +	} else if (smu->custom_profile_params) { +		memset(smu->custom_profile_params, 0, SMU_13_0_0_CUSTOM_PARAMS_SIZE); +	} + +	ret = smu_cmn_send_smc_msg_with_param(smu, +					      SMU_MSG_SetWorkloadMask, +					      backend_workload_mask, +					      NULL); +	if (ret) { +		dev_err(smu->adev->dev, "Failed to set workload mask 0x%08x\n", +			workload_mask); +		if (idx != -1) +			smu->custom_profile_params[idx] = 0; +		return ret;  	}  	return ret; @@ -3202,6 +3220,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {  	.is_asic_wbrf_supported = smu_v13_0_0_wbrf_support_check,  	.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,  	.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges, +	.interrupt_work = smu_v13_0_interrupt_work,  };  void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c index 4fd0354bd312..55ef18517b0f 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c @@ -2530,79 +2530,110 @@ out:  	return result;  } -static int smu_v13_0_7_set_power_profile_mode(struct smu_context *smu, long *input, uint32_t size) +#define SMU_13_0_7_CUSTOM_PARAMS_COUNT 8 +#define SMU_13_0_7_CUSTOM_PARAMS_CLOCK_COUNT 2 +#define SMU_13_0_7_CUSTOM_PARAMS_SIZE (SMU_13_0_7_CUSTOM_PARAMS_CLOCK_COUNT * SMU_13_0_7_CUSTOM_PARAMS_COUNT * sizeof(long)) + +static int smu_v13_0_7_set_power_profile_mode_coeff(struct smu_context *smu, +						    long *input)  {  	DpmActivityMonitorCoeffIntExternal_t activity_monitor_external;  	DpmActivityMonitorCoeffInt_t *activity_monitor =  		&(activity_monitor_external.DpmActivityMonitorCoeffInt); -	int workload_type, ret = 0; +	int ret, idx; -	smu->power_profile_mode = input[size]; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), false); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +		return ret; +	} -	if (smu->power_profile_mode > PP_SMC_POWER_PROFILE_WINDOW3D) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", smu->power_profile_mode); -		return -EINVAL; +	idx = 0 * SMU_13_0_7_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Gfxclk */ +		activity_monitor->Gfx_ActiveHystLimit = input[idx + 1]; +		activity_monitor->Gfx_IdleHystLimit = input[idx + 2]; +		activity_monitor->Gfx_FPS = input[idx + 3]; +		activity_monitor->Gfx_MinActiveFreqType = input[idx + 4]; +		activity_monitor->Gfx_BoosterFreqType = input[idx + 5]; +		activity_monitor->Gfx_MinActiveFreq = input[idx + 6]; +		activity_monitor->Gfx_BoosterFreq = input[idx + 7]; +	} +	idx = 1 * SMU_13_0_7_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Fclk */ +		activity_monitor->Fclk_ActiveHystLimit = input[idx + 1]; +		activity_monitor->Fclk_IdleHystLimit = input[idx + 2]; +		activity_monitor->Fclk_FPS = input[idx + 3]; +		activity_monitor->Fclk_MinActiveFreqType = input[idx + 4]; +		activity_monitor->Fclk_BoosterFreqType = input[idx + 5]; +		activity_monitor->Fclk_MinActiveFreq = input[idx + 6]; +		activity_monitor->Fclk_BoosterFreq = input[idx + 7];  	} -	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { -		if (size != 8) -			return -EINVAL; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), true); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +		return ret; +	} -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor_external), false); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); -			return ret; -		} +	return ret; +} -		switch (input[0]) { -		case 0: /* Gfxclk */ -			activity_monitor->Gfx_ActiveHystLimit = input[1]; -			activity_monitor->Gfx_IdleHystLimit = input[2]; -			activity_monitor->Gfx_FPS = input[3]; -			activity_monitor->Gfx_MinActiveFreqType = input[4]; -			activity_monitor->Gfx_BoosterFreqType = input[5]; -			activity_monitor->Gfx_MinActiveFreq = input[6]; -			activity_monitor->Gfx_BoosterFreq = input[7]; -			break; -		case 1: /* Fclk */ -			activity_monitor->Fclk_ActiveHystLimit = input[1]; -			activity_monitor->Fclk_IdleHystLimit = input[2]; -			activity_monitor->Fclk_FPS = input[3]; -			activity_monitor->Fclk_MinActiveFreqType = input[4]; -			activity_monitor->Fclk_BoosterFreqType = input[5]; -			activity_monitor->Fclk_MinActiveFreq = input[6]; -			activity_monitor->Fclk_BoosterFreq = input[7]; -			break; -		default: -			return -EINVAL; +static int smu_v13_0_7_set_power_profile_mode(struct smu_context *smu, +					      u32 workload_mask, +					      long *custom_params, +					      u32 custom_params_max_idx) +{ +	u32 backend_workload_mask = 0; +	int ret, idx = -1, i; + +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask); + +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_CUSTOM)) { +		if (!smu->custom_profile_params) { +			smu->custom_profile_params = +				kzalloc(SMU_13_0_7_CUSTOM_PARAMS_SIZE, GFP_KERNEL); +			if (!smu->custom_profile_params) +				return -ENOMEM;  		} - -		ret = smu_cmn_update_table(smu, -				       SMU_TABLE_ACTIVITY_MONITOR_COEFF, WORKLOAD_PPLIB_CUSTOM_BIT, -				       (void *)(&activity_monitor_external), true); +		if (custom_params && custom_params_max_idx) { +			if (custom_params_max_idx != SMU_13_0_7_CUSTOM_PARAMS_COUNT) +				return -EINVAL; +			if (custom_params[0] >= SMU_13_0_7_CUSTOM_PARAMS_CLOCK_COUNT) +				return -EINVAL; +			idx = custom_params[0] * SMU_13_0_7_CUSTOM_PARAMS_COUNT; +			smu->custom_profile_params[idx] = 1; +			for (i = 1; i < custom_params_max_idx; i++) +				smu->custom_profile_params[idx + i] = custom_params[i]; +		} +		ret = smu_v13_0_7_set_power_profile_mode_coeff(smu, +							       smu->custom_profile_params);  		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +			if (idx != -1) +				smu->custom_profile_params[idx] = 0;  			return ret;  		} +	} else if (smu->custom_profile_params) { +		memset(smu->custom_profile_params, 0, SMU_13_0_7_CUSTOM_PARAMS_SIZE);  	} -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       smu->power_profile_mode); -	if (workload_type < 0) -		return -EINVAL; -  	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask, -				    smu->workload_mask, NULL); +					      backend_workload_mask, NULL); -	if (ret) -		dev_err(smu->adev->dev, "[%s] Failed to set work load mask!", __func__); -	else -		smu_cmn_assign_power_profile(smu); +	if (ret) { +		dev_err(smu->adev->dev, "Failed to set workload mask 0x%08x\n", +			workload_mask); +		if (idx != -1) +			smu->custom_profile_params[idx] = 0; +		return ret; +	}  	return ret;  } @@ -2766,6 +2797,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {  	.is_asic_wbrf_supported = smu_v13_0_7_wbrf_support_check,  	.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,  	.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges, +	.interrupt_work = smu_v13_0_interrupt_work,  };  void smu_v13_0_7_set_ppt_funcs(struct smu_context *smu) @@ -2779,4 +2811,5 @@ void smu_v13_0_7_set_ppt_funcs(struct smu_context *smu)  	smu->workload_map = smu_v13_0_7_workload_map;  	smu->smc_driver_if_version = SMU13_0_7_DRIVER_IF_VERSION;  	smu_v13_0_set_smu_mailbox_registers(smu); +	smu->power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c index 687a0f5ac94f..5cad09c5f2ff 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c @@ -1739,89 +1739,120 @@ static int smu_v14_0_2_get_power_profile_mode(struct smu_context *smu,  	return size;  } -static int smu_v14_0_2_set_power_profile_mode(struct smu_context *smu, -					      long *input, -					      uint32_t size) +#define SMU_14_0_2_CUSTOM_PARAMS_COUNT 9 +#define SMU_14_0_2_CUSTOM_PARAMS_CLOCK_COUNT 2 +#define SMU_14_0_2_CUSTOM_PARAMS_SIZE (SMU_14_0_2_CUSTOM_PARAMS_CLOCK_COUNT * SMU_14_0_2_CUSTOM_PARAMS_COUNT * sizeof(long)) + +static int smu_v14_0_2_set_power_profile_mode_coeff(struct smu_context *smu, +						    long *input)  {  	DpmActivityMonitorCoeffIntExternal_t activity_monitor_external;  	DpmActivityMonitorCoeffInt_t *activity_monitor =  		&(activity_monitor_external.DpmActivityMonitorCoeffInt); -	int workload_type, ret = 0; -	uint32_t current_profile_mode = smu->power_profile_mode; -	smu->power_profile_mode = input[size]; +	int ret, idx; -	if (smu->power_profile_mode >= PP_SMC_POWER_PROFILE_COUNT) { -		dev_err(smu->adev->dev, "Invalid power profile mode %d\n", smu->power_profile_mode); -		return -EINVAL; +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +				   WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), +				   false); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +		return ret;  	} -	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) { -		if (size != 9) -			return -EINVAL; +	idx = 0 * SMU_14_0_2_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Gfxclk */ +		activity_monitor->Gfx_FPS = input[idx + 1]; +		activity_monitor->Gfx_MinActiveFreqType = input[idx + 2]; +		activity_monitor->Gfx_MinActiveFreq = input[idx + 3]; +		activity_monitor->Gfx_BoosterFreqType = input[idx + 4]; +		activity_monitor->Gfx_BoosterFreq = input[idx + 5]; +		activity_monitor->Gfx_PD_Data_limit_c = input[idx + 6]; +		activity_monitor->Gfx_PD_Data_error_coeff = input[idx + 7]; +		activity_monitor->Gfx_PD_Data_error_rate_coeff = input[idx + 8]; +	} +	idx = 1 * SMU_14_0_2_CUSTOM_PARAMS_COUNT; +	if (input[idx]) { +		/* Fclk */ +		activity_monitor->Fclk_FPS = input[idx + 1]; +		activity_monitor->Fclk_MinActiveFreqType = input[idx + 2]; +		activity_monitor->Fclk_MinActiveFreq = input[idx + 3]; +		activity_monitor->Fclk_BoosterFreqType = input[idx + 4]; +		activity_monitor->Fclk_BoosterFreq = input[idx + 5]; +		activity_monitor->Fclk_PD_Data_limit_c = input[idx + 6]; +		activity_monitor->Fclk_PD_Data_error_coeff = input[idx + 7]; +		activity_monitor->Fclk_PD_Data_error_rate_coeff = input[idx + 8]; +	} -		ret = smu_cmn_update_table(smu, -					   SMU_TABLE_ACTIVITY_MONITOR_COEFF, -					   WORKLOAD_PPLIB_CUSTOM_BIT, -					   (void *)(&activity_monitor_external), -					   false); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); -			return ret; -		} +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +				   WORKLOAD_PPLIB_CUSTOM_BIT, +				   (void *)(&activity_monitor_external), +				   true); +	if (ret) { +		dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +		return ret; +	} -		switch (input[0]) { -		case 0: /* Gfxclk */ -			activity_monitor->Gfx_FPS = input[1]; -			activity_monitor->Gfx_MinActiveFreqType = input[2]; -			activity_monitor->Gfx_MinActiveFreq = input[3]; -			activity_monitor->Gfx_BoosterFreqType = input[4]; -			activity_monitor->Gfx_BoosterFreq = input[5]; -			activity_monitor->Gfx_PD_Data_limit_c = input[6]; -			activity_monitor->Gfx_PD_Data_error_coeff = input[7]; -			activity_monitor->Gfx_PD_Data_error_rate_coeff = input[8]; -			break; -		case 1: /* Fclk */ -			activity_monitor->Fclk_FPS = input[1]; -			activity_monitor->Fclk_MinActiveFreqType = input[2]; -			activity_monitor->Fclk_MinActiveFreq = input[3]; -			activity_monitor->Fclk_BoosterFreqType = input[4]; -			activity_monitor->Fclk_BoosterFreq = input[5]; -			activity_monitor->Fclk_PD_Data_limit_c = input[6]; -			activity_monitor->Fclk_PD_Data_error_coeff = input[7]; -			activity_monitor->Fclk_PD_Data_error_rate_coeff = input[8]; -			break; -		default: -			return -EINVAL; -		} +	return ret; +} -		ret = smu_cmn_update_table(smu, -					   SMU_TABLE_ACTIVITY_MONITOR_COEFF, -					   WORKLOAD_PPLIB_CUSTOM_BIT, -					   (void *)(&activity_monitor_external), -					   true); -		if (ret) { -			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); -			return ret; -		} -	} +static int smu_v14_0_2_set_power_profile_mode(struct smu_context *smu, +					      u32 workload_mask, +					      long *custom_params, +					      u32 custom_params_max_idx) +{ +	u32 backend_workload_mask = 0; +	int ret, idx = -1, i; + +	smu_cmn_get_backend_workload_mask(smu, workload_mask, +					  &backend_workload_mask); -	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_COMPUTE) +	/* disable deep sleep if compute is enabled */ +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_COMPUTE))  		smu_v14_0_deep_sleep_control(smu, false); -	else if (current_profile_mode == PP_SMC_POWER_PROFILE_COMPUTE) +	else  		smu_v14_0_deep_sleep_control(smu, true); -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, -						       CMN2ASIC_MAPPING_WORKLOAD, -						       smu->power_profile_mode); -	if (workload_type < 0) -		return -EINVAL; +	if (workload_mask & (1 << PP_SMC_POWER_PROFILE_CUSTOM)) { +		if (!smu->custom_profile_params) { +			smu->custom_profile_params = +				kzalloc(SMU_14_0_2_CUSTOM_PARAMS_SIZE, GFP_KERNEL); +			if (!smu->custom_profile_params) +				return -ENOMEM; +		} +		if (custom_params && custom_params_max_idx) { +			if (custom_params_max_idx != SMU_14_0_2_CUSTOM_PARAMS_COUNT) +				return -EINVAL; +			if (custom_params[0] >= SMU_14_0_2_CUSTOM_PARAMS_CLOCK_COUNT) +				return -EINVAL; +			idx = custom_params[0] * SMU_14_0_2_CUSTOM_PARAMS_COUNT; +			smu->custom_profile_params[idx] = 1; +			for (i = 1; i < custom_params_max_idx; i++) +				smu->custom_profile_params[idx + i] = custom_params[i]; +		} +		ret = smu_v14_0_2_set_power_profile_mode_coeff(smu, +							       smu->custom_profile_params); +		if (ret) { +			if (idx != -1) +				smu->custom_profile_params[idx] = 0; +			return ret; +		} +	} else if (smu->custom_profile_params) { +		memset(smu->custom_profile_params, 0, SMU_14_0_2_CUSTOM_PARAMS_SIZE); +	}  	ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask, -										  smu->workload_mask, NULL); - -	if (!ret) -		smu_cmn_assign_power_profile(smu); +					      backend_workload_mask, NULL); +	if (ret) { +		dev_err(smu->adev->dev, "Failed to set workload mask 0x%08x\n", +			workload_mask); +		if (idx != -1) +			smu->custom_profile_params[idx] = 0; +		return ret; +	}  	return ret;  } @@ -2065,7 +2096,7 @@ static int smu_v14_0_2_enable_gfx_features(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; -	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(14, 0, 2)) +	if (amdgpu_ip_version(adev, MP1_HWIP, 0) == IP_VERSION(14, 0, 2))  		return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_EnableAllSmuFeatures,  										   FEATURE_PWR_GFX, NULL);  	else diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c index dbbd3759bff3..9f55207ea9bc 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c @@ -1144,14 +1144,6 @@ int smu_cmn_set_mp1_state(struct smu_context *smu,  	return ret;  } -void smu_cmn_assign_power_profile(struct smu_context *smu) -{ -	uint32_t index; -	index = fls(smu->workload_mask); -	index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0; -	smu->power_profile_mode = smu->workload_setting[index]; -} -  bool smu_cmn_is_audio_func_enabled(struct amdgpu_device *adev)  {  	struct pci_dev *p = NULL; @@ -1229,3 +1221,28 @@ void smu_cmn_generic_plpd_policy_desc(struct smu_dpm_policy *policy)  {  	policy->desc = &xgmi_plpd_policy_desc;  } + +void smu_cmn_get_backend_workload_mask(struct smu_context *smu, +				       u32 workload_mask, +				       u32 *backend_workload_mask) +{ +	int workload_type; +	u32 profile_mode; + +	*backend_workload_mask = 0; + +	for (profile_mode = 0; profile_mode < PP_SMC_POWER_PROFILE_COUNT; profile_mode++) { +		if (!(workload_mask & (1 << profile_mode))) +			continue; + +		/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ +		workload_type = smu_cmn_to_asic_specific_index(smu, +							       CMN2ASIC_MAPPING_WORKLOAD, +							       profile_mode); + +		if (workload_type < 0) +			continue; + +		*backend_workload_mask |= 1 << workload_type; +	} +} diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h index 8a801e389659..a020277dec3e 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h +++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h @@ -130,8 +130,6 @@ void smu_cmn_init_soft_gpu_metrics(void *table, uint8_t frev, uint8_t crev);  int smu_cmn_set_mp1_state(struct smu_context *smu,  			  enum pp_mp1_state mp1_state); -void smu_cmn_assign_power_profile(struct smu_context *smu); -  /*   * Helper function to make sysfs_emit_at() happy. Align buf to   * the current page boundary and record the offset. @@ -149,5 +147,9 @@ bool smu_cmn_is_audio_func_enabled(struct amdgpu_device *adev);  void smu_cmn_generic_soc_policy_desc(struct smu_dpm_policy *policy);  void smu_cmn_generic_plpd_policy_desc(struct smu_dpm_policy *policy); +void smu_cmn_get_backend_workload_mask(struct smu_context *smu, +				       u32 workload_mask, +				       u32 *backend_workload_mask); +  #endif  #endif diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c index 6d475bb34002..d981d721e796 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c @@ -153,7 +153,7 @@ static const struct dev_pm_ops komeda_pm_ops = {  static struct platform_driver komeda_platform_driver = {  	.probe	= komeda_platform_probe, -	.remove_new = komeda_platform_remove, +	.remove = komeda_platform_remove,  	.shutdown = komeda_platform_shutdown,  	.driver	= {  		.name = "komeda", diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c index cd4389809d42..191b806624df 100644 --- a/drivers/gpu/drm/arm/hdlcd_drv.c +++ b/drivers/gpu/drm/arm/hdlcd_drv.c @@ -405,7 +405,7 @@ static SIMPLE_DEV_PM_OPS(hdlcd_pm_ops, hdlcd_pm_suspend, hdlcd_pm_resume);  static struct platform_driver hdlcd_platform_driver = {  	.probe		= hdlcd_probe, -	.remove_new	= hdlcd_remove, +	.remove		= hdlcd_remove,  	.shutdown	= hdlcd_shutdown,  	.driver	= {  		.name = "hdlcd", diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/malidp_drv.c index 4cb25004b84f..fd2be80f3bf5 100644 --- a/drivers/gpu/drm/arm/malidp_drv.c +++ b/drivers/gpu/drm/arm/malidp_drv.c @@ -988,7 +988,7 @@ static const struct dev_pm_ops malidp_pm_ops = {  static struct platform_driver malidp_platform_driver = {  	.probe		= malidp_platform_probe, -	.remove_new	= malidp_platform_remove, +	.remove		= malidp_platform_remove,  	.shutdown	= malidp_platform_shutdown,  	.driver	= {  		.name = "mali-dp", diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c index c78687c755a8..0900e4466ffb 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c @@ -1084,7 +1084,7 @@ MODULE_DEVICE_TABLE(platform, armada_lcd_platform_ids);  struct platform_driver armada_lcd_platform_driver = {  	.probe	= armada_lcd_probe, -	.remove_new = armada_lcd_remove, +	.remove = armada_lcd_remove,  	.driver = {  		.name	= "armada-lcd",  		.owner	=  THIS_MODULE, diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c index 5c26f0409478..650e450cc19b 100644 --- a/drivers/gpu/drm/armada/armada_drv.c +++ b/drivers/gpu/drm/armada/armada_drv.c @@ -250,7 +250,7 @@ MODULE_DEVICE_TABLE(platform, armada_drm_platform_ids);  static struct platform_driver armada_drm_platform_driver = {  	.probe	= armada_drm_probe, -	.remove_new = armada_drm_remove, +	.remove = armada_drm_remove,  	.shutdown = armada_drm_shutdown,  	.driver	= {  		.name	= "armada-drm", diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c index 26d10065d534..1a1680d71486 100644 --- a/drivers/gpu/drm/armada/armada_gem.c +++ b/drivers/gpu/drm/armada/armada_gem.c @@ -15,7 +15,7 @@  #include "armada_gem.h"  #include "armada_ioctlP.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  static vm_fault_t armada_gem_vm_fault(struct vm_fault *vmf)  { diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c index 109023815fa2..b7e608ba6194 100644 --- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c @@ -368,7 +368,7 @@ static void aspeed_gfx_shutdown(struct platform_device *pdev)  static struct platform_driver aspeed_gfx_platform_driver = {  	.probe		= aspeed_gfx_probe, -	.remove_new	= aspeed_gfx_remove, +	.remove		= aspeed_gfx_remove,  	.shutdown	= aspeed_gfx_shutdown,  	.driver = {  		.name = "aspeed_gfx", diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c index 792dcc19e8e7..7b209af7cf45 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c @@ -937,7 +937,7 @@ static const struct of_device_id atmel_hlcdc_dc_of_match[] = {  static struct platform_driver atmel_hlcdc_dc_platform_driver = {  	.probe	= atmel_hlcdc_dc_drm_probe, -	.remove_new = atmel_hlcdc_dc_drm_remove, +	.remove = atmel_hlcdc_dc_drm_remove,  	.shutdown = atmel_hlcdc_dc_drm_shutdown,  	.driver	= {  		.name	= "atmel-hlcdc-display-controller", diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c index 61f4a38e7d2b..8f786592143b 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_audio.c @@ -153,7 +153,16 @@ static int adv7511_hdmi_hw_params(struct device *dev, void *data,  			   ADV7511_AUDIO_CFG3_LEN_MASK, len);  	regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG,  			   ADV7511_I2C_FREQ_ID_CFG_RATE_MASK, rate << 4); -	regmap_write(adv7511->regmap, 0x73, 0x1); + +	/* send current Audio infoframe values while updating */ +	regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, +			   BIT(5), BIT(5)); + +	regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(0), 0x1); + +	/* use Audio infoframe updated info */ +	regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, +			   BIT(5), 0);  	return 0;  } @@ -184,8 +193,9 @@ static int audio_startup(struct device *dev, void *data)  	regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(0),  				BIT(7) | BIT(6), BIT(7));  	/* use Audio infoframe updated info */ -	regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(1), +	regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,  				BIT(5), 0); +  	/* enable SPDIF receiver */  	if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF)  		regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c index eb5919b38263..a13b3d8ab6ac 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -1241,8 +1241,10 @@ static int adv7511_probe(struct i2c_client *i2c)  		return ret;  	ret = adv7511_init_regulators(adv7511); -	if (ret) -		return dev_err_probe(dev, ret, "failed to init regulators\n"); +	if (ret) { +		dev_err_probe(dev, ret, "failed to init regulators\n"); +		goto err_of_node_put; +	}  	/*  	 * The power down GPIO is optional. If present, toggle it from active to @@ -1363,6 +1365,8 @@ err_i2c_unregister_edid:  	i2c_unregister_device(adv7511->i2c_edid);  uninit_regulators:  	adv7511_uninit_regulators(adv7511); +err_of_node_put: +	of_node_put(adv7511->host_node);  	return ret;  } @@ -1371,6 +1375,8 @@ static void adv7511_remove(struct i2c_client *i2c)  {  	struct adv7511 *adv7511 = i2c_get_clientdata(i2c); +	of_node_put(adv7511->host_node); +  	adv7511_uninit_regulators(adv7511);  	drm_bridge_remove(&adv7511->bridge); diff --git a/drivers/gpu/drm/bridge/adv7511/adv7533.c b/drivers/gpu/drm/bridge/adv7511/adv7533.c index 4481489aaf5e..122ad91e8a32 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7533.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7533.c @@ -172,7 +172,7 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)  	of_property_read_u32(np, "adi,dsi-lanes", &num_lanes); -	if (num_lanes < 1 || num_lanes > 4) +	if (num_lanes < 2 || num_lanes > 4)  		return -EINVAL;  	adv->num_dsi_lanes = num_lanes; @@ -181,8 +181,6 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)  	if (!adv->host_node)  		return -ENODEV; -	of_node_put(adv->host_node); -  	adv->use_timing_gen = !of_property_read_bool(np,  						"adi,disable-timing-generator"); diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c index 7457d38622b0..c7a0247e06ad 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -1300,7 +1300,7 @@ MODULE_DEVICE_TABLE(of, cdns_dsi_of_match);  static struct platform_driver cdns_dsi_platform_driver = {  	.probe  = cdns_dsi_drm_probe, -	.remove_new = cdns_dsi_drm_remove, +	.remove = cdns_dsi_drm_remove,  	.driver = {  		.name   = "cdns-dsi",  		.of_match_table = cdns_dsi_of_match, diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c index 41f72d458487..d081850e3c03 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c @@ -2656,7 +2656,7 @@ static struct platform_driver mhdp_driver = {  		.of_match_table	= mhdp_ids,  	},  	.probe	= cdns_mhdp_probe, -	.remove_new = cdns_mhdp_remove, +	.remove = cdns_mhdp_remove,  };  module_platform_driver(mhdp_driver); diff --git a/drivers/gpu/drm/bridge/display-connector.c b/drivers/gpu/drm/bridge/display-connector.c index aab9ce7be94c..72bc508d4e6e 100644 --- a/drivers/gpu/drm/bridge/display-connector.c +++ b/drivers/gpu/drm/bridge/display-connector.c @@ -427,7 +427,7 @@ MODULE_DEVICE_TABLE(of, display_connector_match);  static struct platform_driver display_connector_driver = {  	.probe	= display_connector_probe, -	.remove_new = display_connector_remove, +	.remove = display_connector_remove,  	.driver		= {  		.name		= "display-connector",  		.of_match_table	= display_connector_match, diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c index 0e4bac7dd04f..0fc8a14fd800 100644 --- a/drivers/gpu/drm/bridge/fsl-ldb.c +++ b/drivers/gpu/drm/bridge/fsl-ldb.c @@ -393,7 +393,7 @@ MODULE_DEVICE_TABLE(of, fsl_ldb_match);  static struct platform_driver fsl_ldb_driver = {  	.probe	= fsl_ldb_probe, -	.remove_new = fsl_ldb_remove, +	.remove = fsl_ldb_remove,  	.driver		= {  		.name		= "fsl-ldb",  		.of_match_table	= fsl_ldb_match, diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c index 073e64dc200c..0d1ac3edcab4 100644 --- a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-pvi.c @@ -193,7 +193,7 @@ MODULE_DEVICE_TABLE(of, imx8mp_hdmi_pvi_match);  static struct platform_driver imx8mp_hdmi_pvi_driver = {  	.probe	= imx8mp_hdmi_pvi_probe, -	.remove_new = imx8mp_hdmi_pvi_remove, +	.remove = imx8mp_hdmi_pvi_remove,  	.driver		= {  		.name = "imx-hdmi-pvi",  		.of_match_table	= imx8mp_hdmi_pvi_match, diff --git a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c index 8fcc6d18f4ab..1e7a789ec289 100644 --- a/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c +++ b/drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c @@ -144,7 +144,7 @@ MODULE_DEVICE_TABLE(of, imx8mp_dw_hdmi_of_table);  static struct platform_driver imx8mp_dw_hdmi_platform_driver = {  	.probe		= imx8mp_dw_hdmi_probe, -	.remove_new	= imx8mp_dw_hdmi_remove, +	.remove		= imx8mp_dw_hdmi_remove,  	.driver		= {  		.name	= "imx8mp-dw-hdmi-tx",  		.of_match_table = imx8mp_dw_hdmi_of_table, diff --git a/drivers/gpu/drm/bridge/imx/imx8qm-ldb.c b/drivers/gpu/drm/bridge/imx/imx8qm-ldb.c index c879e37f5811..dd5823f04c70 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qm-ldb.c +++ b/drivers/gpu/drm/bridge/imx/imx8qm-ldb.c @@ -570,7 +570,7 @@ MODULE_DEVICE_TABLE(of, imx8qm_ldb_dt_ids);  static struct platform_driver imx8qm_ldb_driver = {  	.probe	= imx8qm_ldb_probe, -	.remove_new = imx8qm_ldb_remove, +	.remove = imx8qm_ldb_remove,  	.driver	= {  		.pm = pm_ptr(&imx8qm_ldb_pm_ops),  		.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c index b33011f397f0..7bce2305d676 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c @@ -706,7 +706,7 @@ MODULE_DEVICE_TABLE(of, imx8qxp_ldb_dt_ids);  static struct platform_driver imx8qxp_ldb_driver = {  	.probe	= imx8qxp_ldb_probe, -	.remove_new = imx8qxp_ldb_remove, +	.remove = imx8qxp_ldb_remove,  	.driver	= {  		.pm = pm_ptr(&imx8qxp_ldb_pm_ops),  		.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c index ce43e4069e21..1812bd106261 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c @@ -427,7 +427,7 @@ MODULE_DEVICE_TABLE(of, imx8qxp_pc_dt_ids);  static struct platform_driver imx8qxp_pc_bridge_driver = {  	.probe	= imx8qxp_pc_bridge_probe, -	.remove_new = imx8qxp_pc_bridge_remove, +	.remove = imx8qxp_pc_bridge_remove,  	.driver	= {  		.pm = pm_ptr(&imx8qxp_pc_pm_ops),  		.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c index 1d11cc1df43c..4b0715ed6f38 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pixel-link.c @@ -409,7 +409,7 @@ MODULE_DEVICE_TABLE(of, imx8qxp_pixel_link_dt_ids);  static struct platform_driver imx8qxp_pixel_link_bridge_driver = {  	.probe	= imx8qxp_pixel_link_bridge_probe, -	.remove_new = imx8qxp_pixel_link_bridge_remove, +	.remove = imx8qxp_pixel_link_bridge_remove,  	.driver	= {  		.of_match_table = imx8qxp_pixel_link_dt_ids,  		.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c b/drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c index fb7cf4369bb8..65cf3a6c8ec6 100644 --- a/drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c +++ b/drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c @@ -467,7 +467,7 @@ MODULE_DEVICE_TABLE(of, imx8qxp_pxl2dpi_dt_ids);  static struct platform_driver imx8qxp_pxl2dpi_bridge_driver = {  	.probe	= imx8qxp_pxl2dpi_bridge_probe, -	.remove_new = imx8qxp_pxl2dpi_bridge_remove, +	.remove = imx8qxp_pxl2dpi_bridge_remove,  	.driver	= {  		.of_match_table = imx8qxp_pxl2dpi_dt_ids,  		.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c b/drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c index 2347f8dd632f..bea8346515b8 100644 --- a/drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c +++ b/drivers/gpu/drm/bridge/imx/imx93-mipi-dsi.c @@ -904,7 +904,7 @@ MODULE_DEVICE_TABLE(of, imx93_dsi_dt_ids);  static struct platform_driver imx93_dsi_driver = {  	.probe	= imx93_dsi_probe, -	.remove_new = imx93_dsi_remove, +	.remove = imx93_dsi_remove,  	.driver	= {  		.of_match_table = imx93_dsi_dt_ids,  		.name = "imx93_mipi_dsi", diff --git a/drivers/gpu/drm/bridge/ite-it6263.c b/drivers/gpu/drm/bridge/ite-it6263.c index cbabd4e20d3e..5f138a5692c7 100644 --- a/drivers/gpu/drm/bridge/ite-it6263.c +++ b/drivers/gpu/drm/bridge/ite-it6263.c @@ -845,8 +845,8 @@ static int it6263_probe(struct i2c_client *client)  	it->lvds_i2c = devm_i2c_new_dummy_device(dev, client->adapter,  						 LVDS_INPUT_CTRL_I2C_ADDR);  	if (IS_ERR(it->lvds_i2c)) -		dev_err_probe(it->dev, PTR_ERR(it->lvds_i2c), -			      "failed to allocate I2C device for LVDS\n"); +		return dev_err_probe(it->dev, PTR_ERR(it->lvds_i2c), +				     "failed to allocate I2C device for LVDS\n");  	it->lvds_regmap = devm_regmap_init_i2c(it->lvds_i2c,  					       &it6263_lvds_regmap_config); diff --git a/drivers/gpu/drm/bridge/lvds-codec.c b/drivers/gpu/drm/bridge/lvds-codec.c index 991732c4b629..389af0233fcd 100644 --- a/drivers/gpu/drm/bridge/lvds-codec.c +++ b/drivers/gpu/drm/bridge/lvds-codec.c @@ -236,7 +236,7 @@ MODULE_DEVICE_TABLE(of, lvds_codec_match);  static struct platform_driver lvds_codec_driver = {  	.probe	= lvds_codec_probe, -	.remove_new = lvds_codec_remove, +	.remove = lvds_codec_remove,  	.driver		= {  		.name		= "lvds-codec",  		.of_match_table	= lvds_codec_match, diff --git a/drivers/gpu/drm/bridge/nwl-dsi.c b/drivers/gpu/drm/bridge/nwl-dsi.c index 5f05647a3bea..1e5b2a37cb8c 100644 --- a/drivers/gpu/drm/bridge/nwl-dsi.c +++ b/drivers/gpu/drm/bridge/nwl-dsi.c @@ -1211,7 +1211,7 @@ static void nwl_dsi_remove(struct platform_device *pdev)  static struct platform_driver nwl_dsi_driver = {  	.probe		= nwl_dsi_probe, -	.remove_new	= nwl_dsi_remove, +	.remove		= nwl_dsi_remove,  	.driver		= {  		.of_match_table = nwl_dsi_dt_ids,  		.name	= DRV_NAME, diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c index 4416d0be7272..f8b4fb835765 100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -2139,7 +2139,7 @@ MODULE_DEVICE_TABLE(of, samsung_dsim_of_match);  static struct platform_driver samsung_dsim_driver = {  	.probe = samsung_dsim_probe, -	.remove_new = samsung_dsim_remove, +	.remove = samsung_dsim_remove,  	.driver = {  		   .name = "samsung-dsim",  		   .pm = pm_ptr(&samsung_dsim_pm_ops), diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c index 221e9a4edb40..cf1f66b7b192 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c @@ -645,7 +645,7 @@ static SIMPLE_DEV_PM_OPS(snd_dw_hdmi_pm, snd_dw_hdmi_suspend,  static struct platform_driver snd_dw_hdmi_driver = {  	.probe	= snd_dw_hdmi_probe, -	.remove_new = snd_dw_hdmi_remove, +	.remove = snd_dw_hdmi_remove,  	.driver	= {  		.name = DRIVER_NAME,  		.pm = PM_OPS, diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c index d4614de1ae1e..9549dabde941 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c @@ -346,7 +346,7 @@ static const struct dev_pm_ops dw_hdmi_cec_pm = {  static struct platform_driver dw_hdmi_cec_driver = {  	.probe	= dw_hdmi_cec_probe, -	.remove_new = dw_hdmi_cec_remove, +	.remove = dw_hdmi_cec_remove,  	.driver = {  		.name = "dw-hdmi-cec",  		.pm = pm_ptr(&dw_hdmi_cec_pm), diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-gp-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-gp-audio.c index 423762da2ab4..ab18f9a3bf23 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-gp-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-gp-audio.c @@ -181,7 +181,7 @@ static void snd_dw_hdmi_remove(struct platform_device *pdev)  static struct platform_driver snd_dw_hdmi_driver = {  	.probe	= snd_dw_hdmi_probe, -	.remove_new = snd_dw_hdmi_remove, +	.remove = snd_dw_hdmi_remove,  	.driver	= {  		.name = DRIVER_NAME,  	}, diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c index 26c187d20d97..f1c5a8d0fa90 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c @@ -225,7 +225,7 @@ static void snd_dw_hdmi_remove(struct platform_device *pdev)  static struct platform_driver snd_dw_hdmi_driver = {  	.probe	= snd_dw_hdmi_probe, -	.remove_new = snd_dw_hdmi_remove, +	.remove = snd_dw_hdmi_remove,  	.driver	= {  		.name = DRIVER_NAME,  	}, diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c b/drivers/gpu/drm/bridge/thc63lvd1024.c index 674efc489e3a..bba10cf9b4f9 100644 --- a/drivers/gpu/drm/bridge/thc63lvd1024.c +++ b/drivers/gpu/drm/bridge/thc63lvd1024.c @@ -230,7 +230,7 @@ MODULE_DEVICE_TABLE(of, thc63_match);  static struct platform_driver thc63_driver = {  	.probe	= thc63_probe, -	.remove_new = thc63_remove, +	.remove = thc63_remove,  	.driver	= {  		.name		= "thc63lvd1024",  		.of_match_table	= thc63_match, diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c index b1b1e4d5a24a..107a2c0b96c9 100644 --- a/drivers/gpu/drm/bridge/ti-tfp410.c +++ b/drivers/gpu/drm/bridge/ti-tfp410.c @@ -406,7 +406,7 @@ MODULE_DEVICE_TABLE(of, tfp410_match);  static struct platform_driver tfp410_platform_driver = {  	.probe	= tfp410_probe, -	.remove_new = tfp410_remove, +	.remove = tfp410_remove,  	.driver	= {  		.name		= "tfp410-bridge",  		.of_match_table	= tfp410_match, diff --git a/drivers/gpu/drm/bridge/ti-tpd12s015.c b/drivers/gpu/drm/bridge/ti-tpd12s015.c index f9fb35683a27..47b74cb25b14 100644 --- a/drivers/gpu/drm/bridge/ti-tpd12s015.c +++ b/drivers/gpu/drm/bridge/ti-tpd12s015.c @@ -195,7 +195,7 @@ MODULE_DEVICE_TABLE(of, tpd12s015_of_match);  static struct platform_driver tpd12s015_driver = {  	.probe	= tpd12s015_probe, -	.remove_new = tpd12s015_remove, +	.remove = tpd12s015_remove,  	.driver	= {  		.name	= "tpd12s015",  		.of_match_table = tpd12s015_of_match, diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c index 320c297008aa..3a5a4f92c979 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -459,7 +459,10 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,  	if (connector_type == DRM_MODE_CONNECTOR_Unknown)  		return ERR_PTR(-EINVAL); -	if (bridge_connector->bridge_hdmi) +	if (bridge_connector->bridge_hdmi) { +		if (!connector->ycbcr_420_allowed) +			supported_formats &= ~BIT(HDMI_COLORSPACE_YUV420); +  		ret = drmm_connector_hdmi_init(drm, connector,  					       bridge_connector->bridge_hdmi->vendor,  					       bridge_connector->bridge_hdmi->product, @@ -468,10 +471,11 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,  					       connector_type, ddc,  					       supported_formats,  					       max_bpc); -	else +	} else {  		ret = drmm_connector_init(drm, connector,  					  &drm_bridge_connector_funcs,  					  connector_type, ddc); +	}  	if (ret)  		return ERR_PTR(ret); diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c index ac90118b9e7a..dc4446d589e7 100644 --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c @@ -320,6 +320,9 @@ static bool drm_dp_decode_sideband_msg_hdr(const struct drm_dp_mst_topology_mgr  	hdr->broadcast = (buf[idx] >> 7) & 0x1;  	hdr->path_msg = (buf[idx] >> 6) & 0x1;  	hdr->msg_len = buf[idx] & 0x3f; +	if (hdr->msg_len < 1)		/* min space for body CRC */ +		return false; +  	idx++;  	hdr->somt = (buf[idx] >> 7) & 0x1;  	hdr->eomt = (buf[idx] >> 6) & 0x1; @@ -3697,8 +3700,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms  		ret = 0;  		mgr->payload_id_table_cleared = false; -		memset(&mgr->down_rep_recv, 0, sizeof(mgr->down_rep_recv)); -		memset(&mgr->up_req_recv, 0, sizeof(mgr->up_req_recv)); +		mgr->reset_rx_state = true;  	}  out_unlock: @@ -3856,6 +3858,11 @@ out_fail:  }  EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume); +static void reset_msg_rx_state(struct drm_dp_sideband_msg_rx *msg) +{ +	memset(msg, 0, sizeof(*msg)); +} +  static bool  drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up,  		      struct drm_dp_mst_branch **mstb) @@ -3934,6 +3941,34 @@ drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up,  	return true;  } +static int get_msg_request_type(u8 data) +{ +	return data & 0x7f; +} + +static bool verify_rx_request_type(struct drm_dp_mst_topology_mgr *mgr, +				   const struct drm_dp_sideband_msg_tx *txmsg, +				   const struct drm_dp_sideband_msg_rx *rxmsg) +{ +	const struct drm_dp_sideband_msg_hdr *hdr = &rxmsg->initial_hdr; +	const struct drm_dp_mst_branch *mstb = txmsg->dst; +	int tx_req_type = get_msg_request_type(txmsg->msg[0]); +	int rx_req_type = get_msg_request_type(rxmsg->msg[0]); +	char rad_str[64]; + +	if (tx_req_type == rx_req_type) +		return true; + +	drm_dp_mst_rad_to_str(mstb->rad, mstb->lct, rad_str, sizeof(rad_str)); +	drm_dbg_kms(mgr->dev, +		    "Got unexpected MST reply, mstb: %p seqno: %d lct: %d rad: %s rx_req_type: %s (%02x) != tx_req_type: %s (%02x)\n", +		    mstb, hdr->seqno, mstb->lct, rad_str, +		    drm_dp_mst_req_type_str(rx_req_type), rx_req_type, +		    drm_dp_mst_req_type_str(tx_req_type), tx_req_type); + +	return false; +} +  static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)  {  	struct drm_dp_sideband_msg_tx *txmsg; @@ -3949,9 +3984,9 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)  	/* find the message */  	mutex_lock(&mgr->qlock); +  	txmsg = list_first_entry_or_null(&mgr->tx_msg_downq,  					 struct drm_dp_sideband_msg_tx, next); -	mutex_unlock(&mgr->qlock);  	/* Were we actually expecting a response, and from this mstb? */  	if (!txmsg || txmsg->dst != mstb) { @@ -3960,6 +3995,15 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)  		hdr = &msg->initial_hdr;  		drm_dbg_kms(mgr->dev, "Got MST reply with no msg %p %d %d %02x %02x\n",  			    mstb, hdr->seqno, hdr->lct, hdr->rad[0], msg->msg[0]); + +		mutex_unlock(&mgr->qlock); + +		goto out_clear_reply; +	} + +	if (!verify_rx_request_type(mgr, txmsg, msg)) { +		mutex_unlock(&mgr->qlock); +  		goto out_clear_reply;  	} @@ -3975,20 +4019,15 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)  			    txmsg->reply.u.nak.nak_data);  	} -	memset(msg, 0, sizeof(struct drm_dp_sideband_msg_rx)); -	drm_dp_mst_topology_put_mstb(mstb); - -	mutex_lock(&mgr->qlock);  	txmsg->state = DRM_DP_SIDEBAND_TX_RX;  	list_del(&txmsg->next); +  	mutex_unlock(&mgr->qlock);  	wake_up_all(&mgr->tx_waitq); -	return 0; -  out_clear_reply: -	memset(msg, 0, sizeof(struct drm_dp_sideband_msg_rx)); +	reset_msg_rx_state(msg);  out:  	if (mstb)  		drm_dp_mst_topology_put_mstb(mstb); @@ -4070,16 +4109,20 @@ static void drm_dp_mst_up_req_work(struct work_struct *work)  static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)  {  	struct drm_dp_pending_up_req *up_req; +	struct drm_dp_mst_branch *mst_primary; +	int ret = 0;  	if (!drm_dp_get_one_sb_msg(mgr, true, NULL)) -		goto out; +		goto out_clear_reply;  	if (!mgr->up_req_recv.have_eomt)  		return 0;  	up_req = kzalloc(sizeof(*up_req), GFP_KERNEL); -	if (!up_req) -		return -ENOMEM; +	if (!up_req) { +		ret = -ENOMEM; +		goto out_clear_reply; +	}  	INIT_LIST_HEAD(&up_req->next); @@ -4090,10 +4133,19 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)  		drm_dbg_kms(mgr->dev, "Received unknown up req type, ignoring: %x\n",  			    up_req->msg.req_type);  		kfree(up_req); -		goto out; +		goto out_clear_reply;  	} -	drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, up_req->msg.req_type, +	mutex_lock(&mgr->lock); +	mst_primary = mgr->mst_primary; +	if (!mst_primary || !drm_dp_mst_topology_try_get_mstb(mst_primary)) { +		mutex_unlock(&mgr->lock); +		kfree(up_req); +		goto out_clear_reply; +	} +	mutex_unlock(&mgr->lock); + +	drm_dp_send_up_ack_reply(mgr, mst_primary, up_req->msg.req_type,  				 false);  	if (up_req->msg.req_type == DP_CONNECTION_STATUS_NOTIFY) { @@ -4110,13 +4162,13 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)  			    conn_stat->peer_device_type);  		mutex_lock(&mgr->probe_lock); -		handle_csn = mgr->mst_primary->link_address_sent; +		handle_csn = mst_primary->link_address_sent;  		mutex_unlock(&mgr->probe_lock);  		if (!handle_csn) {  			drm_dbg_kms(mgr->dev, "Got CSN before finish topology probing. Skip it.");  			kfree(up_req); -			goto out; +			goto out_put_primary;  		}  	} else if (up_req->msg.req_type == DP_RESOURCE_STATUS_NOTIFY) {  		const struct drm_dp_resource_status_notify *res_stat = @@ -4133,9 +4185,22 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)  	mutex_unlock(&mgr->up_req_lock);  	queue_work(system_long_wq, &mgr->up_req_work); -out: -	memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); -	return 0; +out_put_primary: +	drm_dp_mst_topology_put_mstb(mst_primary); +out_clear_reply: +	reset_msg_rx_state(&mgr->up_req_recv); +	return ret; +} + +static void update_msg_rx_state(struct drm_dp_mst_topology_mgr *mgr) +{ +	mutex_lock(&mgr->lock); +	if (mgr->reset_rx_state) { +		mgr->reset_rx_state = false; +		reset_msg_rx_state(&mgr->down_rep_recv); +		reset_msg_rx_state(&mgr->up_req_recv); +	} +	mutex_unlock(&mgr->lock);  }  /** @@ -4172,6 +4237,8 @@ int drm_dp_mst_hpd_irq_handle_event(struct drm_dp_mst_topology_mgr *mgr, const u  		*handled = true;  	} +	update_msg_rx_state(mgr); +  	if (esi[1] & DP_DOWN_REP_MSG_RDY) {  		ret = drm_dp_mst_handle_down_rep(mgr);  		*handled = true; diff --git a/drivers/gpu/drm/display/drm_dp_tunnel.c b/drivers/gpu/drm/display/drm_dp_tunnel.c index 48b2df120086..90fe07a89260 100644 --- a/drivers/gpu/drm/display/drm_dp_tunnel.c +++ b/drivers/gpu/drm/display/drm_dp_tunnel.c @@ -1896,8 +1896,8 @@ static void destroy_mgr(struct drm_dp_tunnel_mgr *mgr)   *   * Creates a DP tunnel manager for @dev.   * - * Returns a pointer to the tunnel manager if created successfully or NULL in - * case of an error. + * Returns a pointer to the tunnel manager if created successfully or error + * pointer in case of failure.   */  struct drm_dp_tunnel_mgr *  drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count) @@ -1907,7 +1907,7 @@ drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count)  	mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);  	if (!mgr) -		return NULL; +		return ERR_PTR(-ENOMEM);  	mgr->dev = dev;  	init_waitqueue_head(&mgr->bw_req_queue); @@ -1916,7 +1916,7 @@ drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count)  	if (!mgr->groups) {  		kfree(mgr); -		return NULL; +		return ERR_PTR(-ENOMEM);  	}  #ifdef CONFIG_DRM_DISPLAY_DP_TUNNEL_STATE_DEBUG @@ -1927,7 +1927,7 @@ drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count)  		if (!init_group(mgr, &mgr->groups[i])) {  			destroy_mgr(mgr); -			return NULL; +			return ERR_PTR(-ENOMEM);  		}  		mgr->group_count++; diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index c6af46dd02bf..241a384ebce3 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -207,6 +207,10 @@ void drm_bridge_add(struct drm_bridge *bridge)  {  	mutex_init(&bridge->hpd_mutex); +	if (bridge->ops & DRM_BRIDGE_OP_HDMI) +		bridge->ycbcr_420_allowed = !!(bridge->supported_formats & +					       BIT(HDMI_COLORSPACE_YUV420)); +  	mutex_lock(&bridge_lock);  	list_add_tail(&bridge->list, &bridge_list);  	mutex_unlock(&bridge_lock); diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index fc35f47e2849..ca7f43c8d6f1 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -507,6 +507,9 @@ int drmm_connector_hdmi_init(struct drm_device *dev,  	if (!supported_formats || !(supported_formats & BIT(HDMI_COLORSPACE_RGB)))  		return -EINVAL; +	if (connector->ycbcr_420_allowed != !!(supported_formats & BIT(HDMI_COLORSPACE_YUV420))) +		return -EINVAL; +  	if (!(max_bpc == 8 || max_bpc == 10 || max_bpc == 12))  		return -EINVAL; diff --git a/drivers/gpu/drm/drm_gem_dma_helper.c b/drivers/gpu/drm/drm_gem_dma_helper.c index 870b90b78bc4..16988d316a6d 100644 --- a/drivers/gpu/drm/drm_gem_dma_helper.c +++ b/drivers/gpu/drm/drm_gem_dma_helper.c @@ -600,5 +600,5 @@ drm_gem_dma_prime_import_sg_table_vmap(struct drm_device *dev,  EXPORT_SYMBOL(drm_gem_dma_prime_import_sg_table_vmap);  MODULE_DESCRIPTION("DRM DMA memory-management helpers"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  MODULE_LICENSE("GPL"); diff --git a/drivers/gpu/drm/drm_gem_framebuffer_helper.c b/drivers/gpu/drm/drm_gem_framebuffer_helper.c index 3bdb6ba37ff4..185534f56bab 100644 --- a/drivers/gpu/drm/drm_gem_framebuffer_helper.c +++ b/drivers/gpu/drm/drm_gem_framebuffer_helper.c @@ -18,7 +18,7 @@  #include "drm_internal.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  #define AFBC_HEADER_SIZE		16  #define AFBC_TH_LAYOUT_ALIGNMENT	8 diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c index 8508060a1a95..5ab351409312 100644 --- a/drivers/gpu/drm/drm_gem_shmem_helper.c +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c @@ -22,7 +22,7 @@  #include <drm/drm_prime.h>  #include <drm/drm_print.h> -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  /**   * DOC: overview @@ -800,5 +800,5 @@ drm_gem_shmem_prime_import_sg_table(struct drm_device *dev,  EXPORT_SYMBOL_GPL(drm_gem_shmem_prime_import_sg_table);  MODULE_DESCRIPTION("DRM SHMEM memory-management helpers"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 6ba167a33461..71573b85d924 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -1287,14 +1287,11 @@ EXPORT_SYMBOL(drm_mode_set_name);   */  int drm_mode_vrefresh(const struct drm_display_mode *mode)  { -	unsigned int num, den; +	unsigned int num = 1, den = 1;  	if (mode->htotal == 0 || mode->vtotal == 0)  		return 0; -	num = mode->clock; -	den = mode->htotal * mode->vtotal; -  	if (mode->flags & DRM_MODE_FLAG_INTERLACE)  		num *= 2;  	if (mode->flags & DRM_MODE_FLAG_DBLSCAN) @@ -1302,6 +1299,12 @@ int drm_mode_vrefresh(const struct drm_display_mode *mode)  	if (mode->vscan > 1)  		den *= mode->vscan; +	if (check_mul_overflow(mode->clock, num, &num)) +		return 0; + +	if (check_mul_overflow(mode->htotal * mode->vtotal, den, &den)) +		return 0; +  	return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(num, 1000), den);  }  EXPORT_SYMBOL(drm_mode_vrefresh); diff --git a/drivers/gpu/drm/drm_panic_qr.rs b/drivers/gpu/drm/drm_panic_qr.rs index 09500cddc009..ef2d490965ba 100644 --- a/drivers/gpu/drm/drm_panic_qr.rs +++ b/drivers/gpu/drm/drm_panic_qr.rs @@ -929,7 +929,6 @@ impl QrImage<'_> {  /// * `tmp` must be valid for reading and writing for `tmp_size` bytes.  ///  /// They must remain valid for the duration of the function call. -  #[no_mangle]  pub unsafe extern "C" fn drm_panic_qr_generate(      url: *const i8, diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index 0e3f8adf162f..32a8781cfd67 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -40,7 +40,7 @@  #include "drm_internal.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  /**   * DOC: overview and lifetime rules diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c index 9b4e2f4b1bc7..a46f9e4ac09a 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -669,7 +669,7 @@ static void etnaviv_pdev_remove(struct platform_device *pdev)  static struct platform_driver etnaviv_platform_driver = {  	.probe      = etnaviv_pdev_probe, -	.remove_new = etnaviv_pdev_remove, +	.remove     = etnaviv_pdev_remove,  	.driver     = {  		.name   = "etnaviv",  	}, diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c index 6b98200068e4..42e57d142554 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c @@ -10,7 +10,7 @@  #include "etnaviv_drv.h"  #include "etnaviv_gem.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  static struct lock_class_key etnaviv_prime_lock_class; diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c index c7d59c06ccd1..2d4c112ce033 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c @@ -1985,6 +1985,6 @@ struct platform_driver etnaviv_gpu_driver = {  		.of_match_table = etnaviv_gpu_match,  	},  	.probe = etnaviv_gpu_platform_probe, -	.remove_new = etnaviv_gpu_platform_remove, +	.remove = etnaviv_gpu_platform_remove,  	.id_table = gpu_ids,  }; diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c index 0ef7bc8848b0..b9e206303b48 100644 --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c @@ -871,7 +871,7 @@ static void exynos5433_decon_remove(struct platform_device *pdev)  struct platform_driver exynos5433_decon_driver = {  	.probe		= exynos5433_decon_probe, -	.remove_new	= exynos5433_decon_remove, +	.remove		= exynos5433_decon_remove,  	.driver		= {  		.name	= "exynos5433-decon",  		.pm	= pm_ptr(&exynos5433_decon_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c index c65364087fac..5170f72b0830 100644 --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c @@ -874,7 +874,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(exynos7_decon_pm_ops, exynos7_decon_suspend,  struct platform_driver decon_driver = {  	.probe		= decon_probe, -	.remove_new	= decon_remove, +	.remove		= decon_remove,  	.driver		= {  		.name	= "exynos-decon",  		.pm	= pm_ptr(&exynos7_decon_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c index 22142b293279..5bcf41e0bd04 100644 --- a/drivers/gpu/drm/exynos/exynos_dp.c +++ b/drivers/gpu/drm/exynos/exynos_dp.c @@ -279,7 +279,7 @@ MODULE_DEVICE_TABLE(of, exynos_dp_match);  struct platform_driver dp_driver = {  	.probe		= exynos_dp_probe, -	.remove_new	= exynos_dp_remove, +	.remove		= exynos_dp_remove,  	.driver		= {  		.name	= "exynos-dp",  		.pm	= pm_ptr(&exynos_dp_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 2a466d8179f4..1c44f85c5f54 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -363,7 +363,7 @@ static void exynos_drm_platform_shutdown(struct platform_device *pdev)  static struct platform_driver exynos_drm_platform_driver = {  	.probe	= exynos_drm_platform_probe, -	.remove_new	= exynos_drm_platform_remove, +	.remove		= exynos_drm_platform_remove,  	.shutdown = exynos_drm_platform_shutdown,  	.driver	= {  		.name	= "exynos-drm", diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index bf16deaae68b..896a03639e2d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c @@ -181,7 +181,7 @@ MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);  struct platform_driver dsi_driver = {  	.probe = samsung_dsim_probe, -	.remove_new = samsung_dsim_remove, +	.remove = samsung_dsim_remove,  	.driver = {  		   .name = "exynos-dsi",  		   .pm = &samsung_dsim_pm_ops, diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c index 4d7ea65b7dd8..b150cfd92f6e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c @@ -1408,7 +1408,7 @@ MODULE_DEVICE_TABLE(of, fimc_of_match);  struct platform_driver fimc_driver = {  	.probe		= fimc_probe, -	.remove_new	= fimc_remove, +	.remove		= fimc_remove,  	.driver		= {  		.of_match_table = fimc_of_match,  		.name	= "exynos-drm-fimc", diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index f57df8c48139..1ad87584b1c2 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -1323,7 +1323,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(exynos_fimd_pm_ops, exynos_fimd_suspend,  struct platform_driver fimd_driver = {  	.probe		= fimd_probe, -	.remove_new	= fimd_remove, +	.remove		= fimd_remove,  	.driver		= {  		.name	= "exynos4-fb",  		.pm	= pm_ptr(&exynos_fimd_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 3a3b2c00e400..d32f2474cbaa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c @@ -1607,7 +1607,7 @@ MODULE_DEVICE_TABLE(of, exynos_g2d_match);  struct platform_driver g2d_driver = {  	.probe		= g2d_probe, -	.remove_new	= g2d_remove, +	.remove		= g2d_remove,  	.driver		= {  		.name	= "exynos-drm-g2d",  		.pm	= pm_ptr(&g2d_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 638ca96830e9..4787fee4696f 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -18,7 +18,7 @@  #include "exynos_drm_drv.h"  #include "exynos_drm_gem.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  static int exynos_drm_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c index 1ae90ef1fc23..e6d516e1976d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c @@ -1420,7 +1420,7 @@ MODULE_DEVICE_TABLE(of, exynos_drm_gsc_of_match);  struct platform_driver gsc_driver = {  	.probe		= gsc_probe, -	.remove_new	= gsc_remove, +	.remove		= gsc_remove,  	.driver		= {  		.name	= "exynos-drm-gsc",  		.pm	= &gsc_pm_ops, diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c b/drivers/gpu/drm/exynos/exynos_drm_mic.c index d61ec451807c..b34ec6728337 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_mic.c +++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c @@ -460,7 +460,7 @@ MODULE_DEVICE_TABLE(of, exynos_mic_of_match);  struct platform_driver mic_driver = {  	.probe		= exynos_mic_probe, -	.remove_new	= exynos_mic_remove, +	.remove		= exynos_mic_remove,  	.driver		= {  		.name	= "exynos-mic",  		.pm	= pm_ptr(&exynos_mic_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c index 2eb0b701672f..7b0f4a98a70a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c @@ -451,7 +451,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(rotator_pm_ops, rotator_runtime_suspend,  struct platform_driver rotator_driver = {  	.probe		= rotator_probe, -	.remove_new	= rotator_remove, +	.remove		= rotator_remove,  	.driver		= {  		.name	= "exynos-rotator",  		.pm	= pm_ptr(&rotator_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_drm_scaler.c b/drivers/gpu/drm/exynos/exynos_drm_scaler.c index 2788105ac780..c8a1b6b0a29c 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_scaler.c +++ b/drivers/gpu/drm/exynos/exynos_drm_scaler.c @@ -719,7 +719,7 @@ MODULE_DEVICE_TABLE(of, exynos_scaler_match);  struct platform_driver scaler_driver = {  	.probe		= scaler_probe, -	.remove_new	= scaler_remove, +	.remove		= scaler_remove,  	.driver		= {  		.name	= "exynos-scaler",  		.pm	= pm_ptr(&scaler_pm_ops), diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 6de0cced6c9d..fd388b1dbe68 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -467,7 +467,7 @@ static void vidi_remove(struct platform_device *pdev)  struct platform_driver vidi_driver = {  	.probe		= vidi_probe, -	.remove_new	= vidi_remove, +	.remove		= vidi_remove,  	.driver		= {  		.name	= "exynos-drm-vidi",  		.dev_groups = vidi_groups, diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index c9d4b9146df9..466a9e514aa1 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -2126,7 +2126,7 @@ static const struct dev_pm_ops exynos_hdmi_pm_ops = {  struct platform_driver hdmi_driver = {  	.probe		= hdmi_probe, -	.remove_new	= hdmi_remove, +	.remove		= hdmi_remove,  	.driver		= {  		.name	= "exynos-hdmi",  		.pm	= &exynos_hdmi_pm_ops, diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 1db955f00044..a3670d2eaab2 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -1335,5 +1335,5 @@ struct platform_driver mixer_driver = {  		.of_match_table = mixer_match_types,  	},  	.probe = mixer_probe, -	.remove_new = mixer_remove, +	.remove = mixer_remove,  }; diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c index 91a48d774cf7..be1ab673e49e 100644 --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c @@ -378,7 +378,7 @@ static void fsl_dcu_drm_shutdown(struct platform_device *pdev)  static struct platform_driver fsl_dcu_drm_platform_driver = {  	.probe		= fsl_dcu_drm_probe, -	.remove_new	= fsl_dcu_drm_remove, +	.remove		= fsl_dcu_drm_remove,  	.shutdown	= fsl_dcu_drm_shutdown,  	.driver		= {  		.name	= "fsl-dcu", diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c index a39cc549c20b..2eea9fb0e76b 100644 --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c @@ -889,7 +889,7 @@ MODULE_DEVICE_TABLE(of, dsi_of_match);  static struct platform_driver dsi_driver = {  	.probe = dsi_probe, -	.remove_new = dsi_remove, +	.remove = dsi_remove,  	.driver = {  		.name = "dw-dsi",  		.of_match_table = dsi_of_match, diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c index 86a3a1faff49..b3ab944652a6 100644 --- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c @@ -302,7 +302,7 @@ MODULE_DEVICE_TABLE(of, kirin_drm_dt_ids);  static struct platform_driver kirin_drm_platform_driver = {  	.probe = kirin_drm_platform_probe, -	.remove_new = kirin_drm_platform_remove, +	.remove = kirin_drm_platform_remove,  	.shutdown = kirin_drm_platform_shutdown,  	.driver = {  		.name = "kirin-drm", diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c index 174753625bca..7cd902bbd244 100644 --- a/drivers/gpu/drm/i915/display/intel_color.c +++ b/drivers/gpu/drm/i915/display/intel_color.c @@ -1343,6 +1343,17 @@ static void ilk_lut_write(const struct intel_crtc_state *crtc_state,  		intel_de_write_fw(display, reg, val);  } +static void ilk_lut_write_indexed(const struct intel_crtc_state *crtc_state, +				  i915_reg_t reg, u32 val) +{ +	struct intel_display *display = to_intel_display(crtc_state); + +	if (crtc_state->dsb_color_vblank) +		intel_dsb_reg_write_indexed(crtc_state->dsb_color_vblank, reg, val); +	else +		intel_de_write_fw(display, reg, val); +} +  static void ilk_load_lut_8(const struct intel_crtc_state *crtc_state,  			   const struct drm_property_blob *blob)  { @@ -1357,19 +1368,29 @@ static void ilk_load_lut_8(const struct intel_crtc_state *crtc_state,  	lut = blob->data;  	/* -	 * DSB fails to correctly load the legacy LUT -	 * unless we either write each entry twice, -	 * or use non-posted writes +	 * DSB fails to correctly load the legacy LUT unless +	 * we either write each entry twice when using posted +	 * writes, or we use non-posted writes. +	 * +	 * If palette anti-collision is active during LUT +	 * register writes: +	 * - posted writes simply get dropped and thus the LUT +	 *   contents may not be correctly updated +	 * - non-posted writes are blocked and thus the LUT +	 *   contents are always correct, but simultaneous CPU +	 *   MMIO access will start to fail +	 * +	 * Choose the lesser of two evils and use posted writes. +	 * Using posted writes is also faster, even when having +	 * to write each register twice.  	 */ -	if (crtc_state->dsb_color_vblank) -		intel_dsb_nonpost_start(crtc_state->dsb_color_vblank); - -	for (i = 0; i < 256; i++) +	for (i = 0; i < 256; i++) {  		ilk_lut_write(crtc_state, LGC_PALETTE(pipe, i),  			      i9xx_lut_8(&lut[i])); - -	if (crtc_state->dsb_color_vblank) -		intel_dsb_nonpost_end(crtc_state->dsb_color_vblank); +		if (crtc_state->dsb_color_vblank) +			ilk_lut_write(crtc_state, LGC_PALETTE(pipe, i), +				      i9xx_lut_8(&lut[i])); +	}  }  static void ilk_load_lut_10(const struct intel_crtc_state *crtc_state, @@ -1458,8 +1479,8 @@ static void bdw_load_lut_10(const struct intel_crtc_state *crtc_state,  		      prec_index);  	for (i = 0; i < lut_size; i++) -		ilk_lut_write(crtc_state, PREC_PAL_DATA(pipe), -			      ilk_lut_10(&lut[i])); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_DATA(pipe), +				      ilk_lut_10(&lut[i]));  	/*  	 * Reset the index, otherwise it prevents the legacy palette to be @@ -1612,16 +1633,16 @@ static void glk_load_degamma_lut(const struct intel_crtc_state *crtc_state,  		 * ToDo: Extend to max 7.0. Enable 32 bit input value  		 * as compared to just 16 to achieve this.  		 */ -		ilk_lut_write(crtc_state, PRE_CSC_GAMC_DATA(pipe), -			      DISPLAY_VER(display) >= 14 ? -			      mtl_degamma_lut(&lut[i]) : glk_degamma_lut(&lut[i])); +		ilk_lut_write_indexed(crtc_state, PRE_CSC_GAMC_DATA(pipe), +				      DISPLAY_VER(display) >= 14 ? +				      mtl_degamma_lut(&lut[i]) : glk_degamma_lut(&lut[i]));  	}  	/* Clamp values > 1.0. */  	while (i++ < glk_degamma_lut_size(display)) -		ilk_lut_write(crtc_state, PRE_CSC_GAMC_DATA(pipe), -			      DISPLAY_VER(display) >= 14 ? -			      1 << 24 : 1 << 16); +		ilk_lut_write_indexed(crtc_state, PRE_CSC_GAMC_DATA(pipe), +				      DISPLAY_VER(display) >= 14 ? +				      1 << 24 : 1 << 16);  	ilk_lut_write(crtc_state, PRE_CSC_GAMC_INDEX(pipe), 0);  } @@ -1687,10 +1708,10 @@ icl_program_gamma_superfine_segment(const struct intel_crtc_state *crtc_state)  	for (i = 0; i < 9; i++) {  		const struct drm_color_lut *entry = &lut[i]; -		ilk_lut_write(crtc_state, PREC_PAL_MULTI_SEG_DATA(pipe), -			      ilk_lut_12p4_ldw(entry)); -		ilk_lut_write(crtc_state, PREC_PAL_MULTI_SEG_DATA(pipe), -			      ilk_lut_12p4_udw(entry)); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_MULTI_SEG_DATA(pipe), +				      ilk_lut_12p4_ldw(entry)); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_MULTI_SEG_DATA(pipe), +				      ilk_lut_12p4_udw(entry));  	}  	ilk_lut_write(crtc_state, PREC_PAL_MULTI_SEG_INDEX(pipe), @@ -1726,10 +1747,10 @@ icl_program_gamma_multi_segment(const struct intel_crtc_state *crtc_state)  	for (i = 1; i < 257; i++) {  		entry = &lut[i * 8]; -		ilk_lut_write(crtc_state, PREC_PAL_DATA(pipe), -			      ilk_lut_12p4_ldw(entry)); -		ilk_lut_write(crtc_state, PREC_PAL_DATA(pipe), -			      ilk_lut_12p4_udw(entry)); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_DATA(pipe), +				      ilk_lut_12p4_ldw(entry)); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_DATA(pipe), +				      ilk_lut_12p4_udw(entry));  	}  	/* @@ -1747,10 +1768,10 @@ icl_program_gamma_multi_segment(const struct intel_crtc_state *crtc_state)  	for (i = 0; i < 256; i++) {  		entry = &lut[i * 8 * 128]; -		ilk_lut_write(crtc_state, PREC_PAL_DATA(pipe), -			      ilk_lut_12p4_ldw(entry)); -		ilk_lut_write(crtc_state, PREC_PAL_DATA(pipe), -			      ilk_lut_12p4_udw(entry)); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_DATA(pipe), +				      ilk_lut_12p4_ldw(entry)); +		ilk_lut_write_indexed(crtc_state, PREC_PAL_DATA(pipe), +				      ilk_lut_12p4_udw(entry));  	}  	ilk_lut_write(crtc_state, PREC_PAL_INDEX(pipe), diff --git a/drivers/gpu/drm/i915/display/intel_cx0_phy.c b/drivers/gpu/drm/i915/display/intel_cx0_phy.c index 71dc659228ab..0c7aee13495a 100644 --- a/drivers/gpu/drm/i915/display/intel_cx0_phy.c +++ b/drivers/gpu/drm/i915/display/intel_cx0_phy.c @@ -2115,14 +2115,6 @@ static void intel_c10_pll_program(struct intel_display *display,  		      0, C10_VDR_CTRL_MSGBUS_ACCESS,  		      MB_WRITE_COMMITTED); -	/* Custom width needs to be programmed to 0 for both the phy lanes */ -	intel_cx0_rmw(encoder, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CUSTOM_WIDTH, -		      C10_VDR_CUSTOM_WIDTH_MASK, C10_VDR_CUSTOM_WIDTH_8_10, -		      MB_WRITE_COMMITTED); -	intel_cx0_rmw(encoder, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CONTROL(1), -		      0, C10_VDR_CTRL_UPDATE_CFG, -		      MB_WRITE_COMMITTED); -  	/* Program the pll values only for the master lane */  	for (i = 0; i < ARRAY_SIZE(pll_state->pll); i++)  		intel_cx0_write(encoder, INTEL_CX0_LANE0, PHY_C10_VDR_PLL(i), @@ -2132,6 +2124,10 @@ static void intel_c10_pll_program(struct intel_display *display,  	intel_cx0_write(encoder, INTEL_CX0_LANE0, PHY_C10_VDR_CMN(0), pll_state->cmn, MB_WRITE_COMMITTED);  	intel_cx0_write(encoder, INTEL_CX0_LANE0, PHY_C10_VDR_TX(0), pll_state->tx, MB_WRITE_COMMITTED); +	/* Custom width needs to be programmed to 0 for both the phy lanes */ +	intel_cx0_rmw(encoder, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CUSTOM_WIDTH, +		      C10_VDR_CUSTOM_WIDTH_MASK, C10_VDR_CUSTOM_WIDTH_8_10, +		      MB_WRITE_COMMITTED);  	intel_cx0_rmw(encoder, INTEL_CX0_LANE0, PHY_C10_VDR_CONTROL(1),  		      0, C10_VDR_CTRL_MASTER_LANE | C10_VDR_CTRL_UPDATE_CFG,  		      MB_WRITE_COMMITTED); diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c index b7b44399adaa..4d3785f5cb52 100644 --- a/drivers/gpu/drm/i915/display/intel_dsb.c +++ b/drivers/gpu/drm/i915/display/intel_dsb.c @@ -273,16 +273,20 @@ static bool intel_dsb_prev_ins_is_indexed_write(struct intel_dsb *dsb, i915_reg_  }  /** - * intel_dsb_reg_write() - Emit register wriite to the DSB context + * intel_dsb_reg_write_indexed() - Emit register wriite to the DSB context   * @dsb: DSB context   * @reg: register address.   * @val: value.   *   * This function is used for writing register-value pair in command   * buffer of DSB. + * + * Note that indexed writes are slower than normal MMIO writes + * for a small number (less than 5 or so) of writes to the same + * register.   */ -void intel_dsb_reg_write(struct intel_dsb *dsb, -			 i915_reg_t reg, u32 val) +void intel_dsb_reg_write_indexed(struct intel_dsb *dsb, +				 i915_reg_t reg, u32 val)  {  	/*  	 * For example the buffer will look like below for 3 dwords for auto @@ -340,6 +344,15 @@ void intel_dsb_reg_write(struct intel_dsb *dsb,  	}  } +void intel_dsb_reg_write(struct intel_dsb *dsb, +			 i915_reg_t reg, u32 val) +{ +	intel_dsb_emit(dsb, val, +		       (DSB_OPCODE_MMIO_WRITE << DSB_OPCODE_SHIFT) | +		       (DSB_BYTE_EN << DSB_BYTE_EN_SHIFT) | +		       i915_mmio_reg_offset(reg)); +} +  static u32 intel_dsb_mask_to_byte_en(u32 mask)  {  	return (!!(mask & 0xff000000) << 3 | diff --git a/drivers/gpu/drm/i915/display/intel_dsb.h b/drivers/gpu/drm/i915/display/intel_dsb.h index 33e0fc2ab380..da6df07a3c83 100644 --- a/drivers/gpu/drm/i915/display/intel_dsb.h +++ b/drivers/gpu/drm/i915/display/intel_dsb.h @@ -34,6 +34,8 @@ void intel_dsb_finish(struct intel_dsb *dsb);  void intel_dsb_cleanup(struct intel_dsb *dsb);  void intel_dsb_reg_write(struct intel_dsb *dsb,  			 i915_reg_t reg, u32 val); +void intel_dsb_reg_write_indexed(struct intel_dsb *dsb, +				 i915_reg_t reg, u32 val);  void intel_dsb_reg_write_masked(struct intel_dsb *dsb,  				i915_reg_t reg, u32 mask, u32 val);  void intel_dsb_noop(struct intel_dsb *dsb, int count); diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index 6a7060889f40..223c4218c019 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -1694,7 +1694,7 @@ int intel_fill_fb_info(struct drm_i915_private *i915, struct intel_framebuffer *  		 * arithmetic related to alignment and offset calculation.  		 */  		if (is_gen12_ccs_cc_plane(&fb->base, i)) { -			if (IS_ALIGNED(fb->base.offsets[i], PAGE_SIZE)) +			if (IS_ALIGNED(fb->base.offsets[i], 64))  				continue;  			else  				return -EINVAL; diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c index f57e4dba2873..8fee26d791f4 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c @@ -1158,9 +1158,15 @@ static int intel_hdcp_check_link(struct intel_connector *connector)  		goto out;  	} -	intel_hdcp_update_value(connector, -				DRM_MODE_CONTENT_PROTECTION_DESIRED, -				true); +	ret = intel_hdcp1_enable(connector); +	if (ret) { +		drm_err(display->drm, "Failed to enable hdcp (%d)\n", ret); +		intel_hdcp_update_value(connector, +					DRM_MODE_CONTENT_PROTECTION_DESIRED, +					true); +		goto out; +	} +  out:  	mutex_unlock(&dig_port->hdcp_mutex);  	mutex_unlock(&hdcp->mutex); diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c index 1df74f7aa3dc..9473050ac842 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c @@ -16,7 +16,7 @@  #include "i915_gem_object.h"  #include "i915_scatterlist.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  I915_SELFTEST_DECLARE(static bool force_different_devices;) diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h b/drivers/gpu/drm/i915/gt/intel_engine_types.h index ba55c059063d..fe1f85e5dda3 100644 --- a/drivers/gpu/drm/i915/gt/intel_engine_types.h +++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h @@ -343,6 +343,11 @@ struct intel_engine_guc_stats {  	 * @start_gt_clk: GT clock time of last idle to active transition.  	 */  	u64 start_gt_clk; + +	/** +	 * @total: The last value of total returned +	 */ +	u64 total;  };  union intel_engine_tlb_inv_reg { diff --git a/drivers/gpu/drm/i915/gt/intel_rc6.c b/drivers/gpu/drm/i915/gt/intel_rc6.c index c864d101faf9..9378d5901c49 100644 --- a/drivers/gpu/drm/i915/gt/intel_rc6.c +++ b/drivers/gpu/drm/i915/gt/intel_rc6.c @@ -133,7 +133,7 @@ static void gen11_rc6_enable(struct intel_rc6 *rc6)  			GEN9_MEDIA_PG_ENABLE |  			GEN11_MEDIA_SAMPLER_PG_ENABLE; -	if (GRAPHICS_VER(gt->i915) >= 12) { +	if (GRAPHICS_VER(gt->i915) >= 12 && !IS_DG1(gt->i915)) {  		for (i = 0; i < I915_MAX_VCS; i++)  			if (HAS_ENGINE(gt, _VCS(i)))  				pg_enable |= (VDN_HCP_POWERGATE_ENABLE(i) | diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c index 9ede6f240d79..c0bd730383f2 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c @@ -1243,6 +1243,21 @@ static void __get_engine_usage_record(struct intel_engine_cs *engine,  	} while (++i < 6);  } +static void __set_engine_usage_record(struct intel_engine_cs *engine, +				      u32 last_in, u32 id, u32 total) +{ +	struct iosys_map rec_map = intel_guc_engine_usage_record_map(engine); + +#define record_write(map_, field_, val_) \ +	iosys_map_wr_field(map_, 0, struct guc_engine_usage_record, field_, val_) + +	record_write(&rec_map, last_switch_in_stamp, last_in); +	record_write(&rec_map, current_context_index, id); +	record_write(&rec_map, total_runtime, total); + +#undef record_write +} +  static void guc_update_engine_gt_clks(struct intel_engine_cs *engine)  {  	struct intel_engine_guc_stats *stats = &engine->stats.guc; @@ -1363,9 +1378,12 @@ static ktime_t guc_engine_busyness(struct intel_engine_cs *engine, ktime_t *now)  		total += intel_gt_clock_interval_to_ns(gt, clk);  	} +	if (total > stats->total) +		stats->total = total; +  	spin_unlock_irqrestore(&guc->timestamp.lock, flags); -	return ns_to_ktime(total); +	return ns_to_ktime(stats->total);  }  static void guc_enable_busyness_worker(struct intel_guc *guc) @@ -1431,8 +1449,21 @@ static void __reset_guc_busyness_stats(struct intel_guc *guc)  	guc_update_pm_timestamp(guc, &unused);  	for_each_engine(engine, gt, id) { +		struct intel_engine_guc_stats *stats = &engine->stats.guc; +  		guc_update_engine_gt_clks(engine); -		engine->stats.guc.prev_total = 0; + +		/* +		 * If resetting a running context, accumulate the active +		 * time as well since there will be no context switch. +		 */ +		if (stats->running) { +			u64 clk = guc->timestamp.gt_stamp - stats->start_gt_clk; + +			stats->total_gt_clks += clk; +		} +		stats->prev_total = 0; +		stats->running = 0;  	}  	spin_unlock_irqrestore(&guc->timestamp.lock, flags); @@ -1543,6 +1574,9 @@ err_trylock:  static int guc_action_enable_usage_stats(struct intel_guc *guc)  { +	struct intel_gt *gt = guc_to_gt(guc); +	struct intel_engine_cs *engine; +	enum intel_engine_id id;  	u32 offset = intel_guc_engine_usage_offset(guc);  	u32 action[] = {  		INTEL_GUC_ACTION_SET_ENG_UTIL_BUFF, @@ -1550,6 +1584,9 @@ static int guc_action_enable_usage_stats(struct intel_guc *guc)  		0,  	}; +	for_each_engine(engine, gt, id) +		__set_engine_usage_record(engine, 0, 0xffffffff, 0); +  	return intel_guc_send(guc, action, ARRAY_SIZE(action));  } diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c index ca0fb126b02d..b27ff77bfb50 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -53,8 +53,8 @@  #include "intel_gvt.h"  #include "gvt.h" -MODULE_IMPORT_NS(DMA_BUF); -MODULE_IMPORT_NS(I915_GVT); +MODULE_IMPORT_NS("DMA_BUF"); +MODULE_IMPORT_NS("I915_GVT");  /* helper macros copied from vfio-pci */  #define VFIO_PCI_OFFSET_SHIFT   40 diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 4eb58887819a..71c0daef1996 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -1643,9 +1643,21 @@ capture_engine(struct intel_engine_cs *engine,  		return NULL;  	intel_engine_get_hung_entity(engine, &ce, &rq); -	if (rq && !i915_request_started(rq)) -		drm_info(&engine->gt->i915->drm, "Got hung context on %s with active request %lld:%lld [0x%04X] not yet started\n", -			 engine->name, rq->fence.context, rq->fence.seqno, ce->guc_id.id); +	if (rq && !i915_request_started(rq)) { +		/* +		 * We want to know also what is the guc_id of the context, +		 * but if we don't have the context reference, then skip +		 * printing it. +		 */ +		if (ce) +			drm_info(&engine->gt->i915->drm, +				 "Got hung context on %s with active request %lld:%lld [0x%04X] not yet started\n", +				 engine->name, rq->fence.context, rq->fence.seqno, ce->guc_id.id); +		else +			drm_info(&engine->gt->i915->drm, +				 "Got hung context on %s with active request %lld:%lld not yet started\n", +				 engine->name, rq->fence.context, rq->fence.seqno); +	}  	if (rq) {  		capture = intel_engine_coredump_add_request(ee, rq, ATOMIC_MAYFAIL); diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c index 762127dd56c5..70a854557e6e 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.c +++ b/drivers/gpu/drm/i915/i915_scheduler.c @@ -506,6 +506,6 @@ int __init i915_scheduler_module_init(void)  	return 0;  err_priorities: -	kmem_cache_destroy(slab_priorities); +	kmem_cache_destroy(slab_dependencies);  	return -ENOMEM;  } diff --git a/drivers/gpu/drm/i915/intel_gvt.c b/drivers/gpu/drm/i915/intel_gvt.c index 5a01d60e5186..a5383a2bc64b 100644 --- a/drivers/gpu/drm/i915/intel_gvt.c +++ b/drivers/gpu/drm/i915/intel_gvt.c @@ -204,7 +204,7 @@ int intel_gvt_set_ops(const struct intel_vgpu_ops *ops)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(intel_gvt_set_ops, I915_GVT); +EXPORT_SYMBOL_NS_GPL(intel_gvt_set_ops, "I915_GVT");  void intel_gvt_clear_ops(const struct intel_vgpu_ops *ops)  { @@ -222,7 +222,7 @@ void intel_gvt_clear_ops(const struct intel_vgpu_ops *ops)  	intel_gvt_ops = NULL;  	mutex_unlock(&intel_gvt_mutex);  } -EXPORT_SYMBOL_NS_GPL(intel_gvt_clear_ops, I915_GVT); +EXPORT_SYMBOL_NS_GPL(intel_gvt_clear_ops, "I915_GVT");  /**   * intel_gvt_init - initialize GVT components @@ -284,40 +284,40 @@ void intel_gvt_resume(struct drm_i915_private *dev_priv)   * Exported here so that the exports only get created when GVT support is   * actually enabled.   */ -EXPORT_SYMBOL_NS_GPL(i915_gem_object_alloc, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_object_create_shmem, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_object_init, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_object_ggtt_pin_ww, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_object_pin_map, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_object_set_to_cpu_domain, I915_GVT); -EXPORT_SYMBOL_NS_GPL(__i915_gem_object_flush_map, I915_GVT); -EXPORT_SYMBOL_NS_GPL(__i915_gem_object_set_pages, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_gtt_insert, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_prime_export, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_init, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_backoff, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_fini, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_ppgtt_create, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_request_add, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_request_create, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_request_wait, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_reserve_fence, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_unreserve_fence, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_vm_release, I915_GVT); -EXPORT_SYMBOL_NS_GPL(_i915_vma_move_to_active, I915_GVT); -EXPORT_SYMBOL_NS_GPL(intel_context_create, I915_GVT); -EXPORT_SYMBOL_NS_GPL(__intel_context_do_pin, I915_GVT); -EXPORT_SYMBOL_NS_GPL(__intel_context_do_unpin, I915_GVT); -EXPORT_SYMBOL_NS_GPL(intel_ring_begin, I915_GVT); -EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_get, I915_GVT); +EXPORT_SYMBOL_NS_GPL(i915_gem_object_alloc, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_object_create_shmem, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_object_init, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_object_ggtt_pin_ww, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_object_pin_map, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_object_set_to_cpu_domain, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(__i915_gem_object_flush_map, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(__i915_gem_object_set_pages, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_gtt_insert, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_prime_export, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_init, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_backoff, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_gem_ww_ctx_fini, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_ppgtt_create, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_request_add, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_request_create, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_request_wait, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_reserve_fence, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_unreserve_fence, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_vm_release, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(_i915_vma_move_to_active, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(intel_context_create, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(__intel_context_do_pin, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(__intel_context_do_unpin, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(intel_ring_begin, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_get, "I915_GVT");  #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) -EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_put, I915_GVT); +EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_put, "I915_GVT");  #endif -EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_put_unchecked, I915_GVT); -EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_for_reg, I915_GVT); -EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_get, I915_GVT); -EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_put, I915_GVT); -EXPORT_SYMBOL_NS_GPL(shmem_pin_map, I915_GVT); -EXPORT_SYMBOL_NS_GPL(shmem_unpin_map, I915_GVT); -EXPORT_SYMBOL_NS_GPL(__px_dma, I915_GVT); -EXPORT_SYMBOL_NS_GPL(i915_fence_ops, I915_GVT); +EXPORT_SYMBOL_NS_GPL(intel_runtime_pm_put_unchecked, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_for_reg, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_get, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(intel_uncore_forcewake_put, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(shmem_pin_map, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(shmem_unpin_map, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(__px_dma, "I915_GVT"); +EXPORT_SYMBOL_NS_GPL(i915_fence_ops, "I915_GVT"); diff --git a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c index 955c9a33212a..aa51f366626c 100644 --- a/drivers/gpu/drm/i915/intel_gvt_mmio_table.c +++ b/drivers/gpu/drm/i915/intel_gvt_mmio_table.c @@ -1308,4 +1308,4 @@ int intel_gvt_iterate_mmio_table(struct intel_gvt_mmio_table_iter *iter)  err:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(intel_gvt_iterate_mmio_table, I915_GVT); +EXPORT_SYMBOL_NS_GPL(intel_gvt_iterate_mmio_table, "I915_GVT"); diff --git a/drivers/gpu/drm/imagination/pvr_drv.c b/drivers/gpu/drm/imagination/pvr_drv.c index 36c0e768698e..85ee9abd1811 100644 --- a/drivers/gpu/drm/imagination/pvr_drv.c +++ b/drivers/gpu/drm/imagination/pvr_drv.c @@ -1485,7 +1485,7 @@ static const struct dev_pm_ops pvr_pm_ops = {  static struct platform_driver pvr_driver = {  	.probe = pvr_probe, -	.remove_new = pvr_remove, +	.remove = pvr_remove,  	.driver = {  		.name = PVR_DRIVER_NAME,  		.pm = &pvr_pm_ops, @@ -1497,5 +1497,5 @@ module_platform_driver(pvr_driver);  MODULE_AUTHOR("Imagination Technologies Ltd.");  MODULE_DESCRIPTION(PVR_DRIVER_DESC);  MODULE_LICENSE("Dual MIT/GPL"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  MODULE_FIRMWARE("powervr/rogue_33.15.11.3_v1.fw"); diff --git a/drivers/gpu/drm/imx/dcss/dcss-drv.c b/drivers/gpu/drm/imx/dcss/dcss-drv.c index d881f5a34760..19b027cc1dc4 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-drv.c +++ b/drivers/gpu/drm/imx/dcss/dcss-drv.c @@ -112,7 +112,7 @@ MODULE_DEVICE_TABLE(of, dcss_of_match);  static struct platform_driver dcss_platform_driver = {  	.probe	= dcss_drv_platform_probe, -	.remove_new = dcss_drv_platform_remove, +	.remove = dcss_drv_platform_remove,  	.shutdown = dcss_drv_platform_shutdown,  	.driver	= {  		.name = "imx-dcss", diff --git a/drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c b/drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c index 0006ea52b83c..8333c4bf7369 100644 --- a/drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c +++ b/drivers/gpu/drm/imx/ipuv3/dw_hdmi-imx.c @@ -265,7 +265,7 @@ static void dw_hdmi_imx_remove(struct platform_device *pdev)  static struct platform_driver dw_hdmi_imx_platform_driver = {  	.probe  = dw_hdmi_imx_probe, -	.remove_new = dw_hdmi_imx_remove, +	.remove = dw_hdmi_imx_remove,  	.driver = {  		.name = "dwhdmi-imx",  		.of_match_table = dw_hdmi_imx_dt_ids, diff --git a/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c b/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c index ced06bd8eae8..5f2c93c3c288 100644 --- a/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c +++ b/drivers/gpu/drm/imx/ipuv3/imx-drm-core.c @@ -325,7 +325,7 @@ MODULE_DEVICE_TABLE(of, imx_drm_dt_ids);  static struct platform_driver imx_drm_pdrv = {  	.probe		= imx_drm_platform_probe, -	.remove_new	= imx_drm_platform_remove, +	.remove		= imx_drm_platform_remove,  	.shutdown	= imx_drm_platform_shutdown,  	.driver		= {  		.name	= "imx-drm", diff --git a/drivers/gpu/drm/imx/ipuv3/imx-ldb.c b/drivers/gpu/drm/imx/ipuv3/imx-ldb.c index ff74018ac5cd..6be7a57ad03d 100644 --- a/drivers/gpu/drm/imx/ipuv3/imx-ldb.c +++ b/drivers/gpu/drm/imx/ipuv3/imx-ldb.c @@ -632,7 +632,7 @@ static void imx_ldb_remove(struct platform_device *pdev)  static struct platform_driver imx_ldb_driver = {  	.probe		= imx_ldb_probe, -	.remove_new	= imx_ldb_remove, +	.remove		= imx_ldb_remove,  	.driver		= {  		.of_match_table = imx_ldb_dt_ids,  		.name	= DRIVER_NAME, diff --git a/drivers/gpu/drm/imx/ipuv3/imx-tve.c b/drivers/gpu/drm/imx/ipuv3/imx-tve.c index d46d07d25f51..3a3c8a195119 100644 --- a/drivers/gpu/drm/imx/ipuv3/imx-tve.c +++ b/drivers/gpu/drm/imx/ipuv3/imx-tve.c @@ -662,7 +662,7 @@ MODULE_DEVICE_TABLE(of, imx_tve_dt_ids);  static struct platform_driver imx_tve_driver = {  	.probe		= imx_tve_probe, -	.remove_new	= imx_tve_remove, +	.remove		= imx_tve_remove,  	.driver		= {  		.of_match_table = imx_tve_dt_ids,  		.name	= "imx-tve", diff --git a/drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c index 99db53e167bd..cf7b02b2d52c 100644 --- a/drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c +++ b/drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c @@ -449,5 +449,5 @@ struct platform_driver ipu_drm_driver = {  		.name = "imx-ipuv3-crtc",  	},  	.probe = ipu_drm_probe, -	.remove_new = ipu_drm_remove, +	.remove = ipu_drm_remove,  }; diff --git a/drivers/gpu/drm/imx/ipuv3/parallel-display.c b/drivers/gpu/drm/imx/ipuv3/parallel-display.c index 70f62e89622e..9e66eb77b1eb 100644 --- a/drivers/gpu/drm/imx/ipuv3/parallel-display.c +++ b/drivers/gpu/drm/imx/ipuv3/parallel-display.c @@ -273,7 +273,7 @@ MODULE_DEVICE_TABLE(of, imx_pd_dt_ids);  static struct platform_driver imx_pd_driver = {  	.probe		= imx_pd_probe, -	.remove_new	= imx_pd_remove, +	.remove		= imx_pd_remove,  	.driver		= {  		.of_match_table = imx_pd_dt_ids,  		.name	= "imx-parallel-display", diff --git a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c index 3215c4acd675..fa7d44623c52 100644 --- a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c +++ b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c @@ -527,7 +527,7 @@ static struct platform_driver imx_lcdc_driver = {  		.of_match_table = imx_lcdc_of_dev_id,  	},  	.probe = imx_lcdc_probe, -	.remove_new = imx_lcdc_remove, +	.remove = imx_lcdc_remove,  	.shutdown = imx_lcdc_shutdown,  };  module_platform_driver(imx_lcdc_driver); diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c index 056b70b63554..8469e1e5e582 100644 --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c @@ -1632,7 +1632,7 @@ static struct platform_driver ingenic_drm_driver = {  		.of_match_table = of_match_ptr(ingenic_drm_of_match),  	},  	.probe = ingenic_drm_probe, -	.remove_new = ingenic_drm_remove, +	.remove = ingenic_drm_remove,  	.shutdown = ingenic_drm_shutdown,  }; diff --git a/drivers/gpu/drm/ingenic/ingenic-ipu.c b/drivers/gpu/drm/ingenic/ingenic-ipu.c index 5bd9072352b5..26ebf424d63e 100644 --- a/drivers/gpu/drm/ingenic/ingenic-ipu.c +++ b/drivers/gpu/drm/ingenic/ingenic-ipu.c @@ -991,7 +991,7 @@ static struct platform_driver ingenic_ipu_driver = {  		.of_match_table = ingenic_ipu_of_match,  	},  	.probe = ingenic_ipu_probe, -	.remove_new = ingenic_ipu_remove, +	.remove = ingenic_ipu_remove,  };  struct platform_driver *ingenic_ipu_driver_ptr = &ingenic_ipu_driver; diff --git a/drivers/gpu/drm/kmb/kmb_drv.c b/drivers/gpu/drm/kmb/kmb_drv.c index 0274ab9caa85..a3d31de761cb 100644 --- a/drivers/gpu/drm/kmb/kmb_drv.c +++ b/drivers/gpu/drm/kmb/kmb_drv.c @@ -622,7 +622,7 @@ static SIMPLE_DEV_PM_OPS(kmb_pm_ops, kmb_pm_suspend, kmb_pm_resume);  static struct platform_driver kmb_platform_driver = {  	.probe = kmb_probe, -	.remove_new = kmb_remove, +	.remove = kmb_remove,  	.driver = {  		.name = "kmb-drm",  		.pm = &kmb_pm_ops, diff --git a/drivers/gpu/drm/lima/lima_drv.c b/drivers/gpu/drm/lima/lima_drv.c index 10bce18b7c31..fb3062c872b3 100644 --- a/drivers/gpu/drm/lima/lima_drv.c +++ b/drivers/gpu/drm/lima/lima_drv.c @@ -488,7 +488,7 @@ static const struct dev_pm_ops lima_pm_ops = {  static struct platform_driver lima_platform_driver = {  	.probe      = lima_pdev_probe, -	.remove_new = lima_pdev_remove, +	.remove     = lima_pdev_remove,  	.driver     = {  		.name   = "lima",  		.pm	= &lima_pm_ops, diff --git a/drivers/gpu/drm/logicvc/logicvc_drm.c b/drivers/gpu/drm/logicvc/logicvc_drm.c index e4d90701b29d..fb9de5e0bc0e 100644 --- a/drivers/gpu/drm/logicvc/logicvc_drm.c +++ b/drivers/gpu/drm/logicvc/logicvc_drm.c @@ -491,7 +491,7 @@ MODULE_DEVICE_TABLE(of, logicvc_drm_of_table);  static struct platform_driver logicvc_drm_platform_driver = {  	.probe		= logicvc_drm_probe, -	.remove_new	= logicvc_drm_remove, +	.remove		= logicvc_drm_remove,  	.shutdown	= logicvc_drm_shutdown,  	.driver		= {  		.name		= "logicvc-drm", diff --git a/drivers/gpu/drm/mcde/mcde_drv.c b/drivers/gpu/drm/mcde/mcde_drv.c index f60bdd7b6c13..c4d51f5f038d 100644 --- a/drivers/gpu/drm/mcde/mcde_drv.c +++ b/drivers/gpu/drm/mcde/mcde_drv.c @@ -483,7 +483,7 @@ static struct platform_driver mcde_driver = {  		.of_match_table = mcde_of_match,  	},  	.probe = mcde_probe, -	.remove_new = mcde_remove, +	.remove = mcde_remove,  	.shutdown = mcde_shutdown,  }; diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c index e2fad1a048b5..395449a72f0a 100644 --- a/drivers/gpu/drm/mcde/mcde_dsi.c +++ b/drivers/gpu/drm/mcde/mcde_dsi.c @@ -1229,5 +1229,5 @@ struct platform_driver mcde_dsi_driver = {  		.of_match_table = mcde_dsi_of_match,  	},  	.probe = mcde_dsi_probe, -	.remove_new = mcde_dsi_remove, +	.remove = mcde_dsi_remove,  }; diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig index f496e6cfdfe0..e47debd60619 100644 --- a/drivers/gpu/drm/mediatek/Kconfig +++ b/drivers/gpu/drm/mediatek/Kconfig @@ -14,9 +14,6 @@ config DRM_MEDIATEK  	select DRM_BRIDGE_CONNECTOR  	select DRM_MIPI_DSI  	select DRM_PANEL -	select MEMORY -	select MTK_SMI -	select PHY_MTK_MIPI_DSI  	select VIDEOMODE_HELPERS  	help  	  Choose this option if you have a Mediatek SoCs. @@ -27,7 +24,6 @@ config DRM_MEDIATEK  config DRM_MEDIATEK_DP  	tristate "DRM DPTX Support for MediaTek SoCs"  	depends on DRM_MEDIATEK -	select PHY_MTK_DP  	select DRM_DISPLAY_HELPER  	select DRM_DISPLAY_DP_HELPER  	select DRM_DISPLAY_DP_AUX_BUS @@ -38,6 +34,5 @@ config DRM_MEDIATEK_HDMI  	tristate "DRM HDMI Support for Mediatek SoCs"  	depends on DRM_MEDIATEK  	select SND_SOC_HDMI_CODEC if SND_SOC -	select PHY_MTK_HDMI  	help  	  DRM/KMS HDMI driver for Mediatek SoCs diff --git a/drivers/gpu/drm/mediatek/mtk_cec.c b/drivers/gpu/drm/mediatek/mtk_cec.c index 2de248443147..b42c0d87eba3 100644 --- a/drivers/gpu/drm/mediatek/mtk_cec.c +++ b/drivers/gpu/drm/mediatek/mtk_cec.c @@ -241,7 +241,7 @@ MODULE_DEVICE_TABLE(of, mtk_cec_of_ids);  struct platform_driver mtk_cec_driver = {  	.probe = mtk_cec_probe, -	.remove_new = mtk_cec_remove, +	.remove = mtk_cec_remove,  	.driver = {  		.name = "mediatek-cec",  		.of_match_table = mtk_cec_of_ids, diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c index eb0e1233ad04..5674f5707cca 100644 --- a/drivers/gpu/drm/mediatek/mtk_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_crtc.c @@ -112,6 +112,11 @@ static void mtk_drm_finish_page_flip(struct mtk_crtc *mtk_crtc)  	drm_crtc_handle_vblank(&mtk_crtc->base); +#if IS_REACHABLE(CONFIG_MTK_CMDQ) +	if (mtk_crtc->cmdq_client.chan) +		return; +#endif +  	spin_lock_irqsave(&mtk_crtc->config_lock, flags);  	if (!mtk_crtc->config_updating && mtk_crtc->pending_needs_vblank) {  		mtk_crtc_finish_page_flip(mtk_crtc); @@ -284,10 +289,8 @@ static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg)  	state = to_mtk_crtc_state(mtk_crtc->base.state);  	spin_lock_irqsave(&mtk_crtc->config_lock, flags); -	if (mtk_crtc->config_updating) { -		spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); +	if (mtk_crtc->config_updating)  		goto ddp_cmdq_cb_out; -	}  	state->pending_config = false; @@ -315,10 +318,15 @@ static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg)  		mtk_crtc->pending_async_planes = false;  	} -	spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); -  ddp_cmdq_cb_out: +	if (mtk_crtc->pending_needs_vblank) { +		mtk_crtc_finish_page_flip(mtk_crtc); +		mtk_crtc->pending_needs_vblank = false; +	} + +	spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); +  	mtk_crtc->cmdq_vblank_cnt = 0;  	wake_up(&mtk_crtc->cb_blocking_queue);  } @@ -606,13 +614,18 @@ static void mtk_crtc_update_config(struct mtk_crtc *mtk_crtc, bool needs_vblank)  		 */  		mtk_crtc->cmdq_vblank_cnt = 3; +		spin_lock_irqsave(&mtk_crtc->config_lock, flags); +		mtk_crtc->config_updating = false; +		spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); +  		mbox_send_message(mtk_crtc->cmdq_client.chan, cmdq_handle);  		mbox_client_txdone(mtk_crtc->cmdq_client.chan, 0);  	} -#endif +#else  	spin_lock_irqsave(&mtk_crtc->config_lock, flags);  	mtk_crtc->config_updating = false;  	spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); +#endif  	mutex_unlock(&mtk_crtc->hw_lock);  } diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c b/drivers/gpu/drm/mediatek/mtk_disp_aal.c index 59fb9a08d54b..abc9e5525d03 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c @@ -218,7 +218,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_aal_driver_dt_match);  struct platform_driver mtk_disp_aal_driver = {  	.probe		= mtk_disp_aal_probe, -	.remove_new	= mtk_disp_aal_remove, +	.remove		= mtk_disp_aal_remove,  	.driver		= {  		.name	= "mediatek-disp-aal",  		.of_match_table = mtk_disp_aal_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c b/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c index 9b75727e0861..10d60d2c2a56 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c @@ -209,7 +209,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_ccorr_driver_dt_match);  struct platform_driver mtk_disp_ccorr_driver = {  	.probe		= mtk_disp_ccorr_probe, -	.remove_new	= mtk_disp_ccorr_remove, +	.remove		= mtk_disp_ccorr_remove,  	.driver		= {  		.name	= "mediatek-disp-ccorr",  		.of_match_table = mtk_disp_ccorr_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_color.c b/drivers/gpu/drm/mediatek/mtk_disp_color.c index 2fd5e7dc9e24..dd8433a38282 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_color.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_color.c @@ -159,7 +159,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_color_driver_dt_match);  struct platform_driver mtk_disp_color_driver = {  	.probe		= mtk_disp_color_probe, -	.remove_new	= mtk_disp_color_remove, +	.remove		= mtk_disp_color_remove,  	.driver		= {  		.name	= "mediatek-disp-color",  		.of_match_table = mtk_disp_color_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c index f0b38817ba6c..b17b11d93846 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c @@ -329,7 +329,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);  struct platform_driver mtk_disp_gamma_driver = {  	.probe		= mtk_disp_gamma_probe, -	.remove_new	= mtk_disp_gamma_remove, +	.remove		= mtk_disp_gamma_remove,  	.driver		= {  		.name	= "mediatek-disp-gamma",  		.of_match_table = mtk_disp_gamma_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c index 435e5d9c8520..563b1b248fbb 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c @@ -370,7 +370,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_merge_driver_dt_match);  struct platform_driver mtk_disp_merge_driver = {  	.probe = mtk_disp_merge_probe, -	.remove_new = mtk_disp_merge_remove, +	.remove = mtk_disp_merge_remove,  	.driver = {  		.name = "mediatek-disp-merge",  		.of_match_table = mtk_disp_merge_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c index e0c0bb01f65a..df82cea4bb79 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c @@ -460,6 +460,29 @@ static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,  	}  } +static void mtk_ovl_afbc_layer_config(struct mtk_disp_ovl *ovl, +				      unsigned int idx, +				      struct mtk_plane_pending_state *pending, +				      struct cmdq_pkt *cmdq_pkt) +{ +	unsigned int pitch_msb = pending->pitch >> 16; +	unsigned int hdr_pitch = pending->hdr_pitch; +	unsigned int hdr_addr = pending->hdr_addr; + +	if (pending->modifier != DRM_FORMAT_MOD_LINEAR) { +		mtk_ddp_write_relaxed(cmdq_pkt, hdr_addr, &ovl->cmdq_reg, ovl->regs, +				      DISP_REG_OVL_HDR_ADDR(ovl, idx)); +		mtk_ddp_write_relaxed(cmdq_pkt, +				      OVL_PITCH_MSB_2ND_SUBBUF | pitch_msb, +				      &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_PITCH_MSB(idx)); +		mtk_ddp_write_relaxed(cmdq_pkt, hdr_pitch, &ovl->cmdq_reg, ovl->regs, +				      DISP_REG_OVL_HDR_PITCH(ovl, idx)); +	} else { +		mtk_ddp_write_relaxed(cmdq_pkt, pitch_msb, +				      &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_PITCH_MSB(idx)); +	} +} +  void mtk_ovl_layer_config(struct device *dev, unsigned int idx,  			  struct mtk_plane_state *state,  			  struct cmdq_pkt *cmdq_pkt) @@ -467,25 +490,14 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,  	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);  	struct mtk_plane_pending_state *pending = &state->pending;  	unsigned int addr = pending->addr; -	unsigned int hdr_addr = pending->hdr_addr; -	unsigned int pitch = pending->pitch; -	unsigned int hdr_pitch = pending->hdr_pitch; +	unsigned int pitch_lsb = pending->pitch & GENMASK(15, 0);  	unsigned int fmt = pending->format; +	unsigned int rotation = pending->rotation;  	unsigned int offset = (pending->y << 16) | pending->x;  	unsigned int src_size = (pending->height << 16) | pending->width;  	unsigned int blend_mode = state->base.pixel_blend_mode;  	unsigned int ignore_pixel_alpha = 0;  	unsigned int con; -	bool is_afbc = pending->modifier != DRM_FORMAT_MOD_LINEAR; -	union overlay_pitch { -		struct split_pitch { -			u16 lsb; -			u16 msb; -		} split_pitch; -		u32 pitch; -	} overlay_pitch; - -	overlay_pitch.pitch = pitch;  	if (!pending->enable) {  		mtk_ovl_layer_off(dev, idx, cmdq_pkt); @@ -513,22 +525,30 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,  			ignore_pixel_alpha = OVL_CONST_BLEND;  	} -	if (pending->rotation & DRM_MODE_REFLECT_Y) { +	/* +	 * Treat rotate 180 as flip x + flip y, and XOR the original rotation value +	 * to flip x + flip y to support both in the same time. +	 */ +	if (rotation & DRM_MODE_ROTATE_180) +		rotation ^= DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y; + +	if (rotation & DRM_MODE_REFLECT_Y) {  		con |= OVL_CON_VIRT_FLIP;  		addr += (pending->height - 1) * pending->pitch;  	} -	if (pending->rotation & DRM_MODE_REFLECT_X) { +	if (rotation & DRM_MODE_REFLECT_X) {  		con |= OVL_CON_HORZ_FLIP;  		addr += pending->pitch - 1;  	}  	if (ovl->data->supports_afbc) -		mtk_ovl_set_afbc(ovl, cmdq_pkt, idx, is_afbc); +		mtk_ovl_set_afbc(ovl, cmdq_pkt, idx, +				 pending->modifier != DRM_FORMAT_MOD_LINEAR);  	mtk_ddp_write_relaxed(cmdq_pkt, con, &ovl->cmdq_reg, ovl->regs,  			      DISP_REG_OVL_CON(idx)); -	mtk_ddp_write_relaxed(cmdq_pkt, overlay_pitch.split_pitch.lsb | ignore_pixel_alpha, +	mtk_ddp_write_relaxed(cmdq_pkt, pitch_lsb | ignore_pixel_alpha,  			      &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_PITCH(idx));  	mtk_ddp_write_relaxed(cmdq_pkt, src_size, &ovl->cmdq_reg, ovl->regs,  			      DISP_REG_OVL_SRC_SIZE(idx)); @@ -537,19 +557,8 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,  	mtk_ddp_write_relaxed(cmdq_pkt, addr, &ovl->cmdq_reg, ovl->regs,  			      DISP_REG_OVL_ADDR(ovl, idx)); -	if (is_afbc) { -		mtk_ddp_write_relaxed(cmdq_pkt, hdr_addr, &ovl->cmdq_reg, ovl->regs, -				      DISP_REG_OVL_HDR_ADDR(ovl, idx)); -		mtk_ddp_write_relaxed(cmdq_pkt, -				      OVL_PITCH_MSB_2ND_SUBBUF | overlay_pitch.split_pitch.msb, -				      &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_PITCH_MSB(idx)); -		mtk_ddp_write_relaxed(cmdq_pkt, hdr_pitch, &ovl->cmdq_reg, ovl->regs, -				      DISP_REG_OVL_HDR_PITCH(ovl, idx)); -	} else { -		mtk_ddp_write_relaxed(cmdq_pkt, -				      overlay_pitch.split_pitch.msb, -				      &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_PITCH_MSB(idx)); -	} +	if (ovl->data->supports_afbc) +		mtk_ovl_afbc_layer_config(ovl, idx, pending, cmdq_pkt);  	mtk_ovl_set_bit_depth(dev, idx, fmt, cmdq_pkt);  	mtk_ovl_layer_on(dev, idx, cmdq_pkt); @@ -746,7 +755,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_ovl_driver_dt_match);  struct platform_driver mtk_disp_ovl_driver = {  	.probe		= mtk_disp_ovl_probe, -	.remove_new	= mtk_disp_ovl_remove, +	.remove		= mtk_disp_ovl_remove,  	.driver		= {  		.name	= "mediatek-disp-ovl",  		.of_match_table = mtk_disp_ovl_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c index 187855d83590..fa0e95dd29a0 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c @@ -665,7 +665,7 @@ static void mtk_disp_ovl_adaptor_remove(struct platform_device *pdev)  struct platform_driver mtk_disp_ovl_adaptor_driver = {  	.probe		= mtk_disp_ovl_adaptor_probe, -	.remove_new	= mtk_disp_ovl_adaptor_remove, +	.remove		= mtk_disp_ovl_adaptor_remove,  	.driver		= {  		.name	= "mediatek-disp-ovl-adaptor",  	}, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c index 07243f372260..bf47790e4d6b 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c @@ -417,7 +417,7 @@ MODULE_DEVICE_TABLE(of, mtk_disp_rdma_driver_dt_match);  struct platform_driver mtk_disp_rdma_driver = {  	.probe		= mtk_disp_rdma_probe, -	.remove_new	= mtk_disp_rdma_remove, +	.remove		= mtk_disp_rdma_remove,  	.driver		= {  		.name	= "mediatek-disp-rdma",  		.of_match_table = mtk_disp_rdma_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c index 1cc916b16471..3b0993abfdc3 100644 --- a/drivers/gpu/drm/mediatek/mtk_dp.c +++ b/drivers/gpu/drm/mediatek/mtk_dp.c @@ -543,18 +543,16 @@ static int mtk_dp_set_color_format(struct mtk_dp *mtk_dp,  				   enum dp_pixelformat color_format)  {  	u32 val; - -	/* update MISC0 */ -	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3034, -			   color_format << DP_TEST_COLOR_FORMAT_SHIFT, -			   DP_TEST_COLOR_FORMAT_MASK); +	u32 misc0_color;  	switch (color_format) {  	case DP_PIXELFORMAT_YUV422:  		val = PIXEL_ENCODE_FORMAT_DP_ENC0_P0_YCBCR422; +		misc0_color = DP_COLOR_FORMAT_YCbCr422;  		break;  	case DP_PIXELFORMAT_RGB:  		val = PIXEL_ENCODE_FORMAT_DP_ENC0_P0_RGB; +		misc0_color = DP_COLOR_FORMAT_RGB;  		break;  	default:  		drm_warn(mtk_dp->drm_dev, "Unsupported color format: %d\n", @@ -562,6 +560,11 @@ static int mtk_dp_set_color_format(struct mtk_dp *mtk_dp,  		return -EINVAL;  	} +	/* update MISC0 */ +	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3034, +			   misc0_color, +			   DP_TEST_COLOR_FORMAT_MASK); +  	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_303C,  			   val, PIXEL_ENCODE_FORMAT_DP_ENC0_P0_MASK);  	return 0; @@ -2100,7 +2103,6 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)  	struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);  	enum drm_connector_status ret = connector_status_disconnected;  	bool enabled = mtk_dp->enabled; -	u8 sink_count = 0;  	if (!mtk_dp->train_info.cable_plugged_in)  		return ret; @@ -2115,8 +2117,8 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)  	 * function, we just need to check the HPD connection to check  	 * whether we connect to a sink device.  	 */ -	drm_dp_dpcd_readb(&mtk_dp->aux, DP_SINK_COUNT, &sink_count); -	if (DP_GET_SINK_COUNT(sink_count)) + +	if (drm_dp_read_sink_count(&mtk_dp->aux) > 0)  		ret = connector_status_connected;  	if (!enabled) @@ -2408,12 +2410,19 @@ mtk_dp_bridge_mode_valid(struct drm_bridge *bridge,  {  	struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);  	u32 bpp = info->color_formats & DRM_COLOR_FORMAT_YCBCR422 ? 16 : 24; -	u32 rate = min_t(u32, drm_dp_max_link_rate(mtk_dp->rx_cap) * -			      drm_dp_max_lane_count(mtk_dp->rx_cap), -			 drm_dp_bw_code_to_link_rate(mtk_dp->max_linkrate) * -			 mtk_dp->max_lanes); +	u32 lane_count_min = mtk_dp->train_info.lane_count; +	u32 rate = drm_dp_bw_code_to_link_rate(mtk_dp->train_info.link_rate) * +		   lane_count_min; -	if (rate < mode->clock * bpp / 8) +	/* +	 *FEC overhead is approximately 2.4% from DP 1.4a spec 2.2.1.4.2. +	 *The down-spread amplitude shall either be disabled (0.0%) or up +	 *to 0.5% from 1.4a 3.5.2.6. Add up to approximately 3% total overhead. +	 * +	 *Because rate is already divided by 10, +	 *mode->clock does not need to be multiplied by 10 +	 */ +	if ((rate * 97 / 100) < (mode->clock * bpp / 8))  		return MODE_CLOCK_HIGH;  	return MODE_OK; @@ -2454,10 +2463,9 @@ static u32 *mtk_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,  	struct drm_display_mode *mode = &crtc_state->adjusted_mode;  	struct drm_display_info *display_info =  		&conn_state->connector->display_info; -	u32 rate = min_t(u32, drm_dp_max_link_rate(mtk_dp->rx_cap) * -			      drm_dp_max_lane_count(mtk_dp->rx_cap), -			 drm_dp_bw_code_to_link_rate(mtk_dp->max_linkrate) * -			 mtk_dp->max_lanes); +	u32 lane_count_min = mtk_dp->train_info.lane_count; +	u32 rate = drm_dp_bw_code_to_link_rate(mtk_dp->train_info.link_rate) * +		   lane_count_min;  	*num_input_fmts = 0; @@ -2466,8 +2474,8 @@ static u32 *mtk_dp_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,  	 * datarate of YUV422 and sink device supports YUV422, we output YUV422  	 * format. Use this condition, we can support more resolution.  	 */ -	if ((rate < (mode->clock * 24 / 8)) && -	    (rate > (mode->clock * 16 / 8)) && +	if (((rate * 97 / 100) < (mode->clock * 24 / 8)) && +	    ((rate * 97 / 100) > (mode->clock * 16 / 8)) &&  	    (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)) {  		input_fmts = kcalloc(1, sizeof(*input_fmts), GFP_KERNEL);  		if (!input_fmts) @@ -2899,7 +2907,7 @@ MODULE_DEVICE_TABLE(of, mtk_dp_of_match);  static struct platform_driver mtk_dp_driver = {  	.probe = mtk_dp_probe, -	.remove_new = mtk_dp_remove, +	.remove = mtk_dp_remove,  	.driver = {  		.name = "mediatek-drm-dp",  		.of_match_table = mtk_dp_of_match, diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c index 20a9d589fd75..1864eb02dbf5 100644 --- a/drivers/gpu/drm/mediatek/mtk_dpi.c +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c @@ -1108,7 +1108,7 @@ MODULE_DEVICE_TABLE(of, mtk_dpi_of_ids);  struct platform_driver mtk_dpi_driver = {  	.probe = mtk_dpi_probe, -	.remove_new = mtk_dpi_remove, +	.remove = mtk_dpi_remove,  	.driver = {  		.name = "mediatek-dpi",  		.of_match_table = mtk_dpi_of_ids, diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c index 9a8ef8558da9..b037616d3342 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c @@ -373,11 +373,12 @@ static bool mtk_drm_get_all_drm_priv(struct device *dev)  	struct mtk_drm_private *temp_drm_priv;  	struct device_node *phandle = dev->parent->of_node;  	const struct of_device_id *of_id; +	struct device_node *node;  	struct device *drm_dev;  	unsigned int cnt = 0;  	int i, j; -	for_each_child_of_node_scoped(phandle->parent, node) { +	for_each_child_of_node(phandle->parent, node) {  		struct platform_device *pdev;  		of_id = of_match_node(mtk_drm_of_ids, node); @@ -406,8 +407,10 @@ static bool mtk_drm_get_all_drm_priv(struct device *dev)  		if (temp_drm_priv->mtk_drm_bound)  			cnt++; -		if (cnt == MAX_CRTC) +		if (cnt == MAX_CRTC) { +			of_node_put(node);  			break; +		}  	}  	if (drm_priv->data->mmsys_dev_num == cnt) { @@ -673,6 +676,8 @@ err_deinit:  err_free:  	private->drm = NULL;  	drm_dev_put(drm); +	for (i = 0; i < private->data->mmsys_dev_num; i++) +		private->all_drm_private[i]->drm = NULL;  	return ret;  } @@ -900,7 +905,7 @@ static int mtk_drm_of_ddp_path_build_one(struct device *dev, enum mtk_crtc_path  					 const unsigned int **out_path,  					 unsigned int *out_path_len)  { -	struct device_node *next, *prev, *vdo = dev->parent->of_node; +	struct device_node *next = NULL, *prev, *vdo = dev->parent->of_node;  	unsigned int temp_path[DDP_COMPONENT_DRM_ID_MAX] = { 0 };  	unsigned int *final_ddp_path;  	unsigned short int idx = 0; @@ -1089,7 +1094,7 @@ static int mtk_drm_probe(struct platform_device *pdev)  		/* No devicetree graphs support: go with hardcoded paths if present */  		dev_dbg(dev, "Using hardcoded paths for MMSYS %u\n", mtk_drm_data->mmsys_id);  		private->data = mtk_drm_data; -	}; +	}  	private->all_drm_private = devm_kmalloc_array(dev, private->data->mmsys_dev_num,  						      sizeof(*private->all_drm_private), @@ -1251,7 +1256,7 @@ static const struct dev_pm_ops mtk_drm_pm_ops = {  static struct platform_driver mtk_drm_platform_driver = {  	.probe	= mtk_drm_probe, -	.remove_new = mtk_drm_remove, +	.remove = mtk_drm_remove,  	.shutdown = mtk_drm_shutdown,  	.driver	= {  		.name	= "mediatek-drm", diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c index 33ceeb8d6925..40752f232054 100644 --- a/drivers/gpu/drm/mediatek/mtk_dsi.c +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c @@ -139,11 +139,11 @@  #define CLK_HS_POST			GENMASK(15, 8)  #define CLK_HS_EXIT			GENMASK(23, 16) -#define DSI_VM_CMD_CON		0x130 +/* DSI_VM_CMD_CON */  #define VM_CMD_EN			BIT(0)  #define TS_VFP_EN			BIT(5) -#define DSI_SHADOW_DEBUG	0x190U +/* DSI_SHADOW_DEBUG */  #define FORCE_COMMIT			BIT(0)  #define BYPASS_SHADOW			BIT(1) @@ -187,6 +187,8 @@ struct phy;  struct mtk_dsi_driver_data {  	const u32 reg_cmdq_off; +	const u32 reg_vm_cmd_off; +	const u32 reg_shadow_dbg_off;  	bool has_shadow_ctl;  	bool has_size_ctl;  	bool cmdq_long_packet_ctl; @@ -246,23 +248,22 @@ static void mtk_dsi_phy_timconfig(struct mtk_dsi *dsi)  	u32 data_rate_mhz = DIV_ROUND_UP(dsi->data_rate, HZ_PER_MHZ);  	struct mtk_phy_timing *timing = &dsi->phy_timing; -	timing->lpx = (80 * data_rate_mhz / (8 * 1000)) + 1; -	timing->da_hs_prepare = (59 * data_rate_mhz + 4 * 1000) / 8000 + 1; -	timing->da_hs_zero = (163 * data_rate_mhz + 11 * 1000) / 8000 + 1 - +	timing->lpx = (60 * data_rate_mhz / (8 * 1000)) + 1; +	timing->da_hs_prepare = (80 * data_rate_mhz + 4 * 1000) / 8000; +	timing->da_hs_zero = (170 * data_rate_mhz + 10 * 1000) / 8000 + 1 -  			     timing->da_hs_prepare; -	timing->da_hs_trail = (78 * data_rate_mhz + 7 * 1000) / 8000 + 1; +	timing->da_hs_trail = timing->da_hs_prepare + 1; -	timing->ta_go = 4 * timing->lpx; -	timing->ta_sure = 3 * timing->lpx / 2; -	timing->ta_get = 5 * timing->lpx; -	timing->da_hs_exit = (118 * data_rate_mhz / (8 * 1000)) + 1; +	timing->ta_go = 4 * timing->lpx - 2; +	timing->ta_sure = timing->lpx + 2; +	timing->ta_get = 4 * timing->lpx; +	timing->da_hs_exit = 2 * timing->lpx + 1; -	timing->clk_hs_prepare = (57 * data_rate_mhz / (8 * 1000)) + 1; -	timing->clk_hs_post = (65 * data_rate_mhz + 53 * 1000) / 8000 + 1; -	timing->clk_hs_trail = (78 * data_rate_mhz + 7 * 1000) / 8000 + 1; -	timing->clk_hs_zero = (330 * data_rate_mhz / (8 * 1000)) + 1 - -			      timing->clk_hs_prepare; -	timing->clk_hs_exit = (118 * data_rate_mhz / (8 * 1000)) + 1; +	timing->clk_hs_prepare = 70 * data_rate_mhz / (8 * 1000); +	timing->clk_hs_post = timing->clk_hs_prepare + 8; +	timing->clk_hs_trail = timing->clk_hs_prepare; +	timing->clk_hs_zero = timing->clk_hs_trail * 4; +	timing->clk_hs_exit = 2 * timing->clk_hs_trail;  	timcon0 = FIELD_PREP(LPX, timing->lpx) |  		  FIELD_PREP(HS_PREP, timing->da_hs_prepare) | @@ -367,8 +368,8 @@ static void mtk_dsi_set_mode(struct mtk_dsi *dsi)  static void mtk_dsi_set_vm_cmd(struct mtk_dsi *dsi)  { -	mtk_dsi_mask(dsi, DSI_VM_CMD_CON, VM_CMD_EN, VM_CMD_EN); -	mtk_dsi_mask(dsi, DSI_VM_CMD_CON, TS_VFP_EN, TS_VFP_EN); +	mtk_dsi_mask(dsi, dsi->driver_data->reg_vm_cmd_off, VM_CMD_EN, VM_CMD_EN); +	mtk_dsi_mask(dsi, dsi->driver_data->reg_vm_cmd_off, TS_VFP_EN, TS_VFP_EN);  }  static void mtk_dsi_rxtx_control(struct mtk_dsi *dsi) @@ -714,7 +715,7 @@ static int mtk_dsi_poweron(struct mtk_dsi *dsi)  	if (dsi->driver_data->has_shadow_ctl)  		writel(FORCE_COMMIT | BYPASS_SHADOW, -		       dsi->regs + DSI_SHADOW_DEBUG); +		       dsi->regs + dsi->driver_data->reg_shadow_dbg_off);  	mtk_dsi_reset_engine(dsi);  	mtk_dsi_phy_timconfig(dsi); @@ -1263,26 +1264,36 @@ static void mtk_dsi_remove(struct platform_device *pdev)  static const struct mtk_dsi_driver_data mt8173_dsi_driver_data = {  	.reg_cmdq_off = 0x200, +	.reg_vm_cmd_off = 0x130, +	.reg_shadow_dbg_off = 0x190  };  static const struct mtk_dsi_driver_data mt2701_dsi_driver_data = {  	.reg_cmdq_off = 0x180, +	.reg_vm_cmd_off = 0x130, +	.reg_shadow_dbg_off = 0x190  };  static const struct mtk_dsi_driver_data mt8183_dsi_driver_data = {  	.reg_cmdq_off = 0x200, +	.reg_vm_cmd_off = 0x130, +	.reg_shadow_dbg_off = 0x190,  	.has_shadow_ctl = true,  	.has_size_ctl = true,  };  static const struct mtk_dsi_driver_data mt8186_dsi_driver_data = {  	.reg_cmdq_off = 0xd00, +	.reg_vm_cmd_off = 0x200, +	.reg_shadow_dbg_off = 0xc00,  	.has_shadow_ctl = true,  	.has_size_ctl = true,  };  static const struct mtk_dsi_driver_data mt8188_dsi_driver_data = {  	.reg_cmdq_off = 0xd00, +	.reg_vm_cmd_off = 0x200, +	.reg_shadow_dbg_off = 0xc00,  	.has_shadow_ctl = true,  	.has_size_ctl = true,  	.cmdq_long_packet_ctl = true, @@ -1301,7 +1312,7 @@ MODULE_DEVICE_TABLE(of, mtk_dsi_of_match);  struct platform_driver mtk_dsi_driver = {  	.probe = mtk_dsi_probe, -	.remove_new = mtk_dsi_remove, +	.remove = mtk_dsi_remove,  	.driver = {  		.name = "mtk-dsi",  		.of_match_table = mtk_dsi_of_match, diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c index 0f22e7d337cb..96832d0cca37 100644 --- a/drivers/gpu/drm/mediatek/mtk_ethdr.c +++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c @@ -388,7 +388,7 @@ MODULE_DEVICE_TABLE(of, mtk_ethdr_driver_dt_match);  struct platform_driver mtk_ethdr_driver = {  	.probe		= mtk_ethdr_probe, -	.remove_new	= mtk_ethdr_remove, +	.remove		= mtk_ethdr_remove,  	.driver		= {  		.name	= "mediatek-disp-ethdr",  		.of_match_table = mtk_ethdr_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c index 7687f673964e..70dc1d4460ad 100644 --- a/drivers/gpu/drm/mediatek/mtk_hdmi.c +++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c @@ -1795,7 +1795,7 @@ MODULE_DEVICE_TABLE(of, mtk_hdmi_of_ids);  static struct platform_driver mtk_hdmi_driver = {  	.probe = mtk_hdmi_probe, -	.remove_new = mtk_hdmi_remove, +	.remove = mtk_hdmi_remove,  	.driver = {  		.name = "mediatek-drm-hdmi",  		.of_match_table = mtk_hdmi_of_ids, diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_ddc.c b/drivers/gpu/drm/mediatek/mtk_hdmi_ddc.c index 8e60631d4cd2..07db68067844 100644 --- a/drivers/gpu/drm/mediatek/mtk_hdmi_ddc.c +++ b/drivers/gpu/drm/mediatek/mtk_hdmi_ddc.c @@ -331,7 +331,7 @@ MODULE_DEVICE_TABLE(of, mtk_hdmi_ddc_match);  struct platform_driver mtk_hdmi_ddc_driver = {  	.probe = mtk_hdmi_ddc_probe, -	.remove_new = mtk_hdmi_ddc_remove, +	.remove = mtk_hdmi_ddc_remove,  	.driver = {  		.name = "mediatek-hdmi-ddc",  		.of_match_table = mtk_hdmi_ddc_match, diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c index 7c1a8c796833..fc69ee38ce7d 100644 --- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c +++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c @@ -341,7 +341,7 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_rdma_driver_dt_match);  struct platform_driver mtk_mdp_rdma_driver = {  	.probe = mtk_mdp_rdma_probe, -	.remove_new = mtk_mdp_rdma_remove, +	.remove = mtk_mdp_rdma_remove,  	.driver = {  		.name = "mediatek-mdp-rdma",  		.of_match_table = mtk_mdp_rdma_driver_dt_match, diff --git a/drivers/gpu/drm/mediatek/mtk_padding.c b/drivers/gpu/drm/mediatek/mtk_padding.c index 4bebd13a07bd..b4e3e5a3428b 100644 --- a/drivers/gpu/drm/mediatek/mtk_padding.c +++ b/drivers/gpu/drm/mediatek/mtk_padding.c @@ -146,7 +146,7 @@ MODULE_DEVICE_TABLE(of, mtk_padding_driver_dt_match);  struct platform_driver mtk_padding_driver = {  	.probe		= mtk_padding_probe, -	.remove_new	= mtk_padding_remove, +	.remove		= mtk_padding_remove,  	.driver		= {  		.name	= "mediatek-disp-padding",  		.of_match_table = mtk_padding_driver_dt_match, diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c index 7cace75a38af..0f5a1a54544e 100644 --- a/drivers/gpu/drm/meson/meson_drv.c +++ b/drivers/gpu/drm/meson/meson_drv.c @@ -559,7 +559,7 @@ static const struct dev_pm_ops meson_drv_pm_ops = {  static struct platform_driver meson_drm_platform_driver = {  	.probe      = meson_drv_probe, -	.remove_new = meson_drv_remove, +	.remove     = meson_drv_remove,  	.shutdown   = meson_drv_shutdown,  	.driver     = {  		.name	= "meson-drm", diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c index b75db829b1da..0d7c68b29dff 100644 --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c @@ -856,7 +856,7 @@ MODULE_DEVICE_TABLE(of, meson_dw_hdmi_of_table);  static struct platform_driver meson_dw_hdmi_platform_driver = {  	.probe		= meson_dw_hdmi_probe, -	.remove_new	= meson_dw_hdmi_remove, +	.remove		= meson_dw_hdmi_remove,  	.driver		= {  		.name		= DRIVER_NAME,  		.of_match_table	= meson_dw_hdmi_of_table, diff --git a/drivers/gpu/drm/meson/meson_dw_mipi_dsi.c b/drivers/gpu/drm/meson/meson_dw_mipi_dsi.c index a10cff3ca1fe..66c73c512b0e 100644 --- a/drivers/gpu/drm/meson/meson_dw_mipi_dsi.c +++ b/drivers/gpu/drm/meson/meson_dw_mipi_dsi.c @@ -345,7 +345,7 @@ MODULE_DEVICE_TABLE(of, meson_dw_mipi_dsi_of_table);  static struct platform_driver meson_dw_mipi_dsi_platform_driver = {  	.probe		= meson_dw_mipi_dsi_probe, -	.remove_new	= meson_dw_mipi_dsi_remove, +	.remove		= meson_dw_mipi_dsi_remove,  	.driver		= {  		.name		= DRIVER_NAME,  		.of_match_table	= meson_dw_mipi_dsi_of_table, diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c index 9ffe91920fbf..236b25c094cd 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_device.c +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c @@ -393,7 +393,7 @@ static const struct dev_pm_ops adreno_pm_ops = {  static struct platform_driver adreno_driver = {  	.probe = adreno_probe, -	.remove_new = adreno_remove, +	.remove = adreno_remove,  	.shutdown = adreno_shutdown,  	.driver = {  		.name = "adreno", diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index ca4847b2b738..8b251f87a052 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -1494,7 +1494,7 @@ MODULE_DEVICE_TABLE(of, dpu_dt_match);  static struct platform_driver dpu_driver = {  	.probe = dpu_dev_probe, -	.remove_new = dpu_dev_remove, +	.remove = dpu_dev_remove,  	.shutdown = msm_kms_shutdown,  	.driver = {  		.name = "msm_dpu", diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c index 6e4e74f9d63d..c469e66cfc11 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c @@ -568,7 +568,7 @@ MODULE_DEVICE_TABLE(of, mdp4_dt_match);  static struct platform_driver mdp4_platform_driver = {  	.probe      = mdp4_probe, -	.remove_new = mdp4_remove, +	.remove     = mdp4_remove,  	.shutdown   = msm_kms_shutdown,  	.driver     = {  		.name   = "mdp4", diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c index 374704cce656..3fcca7a3d82e 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c @@ -908,7 +908,7 @@ MODULE_DEVICE_TABLE(of, mdp5_dt_match);  static struct platform_driver mdp5_driver = {  	.probe = mdp5_dev_probe, -	.remove_new = mdp5_dev_remove, +	.remove = mdp5_dev_remove,  	.shutdown = msm_kms_shutdown,  	.driver = {  		.name = "msm_mdp", diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index aba925aab7ad..aff51bb973eb 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -1397,7 +1397,7 @@ static const struct dev_pm_ops msm_dp_pm_ops = {  static struct platform_driver msm_dp_display_driver = {  	.probe  = msm_dp_display_probe, -	.remove_new = msm_dp_display_remove, +	.remove = msm_dp_display_remove,  	.driver = {  		.name = "msm-dp-display",  		.of_match_table = msm_dp_dt_match, diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c index efd7c23b662f..296215877613 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.c +++ b/drivers/gpu/drm/msm/dsi/dsi.c @@ -207,7 +207,7 @@ static const struct dev_pm_ops dsi_pm_ops = {  static struct platform_driver dsi_driver = {  	.probe = dsi_dev_probe, -	.remove_new = dsi_dev_remove, +	.remove = dsi_dev_remove,  	.driver = {  		.name = "msm_dsi",  		.of_match_table = dt_match, diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c index 0bfee41c2e71..37b3809c6bdd 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -561,7 +561,7 @@ static const struct of_device_id msm_hdmi_dt_match[] = {  static struct platform_driver msm_hdmi_driver = {  	.probe = msm_hdmi_dev_probe, -	.remove_new = msm_hdmi_dev_remove, +	.remove = msm_hdmi_dev_remove,  	.driver = {  		.name = "hdmi_msm",  		.of_match_table = msm_hdmi_dt_match, diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_phy.c b/drivers/gpu/drm/msm/hdmi/hdmi_phy.c index 95b3f7535d84..03120c54ced6 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_phy.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_phy.c @@ -203,7 +203,7 @@ static const struct of_device_id msm_hdmi_phy_dt_match[] = {  static struct platform_driver msm_hdmi_phy_platform_driver = {  	.probe      = msm_hdmi_phy_probe, -	.remove_new = msm_hdmi_phy_remove, +	.remove     = msm_hdmi_phy_remove,  	.driver     = {  		.name   = "msm_hdmi_phy",  		.of_match_table = msm_hdmi_phy_dt_match, diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index c2dd8ef6d6dc..ffbcc97b5018 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -1111,7 +1111,7 @@ static void msm_pdev_remove(struct platform_device *pdev)  static struct platform_driver msm_platform_driver = {  	.probe      = msm_pdev_probe, -	.remove_new = msm_pdev_remove, +	.remove     = msm_pdev_remove,  	.driver     = {  		.name   = "msm",  	}, diff --git a/drivers/gpu/drm/msm/msm_mdss.c b/drivers/gpu/drm/msm/msm_mdss.c index b7bd899ead44..76b6ae35a3cb 100644 --- a/drivers/gpu/drm/msm/msm_mdss.c +++ b/drivers/gpu/drm/msm/msm_mdss.c @@ -740,7 +740,7 @@ MODULE_DEVICE_TABLE(of, mdss_dt_match);  static struct platform_driver mdss_platform_driver = {  	.probe      = mdss_probe, -	.remove_new = mdss_remove, +	.remove     = mdss_remove,  	.driver     = {  		.name   = "msm-mdss",  		.of_match_table = mdss_dt_match, diff --git a/drivers/gpu/drm/mxsfb/lcdif_drv.c b/drivers/gpu/drm/mxsfb/lcdif_drv.c index 58ccad9c425d..51ae0b51b1e8 100644 --- a/drivers/gpu/drm/mxsfb/lcdif_drv.c +++ b/drivers/gpu/drm/mxsfb/lcdif_drv.c @@ -368,7 +368,7 @@ static const struct dev_pm_ops lcdif_pm_ops = {  static struct platform_driver lcdif_platform_driver = {  	.probe		= lcdif_probe, -	.remove_new	= lcdif_remove, +	.remove		= lcdif_remove,  	.shutdown	= lcdif_shutdown,  	.driver	= {  		.name		= "imx-lcdif", diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c index 34a98717b72c..6b95e4eb3e4e 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c @@ -417,7 +417,7 @@ static const struct dev_pm_ops mxsfb_pm_ops = {  static struct platform_driver mxsfb_platform_driver = {  	.probe		= mxsfb_probe, -	.remove_new	= mxsfb_remove, +	.remove		= mxsfb_remove,  	.shutdown	= mxsfb_shutdown,  	.driver	= {  		.name		= "mxsfb", diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c index 8f0c69aad248..21b56cc7605c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c @@ -384,7 +384,7 @@ nouveau_acpi_edid(struct drm_device *dev, struct drm_connector *connector)  	if (ret < 0)  		return NULL; -	return kmemdup(edid, EDID_LENGTH, GFP_KERNEL); +	return edid;  }  bool nouveau_acpi_video_backlight_use_native(void) diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index 09686d038d60..7cc84472cece 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c @@ -387,11 +387,13 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan,  			if (f) {  				struct nouveau_channel *prev;  				bool must_wait = true; +				bool local;  				rcu_read_lock();  				prev = rcu_dereference(f->channel); -				if (prev && (prev == chan || -					     fctx->sync(f, prev, chan) == 0)) +				local = prev && prev->cli->drm == chan->cli->drm; +				if (local && (prev == chan || +					      fctx->sync(f, prev, chan) == 0))  					must_wait = false;  				rcu_read_unlock();  				if (!must_wait) diff --git a/drivers/gpu/drm/nouveau/nouveau_platform.c b/drivers/gpu/drm/nouveau/nouveau_platform.c index 829fdc6e4031..a5ce8eb4a3be 100644 --- a/drivers/gpu/drm/nouveau/nouveau_platform.c +++ b/drivers/gpu/drm/nouveau/nouveau_platform.c @@ -86,5 +86,5 @@ struct platform_driver nouveau_platform_driver = {  		.of_match_table = of_match_ptr(nouveau_platform_match),  	},  	.probe = nouveau_platform_probe, -	.remove_new = nouveau_platform_remove, +	.remove = nouveau_platform_remove,  }; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.c index 841e3b69fcaf..5a0c9b8a79f3 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.c @@ -31,6 +31,7 @@ mcp77_sor = {  	.state = g94_sor_state,  	.power = nv50_sor_power,  	.clock = nv50_sor_clock, +	.bl = &nv50_sor_bl,  	.hdmi = &g84_sor_hdmi,  	.dp = &g94_sor_dp,  }; diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c index 9344855c4887..533f70e8a4a6 100644 --- a/drivers/gpu/drm/omapdrm/dss/dispc.c +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c @@ -4766,7 +4766,7 @@ static const struct dev_pm_ops dispc_pm_ops = {  struct platform_driver omap_dispchw_driver = {  	.probe		= dispc_probe, -	.remove_new     = dispc_remove, +	.remove		= dispc_remove,  	.driver         = {  		.name   = "omapdss_dispc",  		.pm	= &dispc_pm_ops, diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c index ea63c64d3a1a..59d20eb8a7e0 100644 --- a/drivers/gpu/drm/omapdrm/dss/dsi.c +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c @@ -5093,7 +5093,7 @@ static const struct dev_pm_ops dsi_pm_ops = {  struct platform_driver omap_dsihw_driver = {  	.probe		= dsi_probe, -	.remove_new	= dsi_remove, +	.remove		= dsi_remove,  	.driver         = {  		.name   = "omapdss_dsi",  		.pm	= &dsi_pm_ops, diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c index 988888e164d7..7b2df3185de4 100644 --- a/drivers/gpu/drm/omapdrm/dss/dss.c +++ b/drivers/gpu/drm/omapdrm/dss/dss.c @@ -1606,7 +1606,7 @@ static const struct dev_pm_ops dss_pm_ops = {  struct platform_driver omap_dsshw_driver = {  	.probe		= dss_probe, -	.remove_new	= dss_remove, +	.remove		= dss_remove,  	.shutdown	= dss_shutdown,  	.driver         = {  		.name   = "omapdss_dss", diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c index 9b8747d83ee8..4435f0027c78 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c @@ -852,7 +852,7 @@ static const struct of_device_id hdmi_of_match[] = {  struct platform_driver omapdss_hdmi4hw_driver = {  	.probe		= hdmi4_probe, -	.remove_new	= hdmi4_remove, +	.remove		= hdmi4_remove,  	.driver         = {  		.name   = "omapdss_hdmi",  		.of_match_table = hdmi_of_match, diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c index c7ae2235ae99..a8c740df3146 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c @@ -819,7 +819,7 @@ static const struct of_device_id hdmi_of_match[] = {  struct platform_driver omapdss_hdmi5hw_driver = {  	.probe		= hdmi5_probe, -	.remove_new	= hdmi5_remove, +	.remove		= hdmi5_remove,  	.driver         = {  		.name   = "omapdss_hdmi5",  		.of_match_table = hdmi_of_match, diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c index f163d52a7c7d..aaeef603682c 100644 --- a/drivers/gpu/drm/omapdrm/dss/venc.c +++ b/drivers/gpu/drm/omapdrm/dss/venc.c @@ -912,7 +912,7 @@ static const struct of_device_id venc_of_match[] = {  struct platform_driver omap_venchw_driver = {  	.probe		= venc_probe, -	.remove_new	= venc_remove, +	.remove		= venc_remove,  	.driver         = {  		.name   = "omapdss_venc",  		.pm	= &venc_pm_ops, diff --git a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c index fcd600024136..3fff32c000a6 100644 --- a/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c +++ b/drivers/gpu/drm/omapdrm/omap_dmm_tiler.c @@ -1210,7 +1210,7 @@ static const struct of_device_id dmm_of_match[] = {  struct platform_driver omap_dmm_driver = {  	.probe = omap_dmm_probe, -	.remove_new = omap_dmm_remove, +	.remove = omap_dmm_remove,  	.driver = {  		.name = DMM_DRIVER_NAME,  		.of_match_table = of_match_ptr(dmm_of_match), diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 1796cd20a877..e27376121606 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -857,7 +857,7 @@ static struct platform_driver pdev = {  		.pm = &omapdrm_pm_ops,  	},  	.probe = pdev_probe, -	.remove_new = pdev_remove, +	.remove = pdev_remove,  	.shutdown = pdev_shutdown,  }; diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c index 36f9ee4baad3..30cf1cdc1aa3 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c +++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c @@ -11,7 +11,7 @@  #include "omap_drv.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  /* -----------------------------------------------------------------------------   * DMABUF Export diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c index 8566e9cf2f82..94a46241dece 100644 --- a/drivers/gpu/drm/panel/panel-edp.c +++ b/drivers/gpu/drm/panel/panel-edp.c @@ -2049,7 +2049,7 @@ static struct platform_driver panel_edp_platform_driver = {  		.pm = &panel_edp_pm_ops,  	},  	.probe = panel_edp_platform_probe, -	.remove_new = panel_edp_platform_remove, +	.remove = panel_edp_platform_remove,  	.shutdown = panel_edp_platform_shutdown,  }; diff --git a/drivers/gpu/drm/panel/panel-himax-hx83102.c b/drivers/gpu/drm/panel/panel-himax-hx83102.c index 8b48bba18131..3644a7544b93 100644 --- a/drivers/gpu/drm/panel/panel-himax-hx83102.c +++ b/drivers/gpu/drm/panel/panel-himax-hx83102.c @@ -565,6 +565,8 @@ static int hx83102_get_modes(struct drm_panel *panel,  	struct drm_display_mode *mode;  	mode = drm_mode_duplicate(connector->dev, m); +	if (!mode) +		return -ENOMEM;  	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;  	drm_mode_set_name(mode); diff --git a/drivers/gpu/drm/panel/panel-lvds.c b/drivers/gpu/drm/panel/panel-lvds.c index 1b8e3156914c..ba6c015aabba 100644 --- a/drivers/gpu/drm/panel/panel-lvds.c +++ b/drivers/gpu/drm/panel/panel-lvds.c @@ -246,7 +246,7 @@ MODULE_DEVICE_TABLE(of, panel_lvds_of_table);  static struct platform_driver panel_lvds_driver = {  	.probe		= panel_lvds_probe, -	.remove_new	= panel_lvds_remove, +	.remove		= panel_lvds_remove,  	.driver		= {  		.name	= "panel-lvds",  		.of_match_table = panel_lvds_of_table, diff --git a/drivers/gpu/drm/panel/panel-novatek-nt35950.c b/drivers/gpu/drm/panel/panel-novatek-nt35950.c index b036208f9356..08b22b592ab0 100644 --- a/drivers/gpu/drm/panel/panel-novatek-nt35950.c +++ b/drivers/gpu/drm/panel/panel-novatek-nt35950.c @@ -481,9 +481,9 @@ static int nt35950_probe(struct mipi_dsi_device *dsi)  			return dev_err_probe(dev, -EPROBE_DEFER, "Cannot get secondary DSI host\n");  		nt->dsi[1] = mipi_dsi_device_register_full(dsi_r_host, info); -		if (!nt->dsi[1]) { +		if (IS_ERR(nt->dsi[1])) {  			dev_err(dev, "Cannot get secondary DSI node\n"); -			return -ENODEV; +			return PTR_ERR(nt->dsi[1]);  		}  		num_dsis++;  	} diff --git a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c index 8a3fe531c641..7d1b421ea9dd 100644 --- a/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c +++ b/drivers/gpu/drm/panel/panel-seiko-43wvf1g.c @@ -297,7 +297,7 @@ static struct platform_driver seiko_panel_platform_driver = {  		.of_match_table = platform_of_match,  	},  	.probe = seiko_panel_platform_probe, -	.remove_new = seiko_panel_remove, +	.remove = seiko_panel_remove,  };  module_platform_driver(seiko_panel_platform_driver); diff --git a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c index 76bd9e810827..a9673a52b861 100644 --- a/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c +++ b/drivers/gpu/drm/panel/panel-sharp-ls037v7dw01.c @@ -207,7 +207,7 @@ MODULE_DEVICE_TABLE(of, ls037v7dw01_of_match);  static struct platform_driver ls037v7dw01_driver = {  	.probe		= ls037v7dw01_probe, -	.remove_new	= ls037v7dw01_remove, +	.remove		= ls037v7dw01_remove,  	.driver		= {  		.name = "panel-sharp-ls037v7dw01",  		.of_match_table = ls037v7dw01_of_match, diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index 06381c628209..222c170dde8b 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -5120,7 +5120,7 @@ static struct platform_driver panel_simple_platform_driver = {  		.pm = &panel_simple_pm_ops,  	},  	.probe = panel_simple_platform_probe, -	.remove_new = panel_simple_platform_remove, +	.remove = panel_simple_platform_remove,  	.shutdown = panel_simple_platform_shutdown,  }; diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c index eef03d04e0cd..1f72ef7ca74c 100644 --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c @@ -1177,6 +1177,7 @@ static int st7701_probe(struct device *dev, int connector_type)  		return dev_err_probe(dev, ret, "Failed to get orientation\n");  	drm_panel_init(&st7701->panel, dev, &st7701_funcs, connector_type); +	st7701->panel.prepare_prev_first = true;  	/**  	 * Once sleep out has been issued, ST7701 IC required to wait 120ms diff --git a/drivers/gpu/drm/panel/panel-synaptics-r63353.c b/drivers/gpu/drm/panel/panel-synaptics-r63353.c index 169c629746c7..17349825543f 100644 --- a/drivers/gpu/drm/panel/panel-synaptics-r63353.c +++ b/drivers/gpu/drm/panel/panel-synaptics-r63353.c @@ -325,7 +325,7 @@ static void r63353_panel_shutdown(struct mipi_dsi_device *dsi)  {  	struct r63353_panel *rpanel = mipi_dsi_get_drvdata(dsi); -	r63353_panel_unprepare(&rpanel->base); +	drm_panel_unprepare(&rpanel->base);  }  static const struct r63353_desc sharp_ls068b3sx02_data = { diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c index 04d615df5259..ee3864476eb9 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -866,7 +866,7 @@ MODULE_DEVICE_TABLE(of, dt_match);  static struct platform_driver panfrost_driver = {  	.probe		= panfrost_probe, -	.remove_new	= panfrost_remove, +	.remove		= panfrost_remove,  	.driver		= {  		.name	= "panfrost",  		.pm	= pm_ptr(&panfrost_pm_ops), diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c index ac7e53f6e3f0..0b3fbee3d37a 100644 --- a/drivers/gpu/drm/panthor/panthor_drv.c +++ b/drivers/gpu/drm/panthor/panthor_drv.c @@ -1589,7 +1589,7 @@ static DEFINE_RUNTIME_DEV_PM_OPS(panthor_pm_ops,  static struct platform_driver panthor_driver = {  	.probe = panthor_probe, -	.remove_new = panthor_remove, +	.remove = panthor_remove,  	.driver = {  		.name = "panthor",  		.pm = pm_ptr(&panthor_pm_ops), diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_cmm.c b/drivers/gpu/drm/renesas/rcar-du/rcar_cmm.c index 26a2f5ad8ee5..79b67c406bd6 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_cmm.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_cmm.c @@ -201,7 +201,7 @@ MODULE_DEVICE_TABLE(of, rcar_cmm_of_table);  static struct platform_driver rcar_cmm_platform_driver = {  	.probe		= rcar_cmm_probe, -	.remove_new	= rcar_cmm_remove, +	.remove		= rcar_cmm_remove,  	.driver		= {  		.name	= "rcar-cmm",  		.of_match_table = rcar_cmm_of_table, diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c index 4e0bafc86f50..f9ecc334c024 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c @@ -729,7 +729,7 @@ error:  static struct platform_driver rcar_du_platform_driver = {  	.probe		= rcar_du_probe, -	.remove_new	= rcar_du_remove, +	.remove		= rcar_du_remove,  	.shutdown	= rcar_du_shutdown,  	.driver		= {  		.name	= "rcar-du", diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_dw_hdmi.c b/drivers/gpu/drm/renesas/rcar-du/rcar_dw_hdmi.c index 119d69d20b23..c0176e5de9a8 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_dw_hdmi.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_dw_hdmi.c @@ -108,7 +108,7 @@ MODULE_DEVICE_TABLE(of, rcar_dw_hdmi_of_table);  static struct platform_driver rcar_dw_hdmi_platform_driver = {  	.probe		= rcar_dw_hdmi_probe, -	.remove_new	= rcar_dw_hdmi_remove, +	.remove		= rcar_dw_hdmi_remove,  	.driver		= {  		.name	= "rcar-dw-hdmi",  		.of_match_table = rcar_dw_hdmi_of_table, diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_lvds.c b/drivers/gpu/drm/renesas/rcar-du/rcar_lvds.c index 92ba43a6fe38..e8d64583e3bd 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_lvds.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_lvds.c @@ -1018,7 +1018,7 @@ static const struct dev_pm_ops rcar_lvds_pm_ops = {  static struct platform_driver rcar_lvds_platform_driver = {  	.probe		= rcar_lvds_probe, -	.remove_new	= rcar_lvds_remove, +	.remove		= rcar_lvds_remove,  	.driver		= {  		.name	= "rcar-lvds",  		.pm	= &rcar_lvds_pm_ops, diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c index 2dba7c5ffd2c..8180625d5866 100644 --- a/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_mipi_dsi.c @@ -1088,7 +1088,7 @@ MODULE_DEVICE_TABLE(of, rcar_mipi_dsi_of_table);  static struct platform_driver rcar_mipi_dsi_platform_driver = {  	.probe          = rcar_mipi_dsi_probe, -	.remove_new     = rcar_mipi_dsi_remove, +	.remove         = rcar_mipi_dsi_remove,  	.driver         = {  		.name   = "rcar-mipi-dsi",  		.of_match_table = rcar_mipi_dsi_of_table, diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c index bbd7003335da..b069efd8ffc3 100644 --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c @@ -173,7 +173,7 @@ error:  static struct platform_driver rzg2l_du_platform_driver = {  	.probe		= rzg2l_du_probe, -	.remove_new	= rzg2l_du_remove, +	.remove		= rzg2l_du_remove,  	.shutdown	= rzg2l_du_shutdown,  	.driver		= {  		.name	= "rzg2l-du", diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c index 10febea473cd..fa7a1ae22aa3 100644 --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c @@ -798,7 +798,7 @@ MODULE_DEVICE_TABLE(of, rzg2l_mipi_dsi_of_table);  static struct platform_driver rzg2l_mipi_dsi_platform_driver = {  	.probe	= rzg2l_mipi_dsi_probe, -	.remove_new = rzg2l_mipi_dsi_remove, +	.remove = rzg2l_mipi_dsi_remove,  	.driver	= {  		.name = "rzg2l-mipi-dsi",  		.pm = &rzg2l_mipi_pm_ops, diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c index 8d3effe3f598..76ee3e16077c 100644 --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c @@ -282,7 +282,7 @@ static const struct of_device_id shmob_drm_of_table[] __maybe_unused = {  static struct platform_driver shmob_drm_platform_driver = {  	.probe		= shmob_drm_probe, -	.remove_new	= shmob_drm_remove, +	.remove		= shmob_drm_remove,  	.shutdown	= shmob_drm_shutdown,  	.driver		= {  		.name	= "shmob-drm", diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index d3341edfe4f4..546d13f19f9b 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c @@ -470,7 +470,7 @@ MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids);  struct platform_driver rockchip_dp_driver = {  	.probe = rockchip_dp_probe, -	.remove_new = rockchip_dp_remove, +	.remove = rockchip_dp_remove,  	.driver = {  		   .name = "rockchip-dp",  		   .pm = pm_ptr(&rockchip_dp_pm_ops), diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index b04538907f95..ff9d95e2c4d4 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c @@ -1254,7 +1254,7 @@ static const struct dev_pm_ops cdn_dp_pm_ops = {  struct platform_driver cdn_dp_driver = {  	.probe = cdn_dp_probe, -	.remove_new = cdn_dp_remove, +	.remove = cdn_dp_remove,  	.shutdown = cdn_dp_shutdown,  	.driver = {  		   .name = "cdn-dp", diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c index 58a44af0e9ad..1b64b6e39cc8 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c @@ -1709,7 +1709,7 @@ MODULE_DEVICE_TABLE(of, dw_mipi_dsi_rockchip_dt_ids);  struct platform_driver dw_mipi_dsi_rockchip_driver = {  	.probe		= dw_mipi_dsi_rockchip_probe, -	.remove_new	= dw_mipi_dsi_rockchip_remove, +	.remove		= dw_mipi_dsi_rockchip_remove,  	.driver		= {  		.of_match_table = dw_mipi_dsi_rockchip_dt_ids,  		.pm	= &dw_mipi_dsi_rockchip_pm_ops, diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 96e1097f993d..42bda4ffbbbd 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -666,7 +666,7 @@ static const struct dev_pm_ops dw_hdmi_rockchip_pm = {  struct platform_driver dw_hdmi_rockchip_pltfm_driver = {  	.probe  = dw_hdmi_rockchip_probe, -	.remove_new = dw_hdmi_rockchip_remove, +	.remove = dw_hdmi_rockchip_remove,  	.driver = {  		.name = "dwhdmi-rockchip",  		.pm = &dw_hdmi_rockchip_pm, diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchip/inno_hdmi.c index 42ef62aa0a1e..b58e2a29294b 100644 --- a/drivers/gpu/drm/rockchip/inno_hdmi.c +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c @@ -1017,7 +1017,7 @@ MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids);  struct platform_driver inno_hdmi_driver = {  	.probe  = inno_hdmi_probe, -	.remove_new = inno_hdmi_remove, +	.remove = inno_hdmi_remove,  	.driver = {  		.name = "innohdmi-rockchip",  		.of_match_table = inno_hdmi_dt_ids, diff --git a/drivers/gpu/drm/rockchip/rk3066_hdmi.c b/drivers/gpu/drm/rockchip/rk3066_hdmi.c index 784de990da1b..b0fc8ace2e41 100644 --- a/drivers/gpu/drm/rockchip/rk3066_hdmi.c +++ b/drivers/gpu/drm/rockchip/rk3066_hdmi.c @@ -858,7 +858,7 @@ MODULE_DEVICE_TABLE(of, rk3066_hdmi_dt_ids);  struct platform_driver rk3066_hdmi_driver = {  	.probe  = rk3066_hdmi_probe, -	.remove_new = rk3066_hdmi_remove, +	.remove = rk3066_hdmi_remove,  	.driver = {  		.name = "rockchip-rk3066-hdmi",  		.of_match_table = rk3066_hdmi_dt_ids, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 585355de696b..32d8394c4c49 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -500,7 +500,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);  static struct platform_driver rockchip_drm_platform_driver = {  	.probe = rockchip_drm_platform_probe, -	.remove_new = rockchip_drm_platform_remove, +	.remove = rockchip_drm_platform_remove,  	.shutdown = rockchip_drm_platform_shutdown,  	.driver = {  		.name = "rockchip-drm", diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index 9a01aa450741..aba733736ff7 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -746,7 +746,7 @@ static void rockchip_lvds_remove(struct platform_device *pdev)  struct platform_driver rockchip_lvds_driver = {  	.probe = rockchip_lvds_probe, -	.remove_new = rockchip_lvds_remove, +	.remove = rockchip_lvds_remove,  	.driver = {  		   .name = "rockchip-lvds",  		   .of_match_table = rockchip_lvds_dt_ids, diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 18efb3fe1c00..f9d87a0abc8b 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -501,7 +501,7 @@ static void vop2_remove(struct platform_device *pdev)  struct platform_driver vop2_platform_driver = {  	.probe = vop2_probe, -	.remove_new = vop2_remove, +	.remove = vop2_remove,  	.driver = {  		.name = "rockchip-vop2",  		.of_match_table = vop2_dt_match, diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index e2c6ba26f437..8998967f0c00 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -1284,7 +1284,7 @@ static void vop_remove(struct platform_device *pdev)  struct platform_driver vop_platform_driver = {  	.probe = vop_probe, -	.remove_new = vop_remove, +	.remove = vop_remove,  	.driver = {  		.name = "rockchip-vop",  		.of_match_table = vop_driver_dt_match, diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c index 7ce25281c74c..57da84908752 100644 --- a/drivers/gpu/drm/scheduler/sched_main.c +++ b/drivers/gpu/drm/scheduler/sched_main.c @@ -1355,7 +1355,8 @@ EXPORT_SYMBOL(drm_sched_init);   * drm_sched_backend_ops.run_job(). Consequently, drm_sched_backend_ops.free_job()   * will not be called for all jobs still in drm_gpu_scheduler.pending_list.   * There is no solution for this currently. Thus, it is up to the driver to make - * sure that + * sure that: + *   *  a) drm_sched_fini() is only called after for all submitted jobs   *     drm_sched_backend_ops.free_job() has been called or that   *  b) the jobs for which drm_sched_backend_ops.free_job() has not been called diff --git a/drivers/gpu/drm/solomon/ssd130x-i2c.c b/drivers/gpu/drm/solomon/ssd130x-i2c.c index f2ccab9c06d9..941a2eb44c57 100644 --- a/drivers/gpu/drm/solomon/ssd130x-i2c.c +++ b/drivers/gpu/drm/solomon/ssd130x-i2c.c @@ -123,4 +123,4 @@ module_i2c_driver(ssd130x_i2c_driver);  MODULE_DESCRIPTION(DRIVER_DESC);  MODULE_AUTHOR("Javier Martinez Canillas <javierm@redhat.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(DRM_SSD130X); +MODULE_IMPORT_NS("DRM_SSD130X"); diff --git a/drivers/gpu/drm/solomon/ssd130x-spi.c b/drivers/gpu/drm/solomon/ssd130x-spi.c index 84bfde31d172..08334be38694 100644 --- a/drivers/gpu/drm/solomon/ssd130x-spi.c +++ b/drivers/gpu/drm/solomon/ssd130x-spi.c @@ -192,4 +192,4 @@ module_spi_driver(ssd130x_spi_driver);  MODULE_DESCRIPTION(DRIVER_DESC);  MODULE_AUTHOR("Javier Martinez Canillas <javierm@redhat.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DRM_SSD130X); +MODULE_IMPORT_NS("DRM_SSD130X"); diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c index 29b2f82d81f8..486d8f5282f9 100644 --- a/drivers/gpu/drm/solomon/ssd130x.c +++ b/drivers/gpu/drm/solomon/ssd130x.c @@ -209,7 +209,7 @@ const struct ssd130x_deviceinfo ssd130x_variants[] = {  		.family_id = SSD133X_FAMILY,  	}  }; -EXPORT_SYMBOL_NS_GPL(ssd130x_variants, DRM_SSD130X); +EXPORT_SYMBOL_NS_GPL(ssd130x_variants, "DRM_SSD130X");  struct ssd130x_crtc_state {  	struct drm_crtc_state base; diff --git a/drivers/gpu/drm/sprd/sprd_dpu.c b/drivers/gpu/drm/sprd/sprd_dpu.c index deb3bb96e2a8..cb2816985305 100644 --- a/drivers/gpu/drm/sprd/sprd_dpu.c +++ b/drivers/gpu/drm/sprd/sprd_dpu.c @@ -866,7 +866,7 @@ static void sprd_dpu_remove(struct platform_device *pdev)  struct platform_driver sprd_dpu_driver = {  	.probe = sprd_dpu_probe, -	.remove_new = sprd_dpu_remove, +	.remove = sprd_dpu_remove,  	.driver = {  		.name = "sprd-dpu-drv",  		.of_match_table = dpu_match_table, diff --git a/drivers/gpu/drm/sprd/sprd_drm.c b/drivers/gpu/drm/sprd/sprd_drm.c index a74cd0caf645..bc1c747d3ea4 100644 --- a/drivers/gpu/drm/sprd/sprd_drm.c +++ b/drivers/gpu/drm/sprd/sprd_drm.c @@ -163,7 +163,7 @@ MODULE_DEVICE_TABLE(of, drm_match_table);  static struct platform_driver sprd_drm_driver = {  	.probe = sprd_drm_probe, -	.remove_new = sprd_drm_remove, +	.remove = sprd_drm_remove,  	.shutdown = sprd_drm_shutdown,  	.driver = {  		.name = "sprd-drm-drv", diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_dsi.c index 44a7a579660f..8fc26479bb6b 100644 --- a/drivers/gpu/drm/sprd/sprd_dsi.c +++ b/drivers/gpu/drm/sprd/sprd_dsi.c @@ -1060,7 +1060,7 @@ static void sprd_dsi_remove(struct platform_device *pdev)  struct platform_driver sprd_dsi_driver = {  	.probe = sprd_dsi_probe, -	.remove_new = sprd_dsi_remove, +	.remove = sprd_dsi_remove,  	.driver = {  		.name = "sprd-dsi-drv",  		.of_match_table = dsi_match_table, diff --git a/drivers/gpu/drm/sti/sti_compositor.c b/drivers/gpu/drm/sti/sti_compositor.c index 33487a1fed8f..063f82d23d80 100644 --- a/drivers/gpu/drm/sti/sti_compositor.c +++ b/drivers/gpu/drm/sti/sti_compositor.c @@ -269,7 +269,7 @@ struct platform_driver sti_compositor_driver = {  		.of_match_table = compositor_of_match,  	},  	.probe = sti_compositor_probe, -	.remove_new = sti_compositor_remove, +	.remove = sti_compositor_remove,  };  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>"); diff --git a/drivers/gpu/drm/sti/sti_drv.c b/drivers/gpu/drm/sti/sti_drv.c index 65f180c8e8e2..61ceff9aee7e 100644 --- a/drivers/gpu/drm/sti/sti_drv.c +++ b/drivers/gpu/drm/sti/sti_drv.c @@ -270,7 +270,7 @@ MODULE_DEVICE_TABLE(of, sti_dt_ids);  static struct platform_driver sti_platform_driver = {  	.probe = sti_platform_probe, -	.remove_new = sti_platform_remove, +	.remove = sti_platform_remove,  	.shutdown = sti_platform_shutdown,  	.driver = {  		.name = DRIVER_NAME, diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c index 68b8197b3dd1..c6c2abaa1891 100644 --- a/drivers/gpu/drm/sti/sti_dvo.c +++ b/drivers/gpu/drm/sti/sti_dvo.c @@ -585,7 +585,7 @@ struct platform_driver sti_dvo_driver = {  		.of_match_table = dvo_of_match,  	},  	.probe = sti_dvo_probe, -	.remove_new = sti_dvo_remove, +	.remove = sti_dvo_remove,  };  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>"); diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c index f18faad974aa..b12863bea955 100644 --- a/drivers/gpu/drm/sti/sti_hda.c +++ b/drivers/gpu/drm/sti/sti_hda.c @@ -810,7 +810,7 @@ struct platform_driver sti_hda_driver = {  		.of_match_table = hda_of_match,  	},  	.probe = sti_hda_probe, -	.remove_new = sti_hda_remove, +	.remove = sti_hda_remove,  };  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>"); diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c index 847470f747c0..21b46a6465f0 100644 --- a/drivers/gpu/drm/sti/sti_hdmi.c +++ b/drivers/gpu/drm/sti/sti_hdmi.c @@ -1492,7 +1492,7 @@ struct platform_driver sti_hdmi_driver = {  		.of_match_table = hdmi_of_match,  	},  	.probe = sti_hdmi_probe, -	.remove_new = sti_hdmi_remove, +	.remove = sti_hdmi_remove,  };  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>"); diff --git a/drivers/gpu/drm/sti/sti_hqvdp.c b/drivers/gpu/drm/sti/sti_hqvdp.c index 5793cf2cb897..0f658709c9d0 100644 --- a/drivers/gpu/drm/sti/sti_hqvdp.c +++ b/drivers/gpu/drm/sti/sti_hqvdp.c @@ -1420,7 +1420,7 @@ struct platform_driver sti_hqvdp_driver = {  		.of_match_table = hqvdp_of_match,  	},  	.probe = sti_hqvdp_probe, -	.remove_new = sti_hqvdp_remove, +	.remove = sti_hqvdp_remove,  };  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>"); diff --git a/drivers/gpu/drm/sti/sti_mixer.c b/drivers/gpu/drm/sti/sti_mixer.c index 7e5f14646625..06c1b81912f7 100644 --- a/drivers/gpu/drm/sti/sti_mixer.c +++ b/drivers/gpu/drm/sti/sti_mixer.c @@ -137,7 +137,7 @@ static void mixer_dbg_crb(struct seq_file *s, int val)  	}  } -static void mixer_dbg_mxn(struct seq_file *s, void *addr) +static void mixer_dbg_mxn(struct seq_file *s, void __iomem *addr)  {  	int i; diff --git a/drivers/gpu/drm/sti/sti_tvout.c b/drivers/gpu/drm/sti/sti_tvout.c index e714c232026c..af6c06f448c4 100644 --- a/drivers/gpu/drm/sti/sti_tvout.c +++ b/drivers/gpu/drm/sti/sti_tvout.c @@ -889,7 +889,7 @@ struct platform_driver sti_tvout_driver = {  		.of_match_table = tvout_of_match,  	},  	.probe = sti_tvout_probe, -	.remove_new = sti_tvout_remove, +	.remove = sti_tvout_remove,  };  MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>"); diff --git a/drivers/gpu/drm/stm/drv.c b/drivers/gpu/drm/stm/drv.c index 478dc129d5c2..bf090a354989 100644 --- a/drivers/gpu/drm/stm/drv.c +++ b/drivers/gpu/drm/stm/drv.c @@ -245,7 +245,7 @@ MODULE_DEVICE_TABLE(of, drv_dt_ids);  static struct platform_driver stm_drm_platform_driver = {  	.probe = stm_drm_platform_probe, -	.remove_new = stm_drm_platform_remove, +	.remove = stm_drm_platform_remove,  	.shutdown = stm_drm_platform_shutdown,  	.driver = {  		.name = "stm32-display", diff --git a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c index b20123854c4a..2c7bc064bc66 100644 --- a/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c +++ b/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c @@ -783,7 +783,7 @@ static const struct dev_pm_ops dw_mipi_dsi_stm_pm_ops = {  static struct platform_driver dw_mipi_dsi_stm_driver = {  	.probe		= dw_mipi_dsi_stm_probe, -	.remove_new	= dw_mipi_dsi_stm_remove, +	.remove		= dw_mipi_dsi_stm_remove,  	.driver		= {  		.of_match_table = dw_mipi_dsi_stm_dt_ids,  		.name	= "stm32-display-dsi", diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c index e89eb96d3131..2dded3b828df 100644 --- a/drivers/gpu/drm/sun4i/sun4i_backend.c +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c @@ -1028,7 +1028,7 @@ MODULE_DEVICE_TABLE(of, sun4i_backend_of_table);  static struct platform_driver sun4i_backend_platform_driver = {  	.probe		= sun4i_backend_probe, -	.remove_new	= sun4i_backend_remove, +	.remove		= sun4i_backend_remove,  	.driver		= {  		.name		= "sun4i-backend",  		.of_match_table	= sun4i_backend_of_table, diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c index 3f880d8a5666..5eccf58f2e17 100644 --- a/drivers/gpu/drm/sun4i/sun4i_drv.c +++ b/drivers/gpu/drm/sun4i/sun4i_drv.c @@ -443,7 +443,7 @@ MODULE_DEVICE_TABLE(of, sun4i_drv_of_table);  static struct platform_driver sun4i_drv_platform_driver = {  	.probe		= sun4i_drv_probe, -	.remove_new	= sun4i_drv_remove, +	.remove		= sun4i_drv_remove,  	.shutdown	= sun4i_drv_shutdown,  	.driver		= {  		.name		= "sun4i-drm", diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.c b/drivers/gpu/drm/sun4i/sun4i_frontend.c index 280d444dbb66..5ab1604f12dd 100644 --- a/drivers/gpu/drm/sun4i/sun4i_frontend.c +++ b/drivers/gpu/drm/sun4i/sun4i_frontend.c @@ -717,7 +717,7 @@ MODULE_DEVICE_TABLE(of, sun4i_frontend_of_table);  static struct platform_driver sun4i_frontend_driver = {  	.probe		= sun4i_frontend_probe, -	.remove_new	= sun4i_frontend_remove, +	.remove		= sun4i_frontend_remove,  	.driver		= {  		.name		= "sun4i-frontend",  		.of_match_table	= sun4i_frontend_of_table, diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c index b3649449de30..453f19f16ab7 100644 --- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c @@ -741,7 +741,7 @@ MODULE_DEVICE_TABLE(of, sun4i_hdmi_of_table);  static struct platform_driver sun4i_hdmi_driver = {  	.probe		= sun4i_hdmi_probe, -	.remove_new	= sun4i_hdmi_remove, +	.remove		= sun4i_hdmi_remove,  	.driver		= {  		.name		= "sun4i-hdmi",  		.of_match_table	= sun4i_hdmi_of_table, diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c index a1a2c845ade0..960e83c8291d 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tcon.c +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c @@ -1568,7 +1568,7 @@ EXPORT_SYMBOL(sun4i_tcon_of_table);  static struct platform_driver sun4i_tcon_platform_driver = {  	.probe		= sun4i_tcon_probe, -	.remove_new	= sun4i_tcon_remove, +	.remove		= sun4i_tcon_remove,  	.driver		= {  		.name		= "sun4i-tcon",  		.of_match_table	= sun4i_tcon_of_table, diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c index ec65d9d59de7..cce4e38789b9 100644 --- a/drivers/gpu/drm/sun4i/sun4i_tv.c +++ b/drivers/gpu/drm/sun4i/sun4i_tv.c @@ -559,7 +559,7 @@ MODULE_DEVICE_TABLE(of, sun4i_tv_of_table);  static struct platform_driver sun4i_tv_platform_driver = {  	.probe		= sun4i_tv_probe, -	.remove_new	= sun4i_tv_remove, +	.remove		= sun4i_tv_remove,  	.driver		= {  		.name		= "sun4i-tve",  		.of_match_table	= sun4i_tv_of_table, diff --git a/drivers/gpu/drm/sun4i/sun6i_drc.c b/drivers/gpu/drm/sun4i/sun6i_drc.c index 0d342f43fa93..310c7e0daede 100644 --- a/drivers/gpu/drm/sun4i/sun6i_drc.c +++ b/drivers/gpu/drm/sun4i/sun6i_drc.c @@ -112,7 +112,7 @@ MODULE_DEVICE_TABLE(of, sun6i_drc_of_table);  static struct platform_driver sun6i_drc_platform_driver = {  	.probe		= sun6i_drc_probe, -	.remove_new	= sun6i_drc_remove, +	.remove		= sun6i_drc_remove,  	.driver		= {  		.name		= "sun6i-drc",  		.of_match_table	= sun6i_drc_of_table, diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c index 4abf4f102007..c35b70d83e53 100644 --- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c @@ -1244,7 +1244,7 @@ MODULE_DEVICE_TABLE(of, sun6i_dsi_of_table);  static struct platform_driver sun6i_dsi_platform_driver = {  	.probe		= sun6i_dsi_probe, -	.remove_new	= sun6i_dsi_remove, +	.remove		= sun6i_dsi_remove,  	.driver		= {  		.name		= "sun6i-mipi-dsi",  		.of_match_table	= sun6i_dsi_of_table, diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c index 4727dfaa8fb9..96532709c2a7 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c @@ -264,7 +264,7 @@ MODULE_DEVICE_TABLE(of, sun8i_dw_hdmi_dt_ids);  static struct platform_driver sun8i_dw_hdmi_pltfm_driver = {  	.probe  = sun8i_dw_hdmi_probe, -	.remove_new = sun8i_dw_hdmi_remove, +	.remove = sun8i_dw_hdmi_remove,  	.driver = {  		.name = "sun8i-dw-hdmi",  		.of_match_table = sun8i_dw_hdmi_dt_ids, diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c index bd0fe2c6624e..8b41d33baa30 100644 --- a/drivers/gpu/drm/sun4i/sun8i_mixer.c +++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c @@ -775,7 +775,7 @@ MODULE_DEVICE_TABLE(of, sun8i_mixer_of_table);  static struct platform_driver sun8i_mixer_platform_driver = {  	.probe		= sun8i_mixer_probe, -	.remove_new	= sun8i_mixer_remove, +	.remove		= sun8i_mixer_remove,  	.driver		= {  		.name		= "sun8i-mixer",  		.of_match_table	= sun8i_mixer_of_table, diff --git a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c index a1ca3916f42b..8adda578c51b 100644 --- a/drivers/gpu/drm/sun4i/sun8i_tcon_top.c +++ b/drivers/gpu/drm/sun4i/sun8i_tcon_top.c @@ -299,7 +299,7 @@ EXPORT_SYMBOL(sun8i_tcon_top_of_table);  static struct platform_driver sun8i_tcon_top_platform_driver = {  	.probe		= sun8i_tcon_top_probe, -	.remove_new	= sun8i_tcon_top_remove, +	.remove		= sun8i_tcon_top_remove,  	.driver		= {  		.name		= "sun8i-tcon-top",  		.of_match_table	= sun8i_tcon_top_of_table, diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index be61c9d1a4f0..430b2eededb2 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -3286,5 +3286,5 @@ struct platform_driver tegra_dc_driver = {  		.of_match_table = tegra_dc_of_match,  	},  	.probe = tegra_dc_probe, -	.remove_new = tegra_dc_remove, +	.remove = tegra_dc_remove,  }; diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c index ae12d001a04b..2cd8dcb959c0 100644 --- a/drivers/gpu/drm/tegra/dpaux.c +++ b/drivers/gpu/drm/tegra/dpaux.c @@ -697,7 +697,7 @@ struct platform_driver tegra_dpaux_driver = {  		.pm = pm_ptr(&tegra_dpaux_pm_ops),  	},  	.probe = tegra_dpaux_probe, -	.remove_new = tegra_dpaux_remove, +	.remove = tegra_dpaux_remove,  };  struct drm_dp_aux *drm_dp_aux_find_by_of_node(struct device_node *np) diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c index db606e151afc..4a8cd9ed0a94 100644 --- a/drivers/gpu/drm/tegra/dsi.c +++ b/drivers/gpu/drm/tegra/dsi.c @@ -1713,5 +1713,5 @@ struct platform_driver tegra_dsi_driver = {  		.of_match_table = tegra_dsi_of_match,  	},  	.probe = tegra_dsi_probe, -	.remove_new = tegra_dsi_remove, +	.remove = tegra_dsi_remove,  }; diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c index d275404ad0e9..ace3e5a805cf 100644 --- a/drivers/gpu/drm/tegra/gem.c +++ b/drivers/gpu/drm/tegra/gem.c @@ -22,7 +22,7 @@  #include "drm.h"  #include "gem.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  static unsigned int sg_dma_count_chunks(struct scatterlist *sgl, unsigned int nents)  { diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c index a160d01f26e1..21f4dd0fa6af 100644 --- a/drivers/gpu/drm/tegra/gr2d.c +++ b/drivers/gpu/drm/tegra/gr2d.c @@ -394,5 +394,5 @@ struct platform_driver tegra_gr2d_driver = {  		.pm = &tegra_gr2d_pm,  	},  	.probe = gr2d_probe, -	.remove_new = gr2d_remove, +	.remove = gr2d_remove,  }; diff --git a/drivers/gpu/drm/tegra/gr3d.c b/drivers/gpu/drm/tegra/gr3d.c index caee824832b3..42e9656ab80c 100644 --- a/drivers/gpu/drm/tegra/gr3d.c +++ b/drivers/gpu/drm/tegra/gr3d.c @@ -605,5 +605,5 @@ struct platform_driver tegra_gr3d_driver = {  		.pm = &tegra_gr3d_pm,  	},  	.probe = gr3d_probe, -	.remove_new = gr3d_remove, +	.remove = gr3d_remove,  }; diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index 6bf2dae82ca0..e705f8590c13 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c @@ -1919,5 +1919,5 @@ struct platform_driver tegra_hdmi_driver = {  		.of_match_table = tegra_hdmi_of_match,  	},  	.probe = tegra_hdmi_probe, -	.remove_new = tegra_hdmi_remove, +	.remove = tegra_hdmi_remove,  }; diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c index e0c2019a591b..fa6140fc37fb 100644 --- a/drivers/gpu/drm/tegra/hub.c +++ b/drivers/gpu/drm/tegra/hub.c @@ -1218,5 +1218,5 @@ struct platform_driver tegra_display_hub_driver = {  		.of_match_table = tegra_display_hub_of_match,  	},  	.probe = tegra_display_hub_probe, -	.remove_new = tegra_display_hub_remove, +	.remove = tegra_display_hub_remove,  }; diff --git a/drivers/gpu/drm/tegra/nvdec.c b/drivers/gpu/drm/tegra/nvdec.c index 4860790666af..2d9a0a3f6c38 100644 --- a/drivers/gpu/drm/tegra/nvdec.c +++ b/drivers/gpu/drm/tegra/nvdec.c @@ -566,7 +566,7 @@ struct platform_driver tegra_nvdec_driver = {  		.pm = &nvdec_pm_ops  	},  	.probe = nvdec_probe, -	.remove_new = nvdec_remove, +	.remove = nvdec_remove,  };  #if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC) diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c index bad3b8fcc726..802d2db7007a 100644 --- a/drivers/gpu/drm/tegra/sor.c +++ b/drivers/gpu/drm/tegra/sor.c @@ -4040,5 +4040,5 @@ struct platform_driver tegra_sor_driver = {  		.pm = &tegra_sor_pm_ops,  	},  	.probe = tegra_sor_probe, -	.remove_new = tegra_sor_remove, +	.remove = tegra_sor_remove,  }; diff --git a/drivers/gpu/drm/tegra/vic.c b/drivers/gpu/drm/tegra/vic.c index 73c356f1c901..332c9b563d3f 100644 --- a/drivers/gpu/drm/tegra/vic.c +++ b/drivers/gpu/drm/tegra/vic.c @@ -553,7 +553,7 @@ struct platform_driver tegra_vic_driver = {  		.pm = &vic_pm_ops  	},  	.probe = vic_probe, -	.remove_new = vic_remove, +	.remove = vic_remove,  };  #if IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) diff --git a/drivers/gpu/drm/tests/drm_connector_test.c b/drivers/gpu/drm/tests/drm_connector_test.c index 6bba97d0be88..3d48d676e001 100644 --- a/drivers/gpu/drm/tests/drm_connector_test.c +++ b/drivers/gpu/drm/tests/drm_connector_test.c @@ -635,6 +635,64 @@ static void drm_test_connector_hdmi_init_formats_no_rgb(struct kunit *test)  	KUNIT_EXPECT_LT(test, ret, 0);  } +struct drm_connector_hdmi_init_formats_yuv420_allowed_test { +	unsigned long supported_formats; +	bool yuv420_allowed; +	int expected_result; +}; + +#define YUV420_ALLOWED_TEST(_formats, _allowed, _result)			\ +	{									\ +		.supported_formats = BIT(HDMI_COLORSPACE_RGB) | (_formats),	\ +		.yuv420_allowed = _allowed,					\ +		.expected_result = _result,					\ +	} + +static const struct drm_connector_hdmi_init_formats_yuv420_allowed_test +drm_connector_hdmi_init_formats_yuv420_allowed_tests[] = { +	YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV420), true, 0), +	YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV420), false, -EINVAL), +	YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV422), true, -EINVAL), +	YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV422), false, 0), +}; + +static void +drm_connector_hdmi_init_formats_yuv420_allowed_desc(const struct drm_connector_hdmi_init_formats_yuv420_allowed_test *t, +						    char *desc) +{ +	sprintf(desc, "supported_formats=0x%lx yuv420_allowed=%d", +		t->supported_formats, t->yuv420_allowed); +} + +KUNIT_ARRAY_PARAM(drm_connector_hdmi_init_formats_yuv420_allowed, +		  drm_connector_hdmi_init_formats_yuv420_allowed_tests, +		  drm_connector_hdmi_init_formats_yuv420_allowed_desc); + +/* + * Test that the registration of an HDMI connector succeeds only when + * the presence of YUV420 in the supported formats matches the value + * of the ycbcr_420_allowed flag. + */ +static void drm_test_connector_hdmi_init_formats_yuv420_allowed(struct kunit *test) +{ +	const struct drm_connector_hdmi_init_formats_yuv420_allowed_test *params; +	struct drm_connector_init_priv *priv = test->priv; +	int ret; + +	params = test->param_value; +	priv->connector.ycbcr_420_allowed = params->yuv420_allowed; + +	ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector, +				       "Vendor", "Product", +				       &dummy_funcs, +				       &dummy_hdmi_funcs, +				       DRM_MODE_CONNECTOR_HDMIA, +				       &priv->ddc, +				       params->supported_formats, +				       8); +	KUNIT_EXPECT_EQ(test, ret, params->expected_result); +} +  /*   * Test that the registration of an HDMI connector with an HDMI   * connector type succeeds. @@ -726,6 +784,8 @@ static struct kunit_case drmm_connector_hdmi_init_tests[] = {  	KUNIT_CASE(drm_test_connector_hdmi_init_bpc_null),  	KUNIT_CASE(drm_test_connector_hdmi_init_formats_empty),  	KUNIT_CASE(drm_test_connector_hdmi_init_formats_no_rgb), +	KUNIT_CASE_PARAM(drm_test_connector_hdmi_init_formats_yuv420_allowed, +			 drm_connector_hdmi_init_formats_yuv420_allowed_gen_params),  	KUNIT_CASE(drm_test_connector_hdmi_init_null_ddc),  	KUNIT_CASE(drm_test_connector_hdmi_init_null_product),  	KUNIT_CASE(drm_test_connector_hdmi_init_null_vendor), diff --git a/drivers/gpu/drm/tests/drm_kunit_helpers.c b/drivers/gpu/drm/tests/drm_kunit_helpers.c index 04a6b8cc62ac..3c0b7824c0be 100644 --- a/drivers/gpu/drm/tests/drm_kunit_helpers.c +++ b/drivers/gpu/drm/tests/drm_kunit_helpers.c @@ -320,8 +320,7 @@ static void kunit_action_drm_mode_destroy(void *ptr)  }  /** - * drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC -					   for a KUnit test + * drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC for a KUnit test   * @test: The test context object   * @dev: DRM device   * @video_code: CEA VIC of the mode diff --git a/drivers/gpu/drm/tidss/tidss_drv.c b/drivers/gpu/drm/tidss/tidss_drv.c index 2428b9aaa003..7c8fd6407d82 100644 --- a/drivers/gpu/drm/tidss/tidss_drv.c +++ b/drivers/gpu/drm/tidss/tidss_drv.c @@ -252,7 +252,7 @@ MODULE_DEVICE_TABLE(of, tidss_of_table);  static struct platform_driver tidss_platform_driver = {  	.probe		= tidss_probe, -	.remove_new	= tidss_remove, +	.remove		= tidss_remove,  	.shutdown	= tidss_shutdown,  	.driver		= {  		.name	= "tidss", diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c index 8c9f3705aa6c..6f0df8d6b90c 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c @@ -590,7 +590,7 @@ MODULE_DEVICE_TABLE(of, tilcdc_of_match);  static struct platform_driver tilcdc_platform_driver = {  	.probe      = tilcdc_pdev_probe, -	.remove_new = tilcdc_pdev_remove, +	.remove     = tilcdc_pdev_remove,  	.shutdown   = tilcdc_pdev_shutdown,  	.driver     = {  		.name   = "tilcdc", diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index 5f2d1b6f9ee9..262f290d85d9 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c @@ -390,7 +390,7 @@ static const struct of_device_id panel_of_match[] = {  static struct platform_driver panel_driver = {  	.probe = panel_probe, -	.remove_new = panel_remove, +	.remove = panel_remove,  	.driver = {  		.name = "tilcdc-panel",  		.of_match_table = panel_of_match, diff --git a/drivers/gpu/drm/tiny/arcpgu.c b/drivers/gpu/drm/tiny/arcpgu.c index 81abedec435d..0cc68042a6d6 100644 --- a/drivers/gpu/drm/tiny/arcpgu.c +++ b/drivers/gpu/drm/tiny/arcpgu.c @@ -423,7 +423,7 @@ MODULE_DEVICE_TABLE(of, arcpgu_of_table);  static struct platform_driver arcpgu_platform_driver = {  	.probe = arcpgu_probe, -	.remove_new = arcpgu_remove, +	.remove = arcpgu_remove,  	.driver = {  		   .name = "arcpgu",  		   .of_match_table = arcpgu_of_table, diff --git a/drivers/gpu/drm/tiny/ofdrm.c b/drivers/gpu/drm/tiny/ofdrm.c index 220c1244b3c0..9898eab5e9e2 100644 --- a/drivers/gpu/drm/tiny/ofdrm.c +++ b/drivers/gpu/drm/tiny/ofdrm.c @@ -1398,7 +1398,7 @@ static struct platform_driver ofdrm_platform_driver = {  		.of_match_table = ofdrm_of_match_display,  	},  	.probe = ofdrm_probe, -	.remove_new = ofdrm_remove, +	.remove = ofdrm_remove,  };  module_platform_driver(ofdrm_platform_driver); diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c index 3182d32f1b8f..4d4f05dee244 100644 --- a/drivers/gpu/drm/tiny/simpledrm.c +++ b/drivers/gpu/drm/tiny/simpledrm.c @@ -1066,7 +1066,7 @@ static struct platform_driver simpledrm_platform_driver = {  		.of_match_table = simpledrm_of_match_table,  	},  	.probe = simpledrm_probe, -	.remove_new = simpledrm_remove, +	.remove = simpledrm_remove,  };  module_platform_driver(simpledrm_platform_driver); diff --git a/drivers/gpu/drm/tve200/tve200_drv.c b/drivers/gpu/drm/tve200/tve200_drv.c index b30340a2141d..c341aee37dd9 100644 --- a/drivers/gpu/drm/tve200/tve200_drv.c +++ b/drivers/gpu/drm/tve200/tve200_drv.c @@ -267,7 +267,7 @@ static struct platform_driver tve200_driver = {  		.of_match_table = tve200_of_match,  	},  	.probe = tve200_probe, -	.remove_new = tve200_remove, +	.remove = tve200_remove,  	.shutdown = tve200_shutdown,  };  drm_module_platform_driver(tve200_driver); diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c index fb35c5c3f1a7..bee51c942a56 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -391,7 +391,7 @@ static void v3d_platform_drm_remove(struct platform_device *pdev)  static struct platform_driver v3d_platform_driver = {  	.probe		= v3d_platform_drm_probe, -	.remove_new	= v3d_platform_drm_remove, +	.remove		= v3d_platform_drm_remove,  	.driver		= {  		.name	= "v3d",  		.of_match_table = v3d_of_match, diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c index 20bf33702c3c..da203045df9b 100644 --- a/drivers/gpu/drm/v3d/v3d_irq.c +++ b/drivers/gpu/drm/v3d/v3d_irq.c @@ -108,6 +108,7 @@ v3d_irq(int irq, void *arg)  		v3d_job_update_stats(&v3d->bin_job->base, V3D_BIN);  		trace_v3d_bcl_irq(&v3d->drm, fence->seqno);  		dma_fence_signal(&fence->base); +		v3d->bin_job = NULL;  		status = IRQ_HANDLED;  	} @@ -118,6 +119,7 @@ v3d_irq(int irq, void *arg)  		v3d_job_update_stats(&v3d->render_job->base, V3D_RENDER);  		trace_v3d_rcl_irq(&v3d->drm, fence->seqno);  		dma_fence_signal(&fence->base); +		v3d->render_job = NULL;  		status = IRQ_HANDLED;  	} @@ -128,6 +130,7 @@ v3d_irq(int irq, void *arg)  		v3d_job_update_stats(&v3d->csd_job->base, V3D_CSD);  		trace_v3d_csd_irq(&v3d->drm, fence->seqno);  		dma_fence_signal(&fence->base); +		v3d->csd_job = NULL;  		status = IRQ_HANDLED;  	} @@ -165,6 +168,7 @@ v3d_hub_irq(int irq, void *arg)  		v3d_job_update_stats(&v3d->tfu_job->base, V3D_TFU);  		trace_v3d_tfu_irq(&v3d->drm, fence->seqno);  		dma_fence_signal(&fence->base); +		v3d->tfu_job = NULL;  		status = IRQ_HANDLED;  	} diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c index 156be13ab2ef..924814cab46a 100644 --- a/drivers/gpu/drm/v3d/v3d_perfmon.c +++ b/drivers/gpu/drm/v3d/v3d_perfmon.c @@ -254,9 +254,9 @@ void v3d_perfmon_start(struct v3d_dev *v3d, struct v3d_perfmon *perfmon)  		V3D_CORE_WRITE(0, V3D_V4_PCTR_0_SRC_X(source), channel);  	} +	V3D_CORE_WRITE(0, V3D_V4_PCTR_0_EN, mask);  	V3D_CORE_WRITE(0, V3D_V4_PCTR_0_CLR, mask);  	V3D_CORE_WRITE(0, V3D_PCTR_0_OVERFLOW, mask); -	V3D_CORE_WRITE(0, V3D_V4_PCTR_0_EN, mask);  	v3d->active_perfmon = perfmon;  } diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c index 575900ee67a5..ee82a959d279 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c @@ -1465,7 +1465,7 @@ static void vc4_crtc_dev_remove(struct platform_device *pdev)  struct platform_driver vc4_crtc_driver = {  	.probe = vc4_crtc_dev_probe, -	.remove_new = vc4_crtc_dev_remove, +	.remove = vc4_crtc_dev_remove,  	.driver = {  		.name = "vc4_crtc",  		.of_match_table = vc4_crtc_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_dpi.c b/drivers/gpu/drm/vc4/vc4_dpi.c index a382dc4654bd..960550c166d9 100644 --- a/drivers/gpu/drm/vc4/vc4_dpi.c +++ b/drivers/gpu/drm/vc4/vc4_dpi.c @@ -395,7 +395,7 @@ static void vc4_dpi_dev_remove(struct platform_device *pdev)  struct platform_driver vc4_dpi_driver = {  	.probe = vc4_dpi_dev_probe, -	.remove_new = vc4_dpi_dev_remove, +	.remove = vc4_dpi_dev_remove,  	.driver = {  		.name = "vc4_dpi",  		.of_match_table = vc4_dpi_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c index d47e5967592f..2c60d37275b0 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.c +++ b/drivers/gpu/drm/vc4/vc4_drv.c @@ -471,7 +471,7 @@ MODULE_DEVICE_TABLE(of, vc4_of_match);  static struct platform_driver vc4_platform_driver = {  	.probe		= vc4_platform_drm_probe, -	.remove_new	= vc4_platform_drm_remove, +	.remove		= vc4_platform_drm_remove,  	.shutdown	= vc4_platform_drm_shutdown,  	.driver		= {  		.name	= "vc4-drm", diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c index f5ccc1bf7a63..5eb293bdb363 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -1841,7 +1841,7 @@ static void vc4_dsi_dev_remove(struct platform_device *pdev)  struct platform_driver vc4_dsi_driver = {  	.probe = vc4_dsi_dev_probe, -	.remove_new = vc4_dsi_dev_remove, +	.remove = vc4_dsi_dev_remove,  	.driver = {  		.name = "vc4_dsi",  		.of_match_table = vc4_dsi_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 62b82b1eeb36..e3818c48c9b8 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -3422,7 +3422,7 @@ static const struct dev_pm_ops vc4_hdmi_pm_ops = {  struct platform_driver vc4_hdmi_driver = {  	.probe = vc4_hdmi_dev_probe, -	.remove_new = vc4_hdmi_dev_remove, +	.remove = vc4_hdmi_dev_remove,  	.driver = {  		.name = "vc4_hdmi",  		.of_match_table = vc4_hdmi_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c index 1edf6e3fa7e6..70623e6b91e9 100644 --- a/drivers/gpu/drm/vc4/vc4_hvs.c +++ b/drivers/gpu/drm/vc4/vc4_hvs.c @@ -1153,7 +1153,7 @@ static const struct of_device_id vc4_hvs_dt_match[] = {  struct platform_driver vc4_hvs_driver = {  	.probe = vc4_hvs_dev_probe, -	.remove_new = vc4_hvs_dev_remove, +	.remove = vc4_hvs_dev_remove,  	.driver = {  		.name = "vc4_hvs",  		.of_match_table = vc4_hvs_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c index ffe1f7d1b911..3e38a1d2d55e 100644 --- a/drivers/gpu/drm/vc4/vc4_txp.c +++ b/drivers/gpu/drm/vc4/vc4_txp.c @@ -585,7 +585,7 @@ static const struct of_device_id vc4_txp_dt_match[] = {  struct platform_driver vc4_txp_driver = {  	.probe = vc4_txp_probe, -	.remove_new = vc4_txp_remove, +	.remove = vc4_txp_remove,  	.driver = {  		.name = "vc4_txp",  		.of_match_table = vc4_txp_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_v3d.c b/drivers/gpu/drm/vc4/vc4_v3d.c index 2423826c89eb..bb09df5000bd 100644 --- a/drivers/gpu/drm/vc4/vc4_v3d.c +++ b/drivers/gpu/drm/vc4/vc4_v3d.c @@ -534,7 +534,7 @@ const struct of_device_id vc4_v3d_dt_match[] = {  struct platform_driver vc4_v3d_driver = {  	.probe = vc4_v3d_dev_probe, -	.remove_new = vc4_v3d_dev_remove, +	.remove = vc4_v3d_dev_remove,  	.driver = {  		.name = "vc4_v3d",  		.of_match_table = vc4_v3d_dt_match, diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c index eb64e881051e..06d702e879b0 100644 --- a/drivers/gpu/drm/vc4/vc4_vec.c +++ b/drivers/gpu/drm/vc4/vc4_vec.c @@ -848,7 +848,7 @@ static void vc4_vec_dev_remove(struct platform_device *pdev)  struct platform_driver vc4_vec_driver = {  	.probe = vc4_vec_dev_probe, -	.remove_new = vc4_vec_dev_remove, +	.remove = vc4_vec_dev_remove,  	.driver = {  		.name = "vc4_vec",  		.of_match_table = vc4_vec_dt_match, diff --git a/drivers/gpu/drm/vmwgfx/ttm_object.c b/drivers/gpu/drm/vmwgfx/ttm_object.c index a17e62867f3b..36d46b79562a 100644 --- a/drivers/gpu/drm/vmwgfx/ttm_object.c +++ b/drivers/gpu/drm/vmwgfx/ttm_object.c @@ -54,7 +54,7 @@  #include <linux/module.h>  #include <linux/hashtable.h> -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  #define VMW_TTM_OBJECT_REF_HT_ORDER 10 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c index a0e433fbcba6..9b5b8c1f063b 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c @@ -228,7 +228,6 @@ int vmw_bo_pin_in_start_of_vram(struct vmw_private *dev_priv,  			     VMW_BO_DOMAIN_VRAM,  			     VMW_BO_DOMAIN_VRAM);  	buf->places[0].lpfn = PFN_UP(bo->resource->size); -	buf->busy_places[0].lpfn = PFN_UP(bo->resource->size);  	ret = ttm_bo_validate(bo, &buf->placement, &ctx);  	/* For some reason we didn't end up at the start of vram */ @@ -443,7 +442,8 @@ static int vmw_bo_init(struct vmw_private *dev_priv,  	if (params->pin)  		ttm_bo_pin(&vmw_bo->tbo); -	ttm_bo_unreserve(&vmw_bo->tbo); +	if (!params->keep_resv) +		ttm_bo_unreserve(&vmw_bo->tbo);  	return 0;  } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h index 43b5439ec9f7..11e330c7c7f5 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.h @@ -56,8 +56,9 @@ struct vmw_bo_params {  	u32 domain;  	u32 busy_domain;  	enum ttm_bo_type bo_type; -	size_t size;  	bool pin; +	bool keep_resv; +	size_t size;  	struct dma_resv *resv;  	struct sg_table *sg;  }; @@ -83,7 +84,6 @@ struct vmw_bo {  	struct ttm_placement placement;  	struct ttm_place places[5]; -	struct ttm_place busy_places[5];  	/* Protected by reservation */  	struct ttm_bo_kmap_obj map; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 2c46897876dd..b19a062592b0 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c @@ -403,7 +403,8 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)  		.busy_domain = VMW_BO_DOMAIN_SYS,  		.bo_type = ttm_bo_type_kernel,  		.size = PAGE_SIZE, -		.pin = true +		.pin = true, +		.keep_resv = true,  	};  	/* @@ -415,10 +416,6 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)  	if (unlikely(ret != 0))  		return ret; -	ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL); -	BUG_ON(ret != 0); -	vmw_bo_pin_reserved(vbo, true); -  	ret = ttm_bo_kmap(&vbo->tbo, 0, 1, &map);  	if (likely(ret == 0)) {  		result = ttm_kmap_obj_virtual(&map, &dummy); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c index b9857f37ca1a..ed5015ced392 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gem.c @@ -206,6 +206,7 @@ struct drm_gem_object *vmw_prime_import_sg_table(struct drm_device *dev,  		.bo_type = ttm_bo_type_sg,  		.size = attach->dmabuf->size,  		.pin = false, +		.keep_resv = true,  		.resv = attach->dmabuf->resv,  		.sg = table, diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 8db38927729b..800a79e035ed 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c @@ -750,6 +750,7 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,  	struct vmw_plane_state *old_vps = vmw_plane_state_to_vps(old_state);  	struct vmw_bo *old_bo = NULL;  	struct vmw_bo *new_bo = NULL; +	struct ww_acquire_ctx ctx;  	s32 hotspot_x, hotspot_y;  	int ret; @@ -769,9 +770,11 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,  	if (du->cursor_surface)  		du->cursor_age = du->cursor_surface->snooper.age; +	ww_acquire_init(&ctx, &reservation_ww_class); +  	if (!vmw_user_object_is_null(&old_vps->uo)) {  		old_bo = vmw_user_object_buffer(&old_vps->uo); -		ret = ttm_bo_reserve(&old_bo->tbo, false, false, NULL); +		ret = ttm_bo_reserve(&old_bo->tbo, false, false, &ctx);  		if (ret != 0)  			return;  	} @@ -779,9 +782,14 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,  	if (!vmw_user_object_is_null(&vps->uo)) {  		new_bo = vmw_user_object_buffer(&vps->uo);  		if (old_bo != new_bo) { -			ret = ttm_bo_reserve(&new_bo->tbo, false, false, NULL); -			if (ret != 0) +			ret = ttm_bo_reserve(&new_bo->tbo, false, false, &ctx); +			if (ret != 0) { +				if (old_bo) { +					ttm_bo_unreserve(&old_bo->tbo); +					ww_acquire_fini(&ctx); +				}  				return; +			}  		} else {  			new_bo = NULL;  		} @@ -803,10 +811,12 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,  						hotspot_x, hotspot_y);  	} -	if (old_bo) -		ttm_bo_unreserve(&old_bo->tbo);  	if (new_bo)  		ttm_bo_unreserve(&new_bo->tbo); +	if (old_bo) +		ttm_bo_unreserve(&old_bo->tbo); + +	ww_acquire_fini(&ctx);  	du->cursor_x = new_state->crtc_x + du->set_gui_x;  	du->cursor_y = new_state->crtc_y + du->set_gui_y; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c index a01ca3226d0a..7fb1c88bcc47 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c @@ -896,7 +896,8 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,  		.busy_domain = VMW_BO_DOMAIN_SYS,  		.bo_type = ttm_bo_type_device,  		.size = size, -		.pin = true +		.pin = true, +		.keep_resv = true,  	};  	if (!vmw_shader_id_ok(user_key, shader_type)) @@ -906,10 +907,6 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,  	if (unlikely(ret != 0))  		goto out; -	ret = ttm_bo_reserve(&buf->tbo, false, true, NULL); -	if (unlikely(ret != 0)) -		goto no_reserve; -  	/* Map and copy shader bytecode. */  	ret = ttm_bo_kmap(&buf->tbo, 0, PFN_UP(size), &map);  	if (unlikely(ret != 0)) { diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c index 621d98b376bb..5553892d7c3e 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c @@ -572,15 +572,14 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,  		.busy_domain = domain,  		.bo_type = ttm_bo_type_kernel,  		.size = bo_size, -		.pin = true +		.pin = true, +		.keep_resv = true,  	};  	ret = vmw_bo_create(dev_priv, &bo_params, &vbo);  	if (unlikely(ret != 0))  		return ret; -	ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL); -	BUG_ON(ret != 0);  	ret = vmw_ttm_populate(vbo->tbo.bdev, vbo->tbo.ttm, &ctx);  	if (likely(ret == 0)) {  		struct vmw_ttm_tt *vmw_tt = diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c index 3e0ae40ebbd2..812046f5d741 100644 --- a/drivers/gpu/drm/xe/tests/xe_bo.c +++ b/drivers/gpu/drm/xe/tests/xe_bo.c @@ -257,10 +257,9 @@ static int evict_test_run_tile(struct xe_device *xe, struct xe_tile *tile, struc  		 * however seems quite fragile not to also restart the GT. Try  		 * to do that here by triggering a GT reset.  		 */ -		for_each_gt(__gt, xe, id) { -			xe_gt_reset_async(__gt); -			flush_work(&__gt->reset.worker); -		} +		for_each_gt(__gt, xe, id) +			xe_gt_reset(__gt); +  		if (err) {  			KUNIT_FAIL(test, "restore kernel err=%pe\n",  				   ERR_PTR(err)); diff --git a/drivers/gpu/drm/xe/tests/xe_live_test_mod.c b/drivers/gpu/drm/xe/tests/xe_live_test_mod.c index 5f14737c8210..0d36ab864ec0 100644 --- a/drivers/gpu/drm/xe/tests/xe_live_test_mod.c +++ b/drivers/gpu/drm/xe/tests/xe_live_test_mod.c @@ -18,4 +18,4 @@ kunit_test_suite(xe_mocs_test_suite);  MODULE_AUTHOR("Intel Corporation");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("xe live kunit tests"); -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); diff --git a/drivers/gpu/drm/xe/tests/xe_migrate.c b/drivers/gpu/drm/xe/tests/xe_migrate.c index 1a192a2a941b..3bbdb362d6f0 100644 --- a/drivers/gpu/drm/xe/tests/xe_migrate.c +++ b/drivers/gpu/drm/xe/tests/xe_migrate.c @@ -224,8 +224,8 @@ static void xe_migrate_sanity_test(struct xe_migrate *m, struct kunit *test)  				    XE_BO_FLAG_VRAM_IF_DGFX(tile) |  				    XE_BO_FLAG_PINNED);  	if (IS_ERR(tiny)) { -		KUNIT_FAIL(test, "Failed to allocate fake pt: %li\n", -			   PTR_ERR(pt)); +		KUNIT_FAIL(test, "Failed to allocate tiny fake pt: %li\n", +			   PTR_ERR(tiny));  		goto free_pt;  	} diff --git a/drivers/gpu/drm/xe/tests/xe_mocs.c b/drivers/gpu/drm/xe/tests/xe_mocs.c index 6f9b7a266b41..2698e433c6fa 100644 --- a/drivers/gpu/drm/xe/tests/xe_mocs.c +++ b/drivers/gpu/drm/xe/tests/xe_mocs.c @@ -162,8 +162,7 @@ static int mocs_reset_test_run_device(struct xe_device *xe)  		if (flags & HAS_LNCF_MOCS)  			read_l3cc_table(gt, &mocs.table); -		xe_gt_reset_async(gt); -		flush_work(>->reset.worker); +		xe_gt_reset(gt);  		kunit_info(test, "mocs_reset_test after reset\n");  		if (flags & HAS_GLOBAL_MOCS) diff --git a/drivers/gpu/drm/xe/tests/xe_test_mod.c b/drivers/gpu/drm/xe/tests/xe_test_mod.c index 875f3e6f965e..93081bcf2ab0 100644 --- a/drivers/gpu/drm/xe/tests/xe_test_mod.c +++ b/drivers/gpu/drm/xe/tests/xe_test_mod.c @@ -7,4 +7,4 @@  MODULE_AUTHOR("Intel Corporation");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("xe kunit tests"); -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index ae6b337cdc54..f61a8ef38094 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -724,7 +724,7 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,  	    new_mem->mem_type == XE_PL_SYSTEM) {  		long timeout = dma_resv_wait_timeout(ttm_bo->base.resv,  						     DMA_RESV_USAGE_BOOKKEEP, -						     true, +						     false,  						     MAX_SCHEDULE_TIMEOUT);  		if (timeout < 0) {  			ret = timeout; @@ -848,8 +848,16 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,  out:  	if ((!ttm_bo->resource || ttm_bo->resource->mem_type == XE_PL_SYSTEM) && -	    ttm_bo->ttm) +	    ttm_bo->ttm) { +		long timeout = dma_resv_wait_timeout(ttm_bo->base.resv, +						     DMA_RESV_USAGE_KERNEL, +						     false, +						     MAX_SCHEDULE_TIMEOUT); +		if (timeout < 0) +			ret = timeout; +  		xe_tt_unmap_sg(ttm_bo->ttm); +	}  	return ret;  } diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c b/drivers/gpu/drm/xe/xe_devcoredump.c index 0b0cd6aa1d9f..21a50d539426 100644 --- a/drivers/gpu/drm/xe/xe_devcoredump.c +++ b/drivers/gpu/drm/xe/xe_devcoredump.c @@ -109,7 +109,11 @@ static ssize_t __xe_devcoredump_read(char *buffer, size_t count,  	drm_puts(&p, "\n**** GuC CT ****\n");  	xe_guc_ct_snapshot_print(ss->guc.ct, &p); -	drm_puts(&p, "\n**** Contexts ****\n"); +	/* +	 * Don't add a new section header here because the mesa debug decoder +	 * tool expects the context information to be in the 'GuC CT' section. +	 */ +	/* drm_puts(&p, "\n**** Contexts ****\n"); */  	xe_guc_exec_queue_snapshot_print(ss->ge, &p);  	drm_puts(&p, "\n**** Job ****\n"); @@ -155,36 +159,6 @@ static void xe_devcoredump_snapshot_free(struct xe_devcoredump_snapshot *ss)  	ss->vm = NULL;  } -static void xe_devcoredump_deferred_snap_work(struct work_struct *work) -{ -	struct xe_devcoredump_snapshot *ss = container_of(work, typeof(*ss), work); -	struct xe_devcoredump *coredump = container_of(ss, typeof(*coredump), snapshot); -	struct xe_device *xe = coredump_to_xe(coredump); -	unsigned int fw_ref; - -	xe_pm_runtime_get(xe); - -	/* keep going if fw fails as we still want to save the memory and SW data */ -	fw_ref = xe_force_wake_get(gt_to_fw(ss->gt), XE_FORCEWAKE_ALL); -	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) -		xe_gt_info(ss->gt, "failed to get forcewake for coredump capture\n"); -	xe_vm_snapshot_capture_delayed(ss->vm); -	xe_guc_exec_queue_snapshot_capture_delayed(ss->ge); -	xe_force_wake_put(gt_to_fw(ss->gt), fw_ref); - -	xe_pm_runtime_put(xe); - -	/* Calculate devcoredump size */ -	ss->read.size = __xe_devcoredump_read(NULL, INT_MAX, coredump); - -	ss->read.buffer = kvmalloc(ss->read.size, GFP_USER); -	if (!ss->read.buffer) -		return; - -	__xe_devcoredump_read(ss->read.buffer, ss->read.size, coredump); -	xe_devcoredump_snapshot_free(ss); -} -  static ssize_t xe_devcoredump_read(char *buffer, loff_t offset,  				   size_t count, void *data, size_t datalen)  { @@ -234,6 +208,45 @@ static void xe_devcoredump_free(void *data)  		 "Xe device coredump has been deleted.\n");  } +static void xe_devcoredump_deferred_snap_work(struct work_struct *work) +{ +	struct xe_devcoredump_snapshot *ss = container_of(work, typeof(*ss), work); +	struct xe_devcoredump *coredump = container_of(ss, typeof(*coredump), snapshot); +	struct xe_device *xe = coredump_to_xe(coredump); +	unsigned int fw_ref; + +	/* +	 * NB: Despite passing a GFP_ flags parameter here, more allocations are done +	 * internally using GFP_KERNEL expliictly. Hence this call must be in the worker +	 * thread and not in the initial capture call. +	 */ +	dev_coredumpm_timeout(gt_to_xe(ss->gt)->drm.dev, THIS_MODULE, coredump, 0, GFP_KERNEL, +			      xe_devcoredump_read, xe_devcoredump_free, +			      XE_COREDUMP_TIMEOUT_JIFFIES); + +	xe_pm_runtime_get(xe); + +	/* keep going if fw fails as we still want to save the memory and SW data */ +	fw_ref = xe_force_wake_get(gt_to_fw(ss->gt), XE_FORCEWAKE_ALL); +	if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) +		xe_gt_info(ss->gt, "failed to get forcewake for coredump capture\n"); +	xe_vm_snapshot_capture_delayed(ss->vm); +	xe_guc_exec_queue_snapshot_capture_delayed(ss->ge); +	xe_force_wake_put(gt_to_fw(ss->gt), fw_ref); + +	xe_pm_runtime_put(xe); + +	/* Calculate devcoredump size */ +	ss->read.size = __xe_devcoredump_read(NULL, INT_MAX, coredump); + +	ss->read.buffer = kvmalloc(ss->read.size, GFP_USER); +	if (!ss->read.buffer) +		return; + +	__xe_devcoredump_read(ss->read.buffer, ss->read.size, coredump); +	xe_devcoredump_snapshot_free(ss); +} +  static void devcoredump_snapshot(struct xe_devcoredump *coredump,  				 struct xe_sched_job *job)  { @@ -310,10 +323,6 @@ void xe_devcoredump(struct xe_sched_job *job)  	drm_info(&xe->drm, "Xe device coredump has been created\n");  	drm_info(&xe->drm, "Check your /sys/class/drm/card%d/device/devcoredump/data\n",  		 xe->drm.primary->index); - -	dev_coredumpm_timeout(xe->drm.dev, THIS_MODULE, coredump, 0, GFP_KERNEL, -			      xe_devcoredump_read, xe_devcoredump_free, -			      XE_COREDUMP_TIMEOUT_JIFFIES);  }  static void xe_driver_devcoredump_fini(void *arg) @@ -358,6 +367,15 @@ void xe_print_blob_ascii85(struct drm_printer *p, const char *prefix,  	char buff[ASCII85_BUFSZ], *line_buff;  	size_t line_pos = 0; +	/* +	 * Splitting blobs across multiple lines is not compatible with the mesa +	 * debug decoder tool. Note that even dropping the explicit '\n' below +	 * doesn't help because the GuC log is so big some underlying implementation +	 * still splits the lines at 512K characters. So just bail completely for +	 * the moment. +	 */ +	return; +  #define DMESG_MAX_LINE_LEN	800  #define MIN_SPACE		(ASCII85_BUFSZ + 2)		/* 85 + "\n\0" */ diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c index 68f309f5e981..c5b95470fa32 100644 --- a/drivers/gpu/drm/xe/xe_dma_buf.c +++ b/drivers/gpu/drm/xe/xe_dma_buf.c @@ -20,7 +20,7 @@  #include "xe_ttm_vram_mgr.h"  #include "xe_vm.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  static int xe_dma_buf_attach(struct dma_buf *dmabuf,  			     struct dma_buf_attachment *attach) diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c index fd0f3b3c9101..268cd3123be9 100644 --- a/drivers/gpu/drm/xe/xe_exec_queue.c +++ b/drivers/gpu/drm/xe/xe_exec_queue.c @@ -8,6 +8,7 @@  #include <linux/nospec.h>  #include <drm/drm_device.h> +#include <drm/drm_drv.h>  #include <drm/drm_file.h>  #include <uapi/drm/xe_drm.h> @@ -762,9 +763,11 @@ bool xe_exec_queue_is_idle(struct xe_exec_queue *q)   */  void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q)  { +	struct xe_device *xe = gt_to_xe(q->gt);  	struct xe_file *xef;  	struct xe_lrc *lrc;  	u32 old_ts, new_ts; +	int idx;  	/*  	 * Jobs that are run during driver load may use an exec_queue, but are @@ -774,6 +777,10 @@ void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q)  	if (!q->vm || !q->vm->xef)  		return; +	/* Synchronize with unbind while holding the xe file open */ +	if (!drm_dev_enter(&xe->drm, &idx)) +		return; +  	xef = q->vm->xef;  	/* @@ -787,6 +794,8 @@ void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q)  	lrc = q->lrc[0];  	new_ts = xe_lrc_update_timestamp(lrc, &old_ts);  	xef->run_ticks[q->class] += (new_ts - old_ts) * q->width; + +	drm_dev_exit(idx);  }  /** diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c index d6744be01a68..94d468d01253 100644 --- a/drivers/gpu/drm/xe/xe_gt.c +++ b/drivers/gpu/drm/xe/xe_gt.c @@ -387,6 +387,10 @@ int xe_gt_init_early(struct xe_gt *gt)  	xe_force_wake_init_gt(gt, gt_to_fw(gt));  	spin_lock_init(>->global_invl_lock); +	err = xe_gt_tlb_invalidation_init_early(gt); +	if (err) +		return err; +  	return 0;  } @@ -588,10 +592,6 @@ int xe_gt_init(struct xe_gt *gt)  		xe_hw_fence_irq_init(>->fence_irq[i]);  	} -	err = xe_gt_tlb_invalidation_init(gt); -	if (err) -		return err; -  	err = xe_gt_pagefault_init(gt);  	if (err)  		return err; diff --git a/drivers/gpu/drm/xe/xe_gt.h b/drivers/gpu/drm/xe/xe_gt.h index 82b9b7f82fca..eb2946963420 100644 --- a/drivers/gpu/drm/xe/xe_gt.h +++ b/drivers/gpu/drm/xe/xe_gt.h @@ -57,6 +57,31 @@ int xe_gt_sanitize_freq(struct xe_gt *gt);  void xe_gt_remove(struct xe_gt *gt);  /** + * xe_gt_wait_for_reset - wait for gt's async reset to finalize. + * @gt: GT structure + * Return: + * %true if it waited for the work to finish execution, + * %false if there was no scheduled reset or it was done. + */ +static inline bool xe_gt_wait_for_reset(struct xe_gt *gt) +{ +	return flush_work(>->reset.worker); +} + +/** + * xe_gt_reset - perform synchronous reset + * @gt: GT structure + * Return: + * %true if it waited for the reset to finish, + * %false if there was no scheduled reset. + */ +static inline bool xe_gt_reset(struct xe_gt *gt) +{ +	xe_gt_reset_async(gt); +	return xe_gt_wait_for_reset(gt); +} + +/**   * xe_gt_any_hw_engine_by_reset_domain - scan the list of engines and return the   * first that matches the same reset domain as @class   * @gt: GT structure diff --git a/drivers/gpu/drm/xe/xe_gt_ccs_mode.c b/drivers/gpu/drm/xe/xe_gt_ccs_mode.c index b6adfb9f2030..50fffc9ebf62 100644 --- a/drivers/gpu/drm/xe/xe_gt_ccs_mode.c +++ b/drivers/gpu/drm/xe/xe_gt_ccs_mode.c @@ -150,7 +150,7 @@ ccs_mode_store(struct device *kdev, struct device_attribute *attr,  		xe_gt_info(gt, "Setting compute mode to %d\n", num_engines);  		gt->ccs_mode = num_engines;  		xe_gt_record_user_engines(gt); -		xe_gt_reset_async(gt); +		xe_gt_reset(gt);  	}  	mutex_unlock(&xe->drm.filelist_mutex); diff --git a/drivers/gpu/drm/xe/xe_gt_debugfs.c b/drivers/gpu/drm/xe/xe_gt_debugfs.c index 3e8c351a0eab..e7792858b1e4 100644 --- a/drivers/gpu/drm/xe/xe_gt_debugfs.c +++ b/drivers/gpu/drm/xe/xe_gt_debugfs.c @@ -132,11 +132,9 @@ static int force_reset(struct xe_gt *gt, struct drm_printer *p)  static int force_reset_sync(struct xe_gt *gt, struct drm_printer *p)  {  	xe_pm_runtime_get(gt_to_xe(gt)); -	xe_gt_reset_async(gt); +	xe_gt_reset(gt);  	xe_pm_runtime_put(gt_to_xe(gt)); -	flush_work(>->reset.worker); -  	return 0;  } diff --git a/drivers/gpu/drm/xe/xe_gt_idle.c b/drivers/gpu/drm/xe/xe_gt_idle.c index fd80afeef56a..ffd3ba7f6656 100644 --- a/drivers/gpu/drm/xe/xe_gt_idle.c +++ b/drivers/gpu/drm/xe/xe_gt_idle.c @@ -122,10 +122,12 @@ void xe_gt_idle_enable_pg(struct xe_gt *gt)  	if (!xe_gt_is_media_type(gt))  		gtidle->powergate_enable |= RENDER_POWERGATE_ENABLE; -	for (i = XE_HW_ENGINE_VCS0, j = 0; i <= XE_HW_ENGINE_VCS7; ++i, ++j) { -		if ((gt->info.engine_mask & BIT(i))) -			gtidle->powergate_enable |= (VDN_HCP_POWERGATE_ENABLE(j) | -						     VDN_MFXVDENC_POWERGATE_ENABLE(j)); +	if (xe->info.platform != XE_DG1) { +		for (i = XE_HW_ENGINE_VCS0, j = 0; i <= XE_HW_ENGINE_VCS7; ++i, ++j) { +			if ((gt->info.engine_mask & BIT(i))) +				gtidle->powergate_enable |= (VDN_HCP_POWERGATE_ENABLE(j) | +							     VDN_MFXVDENC_POWERGATE_ENABLE(j)); +		}  	}  	fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT); diff --git a/drivers/gpu/drm/xe/xe_gt_mcr.c b/drivers/gpu/drm/xe/xe_gt_mcr.c index 5013d674e17d..d929a78c26a9 100644 --- a/drivers/gpu/drm/xe/xe_gt_mcr.c +++ b/drivers/gpu/drm/xe/xe_gt_mcr.c @@ -550,9 +550,9 @@ void xe_gt_mcr_set_implicit_defaults(struct xe_gt *gt)   * Returns true if the caller should steer to the @group/@instance values   * returned.  Returns false if the caller need not perform any steering   */ -static bool xe_gt_mcr_get_nonterminated_steering(struct xe_gt *gt, -						 struct xe_reg_mcr reg_mcr, -						 u8 *group, u8 *instance) +bool xe_gt_mcr_get_nonterminated_steering(struct xe_gt *gt, +					  struct xe_reg_mcr reg_mcr, +					  u8 *group, u8 *instance)  {  	const struct xe_reg reg = to_xe_reg(reg_mcr);  	const struct xe_mmio_range *implicit_ranges; diff --git a/drivers/gpu/drm/xe/xe_gt_mcr.h b/drivers/gpu/drm/xe/xe_gt_mcr.h index c0cd36021c24..bc06520befab 100644 --- a/drivers/gpu/drm/xe/xe_gt_mcr.h +++ b/drivers/gpu/drm/xe/xe_gt_mcr.h @@ -26,6 +26,10 @@ void xe_gt_mcr_unicast_write(struct xe_gt *gt, struct xe_reg_mcr mcr_reg,  void xe_gt_mcr_multicast_write(struct xe_gt *gt, struct xe_reg_mcr mcr_reg,  			       u32 value); +bool xe_gt_mcr_get_nonterminated_steering(struct xe_gt *gt, +					  struct xe_reg_mcr reg_mcr, +					  u8 *group, u8 *instance); +  void xe_gt_mcr_steering_dump(struct xe_gt *gt, struct drm_printer *p);  void xe_gt_mcr_get_dss_steering(struct xe_gt *gt, unsigned int dss, u16 *group, u16 *instance);  u32 xe_gt_mcr_steering_info_to_dss_id(struct xe_gt *gt, u16 group, u16 instance); diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c index 192643d63d22..ca49860168f6 100644 --- a/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c +++ b/drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c @@ -2046,7 +2046,7 @@ static int pf_validate_vf_config(struct xe_gt *gt, unsigned int vfid)  	valid_any = valid_any || (valid_ggtt && is_primary);  	if (IS_DGFX(xe)) { -		bool valid_lmem = pf_get_vf_config_ggtt(primary_gt, vfid); +		bool valid_lmem = pf_get_vf_config_lmem(primary_gt, vfid);  		valid_any = valid_any || (valid_lmem && is_primary);  		valid_all = valid_all && valid_lmem; diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c index 3cb228c773cd..0a0af413770e 100644 --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c @@ -65,6 +65,14 @@ invalidation_fence_signal(struct xe_device *xe, struct xe_gt_tlb_invalidation_fe  	__invalidation_fence_signal(xe, fence);  } +void xe_gt_tlb_invalidation_fence_signal(struct xe_gt_tlb_invalidation_fence *fence) +{ +	if (WARN_ON_ONCE(!fence->gt)) +		return; + +	__invalidation_fence_signal(gt_to_xe(fence->gt), fence); +} +  static void xe_gt_tlb_fence_timeout(struct work_struct *work)  {  	struct xe_gt *gt = container_of(work, struct xe_gt, @@ -98,7 +106,7 @@ static void xe_gt_tlb_fence_timeout(struct work_struct *work)  }  /** - * xe_gt_tlb_invalidation_init - Initialize GT TLB invalidation state + * xe_gt_tlb_invalidation_init_early - Initialize GT TLB invalidation state   * @gt: graphics tile   *   * Initialize GT TLB invalidation state, purely software initialization, should @@ -106,7 +114,7 @@ static void xe_gt_tlb_fence_timeout(struct work_struct *work)   *   * Return: 0 on success, negative error code on error.   */ -int xe_gt_tlb_invalidation_init(struct xe_gt *gt) +int xe_gt_tlb_invalidation_init_early(struct xe_gt *gt)  {  	gt->tlb_invalidation.seqno = 1;  	INIT_LIST_HEAD(>->tlb_invalidation.pending_fences); diff --git a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h index f430d5797af7..672acfcdf0d7 100644 --- a/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h +++ b/drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h @@ -14,7 +14,8 @@ struct xe_gt;  struct xe_guc;  struct xe_vma; -int xe_gt_tlb_invalidation_init(struct xe_gt *gt); +int xe_gt_tlb_invalidation_init_early(struct xe_gt *gt); +  void xe_gt_tlb_invalidation_reset(struct xe_gt *gt);  int xe_gt_tlb_invalidation_ggtt(struct xe_gt *gt);  int xe_gt_tlb_invalidation_vma(struct xe_gt *gt, @@ -28,6 +29,7 @@ int xe_guc_tlb_invalidation_done_handler(struct xe_guc *guc, u32 *msg, u32 len);  void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,  				       struct xe_gt_tlb_invalidation_fence *fence,  				       bool stack); +void xe_gt_tlb_invalidation_fence_signal(struct xe_gt_tlb_invalidation_fence *fence);  static inline void  xe_gt_tlb_invalidation_fence_wait(struct xe_gt_tlb_invalidation_fence *fence) diff --git a/drivers/gpu/drm/xe/xe_guc_ads.c b/drivers/gpu/drm/xe/xe_guc_ads.c index 4e746ae98888..dd7f9d0effa9 100644 --- a/drivers/gpu/drm/xe/xe_guc_ads.c +++ b/drivers/gpu/drm/xe/xe_guc_ads.c @@ -29,6 +29,7 @@  #include "xe_platform_types.h"  #include "xe_uc_fw.h"  #include "xe_wa.h" +#include "xe_gt_mcr.h"  /* Slack of a few additional entries per engine */  #define ADS_REGSET_EXTRA_MAX	8 @@ -701,6 +702,20 @@ static void guc_mmio_regset_write_one(struct xe_guc_ads *ads,  		.flags = reg.masked ? GUC_REGSET_MASKED : 0,  	}; +	if (reg.mcr) { +		struct xe_reg_mcr mcr_reg = XE_REG_MCR(reg.addr); +		u8 group, instance; + +		bool steer = xe_gt_mcr_get_nonterminated_steering(ads_to_gt(ads), mcr_reg, +								  &group, &instance); + +		if (steer) { +			entry.flags |= FIELD_PREP(GUC_REGSET_STEERING_GROUP, group); +			entry.flags |= FIELD_PREP(GUC_REGSET_STEERING_INSTANCE, instance); +			entry.flags |= GUC_REGSET_STEERING_NEEDED; +		} +	} +  	xe_map_memcpy_to(ads_to_xe(ads), regset_map, n_entry * sizeof(entry),  			 &entry, sizeof(entry));  } diff --git a/drivers/gpu/drm/xe/xe_guc_capture.c b/drivers/gpu/drm/xe/xe_guc_capture.c index cc72446a5de1..d63912d28246 100644 --- a/drivers/gpu/drm/xe/xe_guc_capture.c +++ b/drivers/gpu/drm/xe/xe_guc_capture.c @@ -102,6 +102,7 @@ struct __guc_capture_parsed_output {   *                   A 64 bit register define requires 2 consecutive entries,   *                   with low dword first and hi dword the second.   *     2. Register name: null for incompleted define + *     3. Incorrect order will trigger XE_WARN.   */  #define COMMON_XELP_BASE_GLOBAL \  	{ FORCEWAKE_GT,			REG_32BIT,	0,	0,	"FORCEWAKE_GT"} @@ -1675,10 +1676,10 @@ snapshot_print_by_list_order(struct xe_hw_engine_snapshot *snapshot, struct drm_  	struct xe_devcoredump *devcoredump = &xe->devcoredump;  	struct xe_devcoredump_snapshot *devcore_snapshot = &devcoredump->snapshot;  	struct gcap_reg_list_info *reginfo = NULL; -	u32 last_value, i; -	bool is_ext; +	u32 i, last_value = 0; +	bool is_ext, low32_ready = false; -	if (!list || list->num_regs == 0) +	if (!list || !list->list || list->num_regs == 0)  		return;  	XE_WARN_ON(!devcore_snapshot->matched_node); @@ -1701,29 +1702,75 @@ snapshot_print_by_list_order(struct xe_hw_engine_snapshot *snapshot, struct drm_  			continue;  		value = reg->value; -		if (reg_desc->data_type == REG_64BIT_LOW_DW) { +		switch (reg_desc->data_type) { +		case REG_64BIT_LOW_DW:  			last_value = value; + +			/* +			 * A 64 bit register define requires 2 consecutive +			 * entries in register list, with low dword first +			 * and hi dword the second, like: +			 *  { XXX_REG_LO(0), REG_64BIT_LOW_DW, 0, 0, NULL}, +			 *  { XXX_REG_HI(0), REG_64BIT_HI_DW,  0, 0, "XXX_REG"}, +			 * +			 * Incorrect order will trigger XE_WARN. +			 * +			 * Possible double low here, for example: +			 *  { XXX_REG_LO(0), REG_64BIT_LOW_DW, 0, 0, NULL}, +			 *  { XXX_REG_LO(0), REG_64BIT_LOW_DW, 0, 0, NULL}, +			 */ +			XE_WARN_ON(low32_ready); +			low32_ready = true;  			/* Low 32 bit dword saved, continue for high 32 bit */ -			continue; -		} else if (reg_desc->data_type == REG_64BIT_HI_DW) { +			break; + +		case REG_64BIT_HI_DW: {  			u64 value_qw = ((u64)value << 32) | last_value; +			/* +			 * Incorrect 64bit register order. Possible missing low. +			 * for example: +			 *  { XXX_REG(0), REG_32BIT, 0, 0, NULL}, +			 *  { XXX_REG_HI(0), REG_64BIT_HI_DW, 0, 0, NULL}, +			 */ +			XE_WARN_ON(!low32_ready); +			low32_ready = false; +  			drm_printf(p, "\t%s: 0x%016llx\n", reg_desc->regname, value_qw); -			continue; +			break;  		} -		if (is_ext) { -			int dss, group, instance; +		case REG_32BIT: +			/* +			 * Incorrect 64bit register order. Possible missing high. +			 * for example: +			 *  { XXX_REG_LO(0), REG_64BIT_LOW_DW, 0, 0, NULL}, +			 *  { XXX_REG(0), REG_32BIT, 0, 0, "XXX_REG"}, +			 */ +			XE_WARN_ON(low32_ready); + +			if (is_ext) { +				int dss, group, instance; -			group = FIELD_GET(GUC_REGSET_STEERING_GROUP, reg_desc->flags); -			instance = FIELD_GET(GUC_REGSET_STEERING_INSTANCE, reg_desc->flags); -			dss = xe_gt_mcr_steering_info_to_dss_id(gt, group, instance); +				group = FIELD_GET(GUC_REGSET_STEERING_GROUP, reg_desc->flags); +				instance = FIELD_GET(GUC_REGSET_STEERING_INSTANCE, reg_desc->flags); +				dss = xe_gt_mcr_steering_info_to_dss_id(gt, group, instance); -			drm_printf(p, "\t%s[%u]: 0x%08x\n", reg_desc->regname, dss, value); -		} else { -			drm_printf(p, "\t%s: 0x%08x\n", reg_desc->regname, value); +				drm_printf(p, "\t%s[%u]: 0x%08x\n", reg_desc->regname, dss, value); +			} else { +				drm_printf(p, "\t%s: 0x%08x\n", reg_desc->regname, value); +			} +			break;  		}  	} + +	/* +	 * Incorrect 64bit register order. Possible missing high. +	 * for example: +	 *  { XXX_REG_LO(0), REG_64BIT_LOW_DW, 0, 0, NULL}, +	 *  } // <- Register list end +	 */ +	XE_WARN_ON(low32_ready);  }  /** diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c index 1557acee3523..eeeb98f66982 100644 --- a/drivers/gpu/drm/xe/xe_hw_engine.c +++ b/drivers/gpu/drm/xe/xe_hw_engine.c @@ -419,7 +419,7 @@ hw_engine_setup_default_state(struct xe_hw_engine *hwe)  	 * Bspec: 72161  	 */  	const u8 mocs_write_idx = gt->mocs.uc_index; -	const u8 mocs_read_idx = hwe->class == XE_ENGINE_CLASS_COMPUTE && +	const u8 mocs_read_idx = hwe->class == XE_ENGINE_CLASS_COMPUTE && IS_DGFX(xe) &&  				 (GRAPHICS_VER(xe) >= 20 || xe->info.platform == XE_PVC) ?  				 gt->mocs.wb_index : gt->mocs.uc_index;  	u32 ring_cmd_cctl_val = REG_FIELD_PREP(CMD_CCTL_WRITE_OVERRIDE_MASK, mocs_write_idx) | diff --git a/drivers/gpu/drm/xe/xe_oa.c b/drivers/gpu/drm/xe/xe_oa.c index 8dd55798ab31..678fa40e4cea 100644 --- a/drivers/gpu/drm/xe/xe_oa.c +++ b/drivers/gpu/drm/xe/xe_oa.c @@ -74,12 +74,6 @@ struct xe_oa_config {  	struct rcu_head rcu;  }; -struct flex { -	struct xe_reg reg; -	u32 offset; -	u32 value; -}; -  struct xe_oa_open_param {  	struct xe_file *xef;  	u32 oa_unit_id; @@ -596,19 +590,38 @@ static __poll_t xe_oa_poll(struct file *file, poll_table *wait)  	return ret;  } +static void xe_oa_lock_vma(struct xe_exec_queue *q) +{ +	if (q->vm) { +		down_read(&q->vm->lock); +		xe_vm_lock(q->vm, false); +	} +} + +static void xe_oa_unlock_vma(struct xe_exec_queue *q) +{ +	if (q->vm) { +		xe_vm_unlock(q->vm); +		up_read(&q->vm->lock); +	} +} +  static struct dma_fence *xe_oa_submit_bb(struct xe_oa_stream *stream, enum xe_oa_submit_deps deps,  					 struct xe_bb *bb)  { +	struct xe_exec_queue *q = stream->exec_q ?: stream->k_exec_q;  	struct xe_sched_job *job;  	struct dma_fence *fence;  	int err = 0; -	/* Kernel configuration is issued on stream->k_exec_q, not stream->exec_q */ -	job = xe_bb_create_job(stream->k_exec_q, bb); +	xe_oa_lock_vma(q); + +	job = xe_bb_create_job(q, bb);  	if (IS_ERR(job)) {  		err = PTR_ERR(job);  		goto exit;  	} +	job->ggtt = true;  	if (deps == XE_OA_SUBMIT_ADD_DEPS) {  		for (int i = 0; i < stream->num_syncs && !err; i++) @@ -623,10 +636,13 @@ static struct dma_fence *xe_oa_submit_bb(struct xe_oa_stream *stream, enum xe_oa  	fence = dma_fence_get(&job->drm.s_fence->finished);  	xe_sched_job_push(job); +	xe_oa_unlock_vma(q); +  	return fence;  err_put_job:  	xe_sched_job_put(job);  exit: +	xe_oa_unlock_vma(q);  	return ERR_PTR(err);  } @@ -675,63 +691,19 @@ static void xe_oa_free_configs(struct xe_oa_stream *stream)  	dma_fence_put(stream->last_fence);  } -static void xe_oa_store_flex(struct xe_oa_stream *stream, struct xe_lrc *lrc, -			     struct xe_bb *bb, const struct flex *flex, u32 count) -{ -	u32 offset = xe_bo_ggtt_addr(lrc->bo); - -	do { -		bb->cs[bb->len++] = MI_STORE_DATA_IMM | MI_SDI_GGTT | MI_SDI_NUM_DW(1); -		bb->cs[bb->len++] = offset + flex->offset * sizeof(u32); -		bb->cs[bb->len++] = 0; -		bb->cs[bb->len++] = flex->value; - -	} while (flex++, --count); -} - -static int xe_oa_modify_ctx_image(struct xe_oa_stream *stream, struct xe_lrc *lrc, -				  const struct flex *flex, u32 count) -{ -	struct dma_fence *fence; -	struct xe_bb *bb; -	int err; - -	bb = xe_bb_new(stream->gt, 4 * count, false); -	if (IS_ERR(bb)) { -		err = PTR_ERR(bb); -		goto exit; -	} - -	xe_oa_store_flex(stream, lrc, bb, flex, count); - -	fence = xe_oa_submit_bb(stream, XE_OA_SUBMIT_NO_DEPS, bb); -	if (IS_ERR(fence)) { -		err = PTR_ERR(fence); -		goto free_bb; -	} -	xe_bb_free(bb, fence); -	dma_fence_put(fence); - -	return 0; -free_bb: -	xe_bb_free(bb, NULL); -exit: -	return err; -} - -static int xe_oa_load_with_lri(struct xe_oa_stream *stream, struct xe_oa_reg *reg_lri) +static int xe_oa_load_with_lri(struct xe_oa_stream *stream, struct xe_oa_reg *reg_lri, u32 count)  {  	struct dma_fence *fence;  	struct xe_bb *bb;  	int err; -	bb = xe_bb_new(stream->gt, 3, false); +	bb = xe_bb_new(stream->gt, 2 * count + 1, false);  	if (IS_ERR(bb)) {  		err = PTR_ERR(bb);  		goto exit;  	} -	write_cs_mi_lri(bb, reg_lri, 1); +	write_cs_mi_lri(bb, reg_lri, count);  	fence = xe_oa_submit_bb(stream, XE_OA_SUBMIT_NO_DEPS, bb);  	if (IS_ERR(fence)) { @@ -751,71 +723,55 @@ exit:  static int xe_oa_configure_oar_context(struct xe_oa_stream *stream, bool enable)  {  	const struct xe_oa_format *format = stream->oa_buffer.format; -	struct xe_lrc *lrc = stream->exec_q->lrc[0]; -	u32 regs_offset = xe_lrc_regs_offset(lrc) / sizeof(u32);  	u32 oacontrol = __format_to_oactrl(format, OAR_OACONTROL_COUNTER_SEL_MASK) |  		(enable ? OAR_OACONTROL_COUNTER_ENABLE : 0); -	struct flex regs_context[] = { +	struct xe_oa_reg reg_lri[] = {  		{  			OACTXCONTROL(stream->hwe->mmio_base), -			stream->oa->ctx_oactxctrl_offset[stream->hwe->class] + 1,  			enable ? OA_COUNTER_RESUME : 0,  		},  		{ +			OAR_OACONTROL, +			oacontrol, +		}, +		{  			RING_CONTEXT_CONTROL(stream->hwe->mmio_base), -			regs_offset + CTX_CONTEXT_CONTROL, -			_MASKED_BIT_ENABLE(CTX_CTRL_OAC_CONTEXT_ENABLE), +			_MASKED_FIELD(CTX_CTRL_OAC_CONTEXT_ENABLE, +				      enable ? CTX_CTRL_OAC_CONTEXT_ENABLE : 0)  		},  	}; -	struct xe_oa_reg reg_lri = { OAR_OACONTROL, oacontrol }; -	int err; - -	/* Modify stream hwe context image with regs_context */ -	err = xe_oa_modify_ctx_image(stream, stream->exec_q->lrc[0], -				     regs_context, ARRAY_SIZE(regs_context)); -	if (err) -		return err; -	/* Apply reg_lri using LRI */ -	return xe_oa_load_with_lri(stream, ®_lri); +	return xe_oa_load_with_lri(stream, reg_lri, ARRAY_SIZE(reg_lri));  }  static int xe_oa_configure_oac_context(struct xe_oa_stream *stream, bool enable)  {  	const struct xe_oa_format *format = stream->oa_buffer.format; -	struct xe_lrc *lrc = stream->exec_q->lrc[0]; -	u32 regs_offset = xe_lrc_regs_offset(lrc) / sizeof(u32);  	u32 oacontrol = __format_to_oactrl(format, OAR_OACONTROL_COUNTER_SEL_MASK) |  		(enable ? OAR_OACONTROL_COUNTER_ENABLE : 0); -	struct flex regs_context[] = { +	struct xe_oa_reg reg_lri[] = {  		{  			OACTXCONTROL(stream->hwe->mmio_base), -			stream->oa->ctx_oactxctrl_offset[stream->hwe->class] + 1,  			enable ? OA_COUNTER_RESUME : 0,  		},  		{ +			OAC_OACONTROL, +			oacontrol +		}, +		{  			RING_CONTEXT_CONTROL(stream->hwe->mmio_base), -			regs_offset + CTX_CONTEXT_CONTROL, -			_MASKED_BIT_ENABLE(CTX_CTRL_OAC_CONTEXT_ENABLE) | +			_MASKED_FIELD(CTX_CTRL_OAC_CONTEXT_ENABLE, +				      enable ? CTX_CTRL_OAC_CONTEXT_ENABLE : 0) |  			_MASKED_FIELD(CTX_CTRL_RUN_ALONE, enable ? CTX_CTRL_RUN_ALONE : 0),  		},  	}; -	struct xe_oa_reg reg_lri = { OAC_OACONTROL, oacontrol }; -	int err;  	/* Set ccs select to enable programming of OAC_OACONTROL */  	xe_mmio_write32(&stream->gt->mmio, __oa_regs(stream)->oa_ctrl,  			__oa_ccs_select(stream)); -	/* Modify stream hwe context image with regs_context */ -	err = xe_oa_modify_ctx_image(stream, stream->exec_q->lrc[0], -				     regs_context, ARRAY_SIZE(regs_context)); -	if (err) -		return err; - -	/* Apply reg_lri using LRI */ -	return xe_oa_load_with_lri(stream, ®_lri); +	return xe_oa_load_with_lri(stream, reg_lri, ARRAY_SIZE(reg_lri));  }  static int xe_oa_configure_oa_context(struct xe_oa_stream *stream, bool enable) @@ -2066,8 +2022,8 @@ int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *f  		if (XE_IOCTL_DBG(oa->xe, !param.exec_q))  			return -ENOENT; -		if (param.exec_q->width > 1) -			drm_dbg(&oa->xe->drm, "exec_q->width > 1, programming only exec_q->lrc[0]\n"); +		if (XE_IOCTL_DBG(oa->xe, param.exec_q->width > 1)) +			return -EOPNOTSUPP;  	}  	/* @@ -2242,6 +2198,7 @@ static const struct xe_mmio_range xe2_oa_mux_regs[] = {  	{ .start = 0x5194, .end = 0x5194 },	/* SYS_MEM_LAT_MEASURE_MERTF_GRP_3D */  	{ .start = 0x8704, .end = 0x8704 },	/* LMEM_LAT_MEASURE_MCFG_GRP */  	{ .start = 0xB1BC, .end = 0xB1BC },	/* L3_BANK_LAT_MEASURE_LBCF_GFX */ +	{ .start = 0xD0E0, .end = 0xD0F4 },	/* VISACTL */  	{ .start = 0xE18C, .end = 0xE18C },	/* SAMPLER_MODE */  	{ .start = 0xE590, .end = 0xE590 },	/* TDL_LSC_LAT_MEASURE_TDL_GFX */  	{ .start = 0x13000, .end = 0x137FC },	/* PES_0_PESL0 - PES_63_UPPER_PESL3 */ diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c index f27f579f4d85..797576690356 100644 --- a/drivers/gpu/drm/xe/xe_pt.c +++ b/drivers/gpu/drm/xe/xe_pt.c @@ -1333,8 +1333,7 @@ static void invalidation_fence_cb(struct dma_fence *fence,  		queue_work(system_wq, &ifence->work);  	} else {  		ifence->base.base.error = ifence->fence->error; -		dma_fence_signal(&ifence->base.base); -		dma_fence_put(&ifence->base.base); +		xe_gt_tlb_invalidation_fence_signal(&ifence->base);  	}  	dma_fence_put(ifence->fence);  } diff --git a/drivers/gpu/drm/xe/xe_reg_sr.c b/drivers/gpu/drm/xe/xe_reg_sr.c index e1a0e27cda14..c13123008e90 100644 --- a/drivers/gpu/drm/xe/xe_reg_sr.c +++ b/drivers/gpu/drm/xe/xe_reg_sr.c @@ -27,46 +27,27 @@  #include "xe_reg_whitelist.h"  #include "xe_rtp_types.h" -#define XE_REG_SR_GROW_STEP_DEFAULT	16 -  static void reg_sr_fini(struct drm_device *drm, void *arg)  {  	struct xe_reg_sr *sr = arg; +	struct xe_reg_sr_entry *entry; +	unsigned long reg; + +	xa_for_each(&sr->xa, reg, entry) +		kfree(entry);  	xa_destroy(&sr->xa); -	kfree(sr->pool.arr); -	memset(&sr->pool, 0, sizeof(sr->pool));  }  int xe_reg_sr_init(struct xe_reg_sr *sr, const char *name, struct xe_device *xe)  {  	xa_init(&sr->xa); -	memset(&sr->pool, 0, sizeof(sr->pool)); -	sr->pool.grow_step = XE_REG_SR_GROW_STEP_DEFAULT;  	sr->name = name;  	return drmm_add_action_or_reset(&xe->drm, reg_sr_fini, sr);  }  EXPORT_SYMBOL_IF_KUNIT(xe_reg_sr_init); -static struct xe_reg_sr_entry *alloc_entry(struct xe_reg_sr *sr) -{ -	if (sr->pool.used == sr->pool.allocated) { -		struct xe_reg_sr_entry *arr; - -		arr = krealloc_array(sr->pool.arr, -				     ALIGN(sr->pool.allocated + 1, sr->pool.grow_step), -				     sizeof(*arr), GFP_KERNEL); -		if (!arr) -			return NULL; - -		sr->pool.arr = arr; -		sr->pool.allocated += sr->pool.grow_step; -	} - -	return &sr->pool.arr[sr->pool.used++]; -} -  static bool compatible_entries(const struct xe_reg_sr_entry *e1,  			       const struct xe_reg_sr_entry *e2)  { @@ -112,7 +93,7 @@ int xe_reg_sr_add(struct xe_reg_sr *sr,  		return 0;  	} -	pentry = alloc_entry(sr); +	pentry = kmalloc(sizeof(*pentry), GFP_KERNEL);  	if (!pentry) {  		ret = -ENOMEM;  		goto fail; diff --git a/drivers/gpu/drm/xe/xe_reg_sr_types.h b/drivers/gpu/drm/xe/xe_reg_sr_types.h index ad48a52b824a..ebe11f237fa2 100644 --- a/drivers/gpu/drm/xe/xe_reg_sr_types.h +++ b/drivers/gpu/drm/xe/xe_reg_sr_types.h @@ -20,12 +20,6 @@ struct xe_reg_sr_entry {  };  struct xe_reg_sr { -	struct { -		struct xe_reg_sr_entry *arr; -		unsigned int used; -		unsigned int allocated; -		unsigned int grow_step; -	} pool;  	struct xarray xa;  	const char *name; diff --git a/drivers/gpu/drm/xe/xe_ring_ops.c b/drivers/gpu/drm/xe/xe_ring_ops.c index 0be4f489d3e1..9f327f27c072 100644 --- a/drivers/gpu/drm/xe/xe_ring_ops.c +++ b/drivers/gpu/drm/xe/xe_ring_ops.c @@ -221,7 +221,10 @@ static int emit_pipe_imm_ggtt(u32 addr, u32 value, bool stall_only, u32 *dw,  static u32 get_ppgtt_flag(struct xe_sched_job *job)  { -	return job->q->vm ? BIT(8) : 0; +	if (job->q->vm && !job->ggtt) +		return BIT(8); + +	return 0;  }  static int emit_copy_timestamp(struct xe_lrc *lrc, u32 *dw, int i) diff --git a/drivers/gpu/drm/xe/xe_sched_job_types.h b/drivers/gpu/drm/xe/xe_sched_job_types.h index f13f333f00be..d942b20a9f29 100644 --- a/drivers/gpu/drm/xe/xe_sched_job_types.h +++ b/drivers/gpu/drm/xe/xe_sched_job_types.h @@ -56,6 +56,8 @@ struct xe_sched_job {  	u32 migrate_flush_flags;  	/** @ring_ops_flush_tlb: The ring ops need to flush TLB before payload. */  	bool ring_ops_flush_tlb; +	/** @ggtt: mapped in ggtt. */ +	bool ggtt;  	/** @ptrs: per instance pointers. */  	struct xe_job_ptrs ptrs[];  }; diff --git a/drivers/gpu/drm/xlnx/zynqmp_dpsub.c b/drivers/gpu/drm/xlnx/zynqmp_dpsub.c index f5781939de9c..07c4d184e7a1 100644 --- a/drivers/gpu/drm/xlnx/zynqmp_dpsub.c +++ b/drivers/gpu/drm/xlnx/zynqmp_dpsub.c @@ -320,7 +320,7 @@ MODULE_DEVICE_TABLE(of, zynqmp_dpsub_of_match);  static struct platform_driver zynqmp_dpsub_driver = {  	.probe			= zynqmp_dpsub_probe, -	.remove_new		= zynqmp_dpsub_remove, +	.remove			= zynqmp_dpsub_remove,  	.shutdown		= zynqmp_dpsub_shutdown,  	.driver			= {  		.name		= "zynqmp-dpsub", diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c index be2ad7203d7b..7b1d091f3c09 100644 --- a/drivers/gpu/host1x/dev.c +++ b/drivers/gpu/host1x/dev.c @@ -769,7 +769,7 @@ static struct platform_driver tegra_host1x_driver = {  		.pm = &host1x_pm_ops,  	},  	.probe = host1x_probe, -	.remove_new = host1x_remove, +	.remove = host1x_remove,  };  static struct platform_driver * const drivers[] = { diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c index 3535be9daa1f..947323f4a234 100644 --- a/drivers/gpu/ipu-v3/ipu-common.c +++ b/drivers/gpu/ipu-v3/ipu-common.c @@ -1467,7 +1467,7 @@ static struct platform_driver imx_ipu_driver = {  		.of_match_table = imx_ipu_dt_ids,  	},  	.probe = ipu_probe, -	.remove_new = ipu_remove, +	.remove = ipu_remove,  };  static struct platform_driver * const drivers[] = { diff --git a/drivers/gpu/ipu-v3/ipu-pre.c b/drivers/gpu/ipu-v3/ipu-pre.c index 41bd5dbd7356..7aac70368b00 100644 --- a/drivers/gpu/ipu-v3/ipu-pre.c +++ b/drivers/gpu/ipu-v3/ipu-pre.c @@ -374,7 +374,7 @@ static const struct of_device_id ipu_pre_dt_ids[] = {  struct platform_driver ipu_pre_drv = {  	.probe		= ipu_pre_probe, -	.remove_new	= ipu_pre_remove, +	.remove		= ipu_pre_remove,  	.driver		= {  		.name	= "imx-ipu-pre",  		.of_match_table = ipu_pre_dt_ids, diff --git a/drivers/gpu/ipu-v3/ipu-prg.c b/drivers/gpu/ipu-v3/ipu-prg.c index afb2d72e9175..d38d3ba54d72 100644 --- a/drivers/gpu/ipu-v3/ipu-prg.c +++ b/drivers/gpu/ipu-v3/ipu-prg.c @@ -469,7 +469,7 @@ static const struct of_device_id ipu_prg_dt_ids[] = {  struct platform_driver ipu_prg_drv = {  	.probe		= ipu_prg_probe, -	.remove_new	= ipu_prg_remove, +	.remove		= ipu_prg_remove,  	.driver		= {  		.name	= "imx-ipu-prg",  		.pm	= &prg_pm_ops, diff --git a/drivers/hid/bpf/hid_bpf_dispatch.c b/drivers/hid/bpf/hid_bpf_dispatch.c index 961b7f35aa67..2e96ec6a3073 100644 --- a/drivers/hid/bpf/hid_bpf_dispatch.c +++ b/drivers/hid/bpf/hid_bpf_dispatch.c @@ -19,7 +19,7 @@  #include <linux/module.h>  #include "hid_bpf_dispatch.h" -struct hid_ops *hid_ops; +const struct hid_ops *hid_ops;  EXPORT_SYMBOL(hid_ops);  u8 * @@ -352,7 +352,6 @@ __hid_bpf_hw_check_params(struct hid_bpf_ctx *ctx, __u8 *buf, size_t *buf__sz,  {  	struct hid_report_enum *report_enum;  	struct hid_report *report; -	struct hid_device *hdev;  	u32 report_len;  	/* check arguments */ @@ -371,9 +370,7 @@ __hid_bpf_hw_check_params(struct hid_bpf_ctx *ctx, __u8 *buf, size_t *buf__sz,  	if (*buf__sz < 1)  		return -EINVAL; -	hdev = (struct hid_device *)ctx->hid; /* discard const */ - -	report_enum = hdev->report_enum + rtype; +	report_enum = ctx->hid->report_enum + rtype;  	report = hid_ops->hid_get_report(report_enum, buf);  	if (!report)  		return -EINVAL; @@ -402,7 +399,6 @@ hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz,  		   enum hid_report_type rtype, enum hid_class_request reqtype)  {  	struct hid_bpf_ctx_kern *ctx_kern; -	struct hid_device *hdev;  	size_t size = buf__sz;  	u8 *dma_data;  	int ret; @@ -429,13 +425,11 @@ hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz,  		return -EINVAL;  	} -	hdev = (struct hid_device *)ctx->hid; /* discard const */ -  	dma_data = kmemdup(buf, size, GFP_KERNEL);  	if (!dma_data)  		return -ENOMEM; -	ret = hid_ops->hid_hw_raw_request(hdev, +	ret = hid_ops->hid_hw_raw_request(ctx->hid,  					      dma_data[0],  					      dma_data,  					      size, @@ -464,7 +458,6 @@ __bpf_kfunc int  hid_bpf_hw_output_report(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz)  {  	struct hid_bpf_ctx_kern *ctx_kern; -	struct hid_device *hdev;  	size_t size = buf__sz;  	u8 *dma_data;  	int ret; @@ -478,13 +471,11 @@ hid_bpf_hw_output_report(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz)  	if (ret)  		return ret; -	hdev = (struct hid_device *)ctx->hid; /* discard const */ -  	dma_data = kmemdup(buf, size, GFP_KERNEL);  	if (!dma_data)  		return -ENOMEM; -	ret = hid_ops->hid_hw_output_report(hdev, dma_data, size, (u64)(long)ctx, true); +	ret = hid_ops->hid_hw_output_report(ctx->hid, dma_data, size, (u64)(long)ctx, true);  	kfree(dma_data);  	return ret; diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 98bef39642a9..33a191973324 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -3064,7 +3064,7 @@ int hid_check_keys_pressed(struct hid_device *hid)  EXPORT_SYMBOL_GPL(hid_check_keys_pressed);  #ifdef CONFIG_HID_BPF -static struct hid_ops __hid_ops = { +static const struct hid_ops __hid_ops = {  	.hid_get_report = hid_get_report,  	.hid_hw_raw_request = __hid_hw_raw_request,  	.hid_hw_output_report = __hid_hw_output_report, diff --git a/drivers/hid/hid-google-hammer.c b/drivers/hid/hid-google-hammer.c index 22683ec819aa..0f292b5d3e26 100644 --- a/drivers/hid/hid-google-hammer.c +++ b/drivers/hid/hid-google-hammer.c @@ -284,7 +284,7 @@ MODULE_DEVICE_TABLE(of, cbas_ec_of_match);  static struct platform_driver cbas_ec_driver = {  	.probe = cbas_ec_probe, -	.remove_new = cbas_ec_remove, +	.remove = cbas_ec_remove,  	.driver = {  		.name = "cbas_ec",  		.acpi_match_table = ACPI_PTR(cbas_ec_acpi_ids), diff --git a/drivers/hid/hid-sensor-custom.c b/drivers/hid/hid-sensor-custom.c index 617ae240396d..761760668f6d 100644 --- a/drivers/hid/hid-sensor-custom.c +++ b/drivers/hid/hid-sensor-custom.c @@ -1065,7 +1065,7 @@ static struct platform_driver hid_sensor_custom_platform_driver = {  		.name	= KBUILD_MODNAME,  	},  	.probe		= hid_sensor_custom_probe, -	.remove_new	= hid_sensor_custom_remove, +	.remove		= hid_sensor_custom_remove,  };  module_platform_driver(hid_sensor_custom_platform_driver); diff --git a/drivers/hid/hid-uclogic-rdesc-test.c b/drivers/hid/hid-uclogic-rdesc-test.c index d6b18213f45f..066df622b6f2 100644 --- a/drivers/hid/hid-uclogic-rdesc-test.c +++ b/drivers/hid/hid-uclogic-rdesc-test.c @@ -9,7 +9,7 @@  #include <kunit/test.h>  #include "./hid-uclogic-rdesc.h" -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");  struct uclogic_template_case {  	const char *name; diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c index 43664a24176f..4e87380d3edd 100644 --- a/drivers/hid/i2c-hid/i2c-hid-core.c +++ b/drivers/hid/i2c-hid/i2c-hid-core.c @@ -414,7 +414,19 @@ static int i2c_hid_set_power(struct i2c_hid *ihid, int power_state)  	i2c_hid_dbg(ihid, "%s\n", __func__); +	/* +	 * Some STM-based devices need 400µs after a rising clock edge to wake +	 * from deep sleep, in which case the first request will fail due to +	 * the address not being acknowledged. Try after a short sleep to see +	 * if the device came alive on the bus. Certain Weida Tech devices also +	 * need this. +	 */  	ret = i2c_hid_set_power_command(ihid, power_state); +	if (ret && power_state == I2C_HID_PWR_ON) { +		usleep_range(400, 500); +		ret = i2c_hid_set_power_command(ihid, I2C_HID_PWR_ON); +	} +  	if (ret)  		dev_err(&ihid->client->dev,  			"failed to change power setting.\n"); @@ -976,14 +988,6 @@ static int i2c_hid_core_resume(struct i2c_hid *ihid)  	enable_irq(client->irq); -	/* Make sure the device is awake on the bus */ -	ret = i2c_hid_probe_address(ihid); -	if (ret < 0) { -		dev_err(&client->dev, "nothing at address after resume: %d\n", -			ret); -		return -ENXIO; -	} -  	/* On Goodix 27c6:0d42 wait extra time before device wakeup.  	 * It's not clear why but if we send wakeup too early, the device will  	 * never trigger input interrupts. diff --git a/drivers/hid/surface-hid/surface_kbd.c b/drivers/hid/surface-hid/surface_kbd.c index 383200d9121a..0be01b5e7425 100644 --- a/drivers/hid/surface-hid/surface_kbd.c +++ b/drivers/hid/surface-hid/surface_kbd.c @@ -284,7 +284,7 @@ MODULE_DEVICE_TABLE(acpi, surface_kbd_match);  static struct platform_driver surface_kbd_driver = {  	.probe = surface_kbd_probe, -	.remove_new = surface_kbd_remove, +	.remove = surface_kbd_remove,  	.driver = {  		.name = "surface_keyboard",  		.acpi_match_table = surface_kbd_match, diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 2bc45b24075c..9843b52bd017 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -2241,7 +2241,8 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)  		if (hid_is_usb(wacom->hdev)) {  			struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent);  			struct usb_device *dev = interface_to_usbdev(intf); -			product_name = dev->product; +			if (dev->product != NULL) +				product_name = dev->product;  		}  		if (wacom->hdev->bus == BUS_I2C) { diff --git a/drivers/hsi/controllers/omap_ssi_core.c b/drivers/hsi/controllers/omap_ssi_core.c index 15cb759151e6..eeacc427fd65 100644 --- a/drivers/hsi/controllers/omap_ssi_core.c +++ b/drivers/hsi/controllers/omap_ssi_core.c @@ -607,7 +607,7 @@ MODULE_DEVICE_TABLE(of, omap_ssi_of_match);  static struct platform_driver ssi_pdriver = {  	.probe = ssi_probe, -	.remove_new = ssi_remove, +	.remove = ssi_remove,  	.driver	= {  		.name	= "omap_ssi",  		.pm     = DEV_PM_OPS, diff --git a/drivers/hsi/controllers/omap_ssi_port.c b/drivers/hsi/controllers/omap_ssi_port.c index f0b3eca7376e..aeb92b803a17 100644 --- a/drivers/hsi/controllers/omap_ssi_port.c +++ b/drivers/hsi/controllers/omap_ssi_port.c @@ -1385,7 +1385,7 @@ MODULE_DEVICE_TABLE(of, omap_ssi_port_of_match);  struct platform_driver ssi_port_pdriver = {  	.probe = ssi_port_probe, -	.remove_new = ssi_port_remove, +	.remove = ssi_port_remove,  	.driver	= {  		.name	= "omap_ssi_port",  		.of_match_table = omap_ssi_port_of_match, diff --git a/drivers/hte/hte-tegra194-test.c b/drivers/hte/hte-tegra194-test.c index df631b5100d2..f890b79723af 100644 --- a/drivers/hte/hte-tegra194-test.c +++ b/drivers/hte/hte-tegra194-test.c @@ -226,7 +226,7 @@ static void tegra_hte_test_remove(struct platform_device *pdev)  static struct platform_driver tegra_hte_test_driver = {  	.probe = tegra_hte_test_probe, -	.remove_new = tegra_hte_test_remove, +	.remove = tegra_hte_test_remove,  	.driver = {  		.name = "tegra_hte_test",  		.of_match_table = tegra_hte_test_of_match, diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c index c38dcdfcb914..a99112e6f0b8 100644 --- a/drivers/hv/hv_balloon.c +++ b/drivers/hv/hv_balloon.c @@ -756,7 +756,7 @@ static void hv_mem_hot_add(unsigned long start, unsigned long size,  		 * adding succeeded, it is ok to proceed even if the memory was  		 * not onlined in time.  		 */ -		wait_for_completion_timeout(&dm_device.ol_waitevent, 5 * HZ); +		wait_for_completion_timeout(&dm_device.ol_waitevent, secs_to_jiffies(5));  		post_status(&dm_device);  	}  } @@ -1373,7 +1373,8 @@ static int dm_thread_func(void *dm_dev)  	struct hv_dynmem_device *dm = dm_dev;  	while (!kthread_should_stop()) { -		wait_for_completion_interruptible_timeout(&dm_device.config_event, 1 * HZ); +		wait_for_completion_interruptible_timeout(&dm_device.config_event, +								secs_to_jiffies(1));  		/*  		 * The host expects us to post information on the memory  		 * pressure every second. @@ -1748,7 +1749,7 @@ static int balloon_connect_vsp(struct hv_device *dev)  	if (ret)  		goto out; -	t = wait_for_completion_timeout(&dm_device.host_event, 5 * HZ); +	t = wait_for_completion_timeout(&dm_device.host_event, secs_to_jiffies(5));  	if (t == 0) {  		ret = -ETIMEDOUT;  		goto out; @@ -1806,7 +1807,7 @@ static int balloon_connect_vsp(struct hv_device *dev)  	if (ret)  		goto out; -	t = wait_for_completion_timeout(&dm_device.host_event, 5 * HZ); +	t = wait_for_completion_timeout(&dm_device.host_event, secs_to_jiffies(5));  	if (t == 0) {  		ret = -ETIMEDOUT;  		goto out; diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c index d35b60c06114..7400a5a4d2bd 100644 --- a/drivers/hv/hv_kvp.c +++ b/drivers/hv/hv_kvp.c @@ -655,7 +655,7 @@ void hv_kvp_onchannelcallback(void *context)  		if (host_negotiatied == NEGO_NOT_STARTED) {  			host_negotiatied = NEGO_IN_PROGRESS;  			schedule_delayed_work(&kvp_host_handshake_work, -				      HV_UTIL_NEGO_TIMEOUT * HZ); +						secs_to_jiffies(HV_UTIL_NEGO_TIMEOUT));  		}  		return;  	} @@ -724,7 +724,7 @@ void hv_kvp_onchannelcallback(void *context)  		 */  		schedule_work(&kvp_sendkey_work);  		schedule_delayed_work(&kvp_timeout_work, -					HV_UTIL_TIMEOUT * HZ); +				      secs_to_jiffies(HV_UTIL_TIMEOUT));  		return; @@ -767,6 +767,12 @@ hv_kvp_init(struct hv_util_service *srv)  	 */  	kvp_transaction.state = HVUTIL_DEVICE_INIT; +	return 0; +} + +int +hv_kvp_init_transport(void) +{  	hvt = hvutil_transport_init(kvp_devname, CN_KVP_IDX, CN_KVP_VAL,  				    kvp_on_msg, kvp_on_reset);  	if (!hvt) diff --git a/drivers/hv/hv_snapshot.c b/drivers/hv/hv_snapshot.c index 0d2184be1691..bde637a96c37 100644 --- a/drivers/hv/hv_snapshot.c +++ b/drivers/hv/hv_snapshot.c @@ -193,7 +193,8 @@ static void vss_send_op(void)  	vss_transaction.state = HVUTIL_USERSPACE_REQ;  	schedule_delayed_work(&vss_timeout_work, op == VSS_OP_FREEZE ? -			VSS_FREEZE_TIMEOUT * HZ : HV_UTIL_TIMEOUT * HZ); +				secs_to_jiffies(VSS_FREEZE_TIMEOUT) : +				secs_to_jiffies(HV_UTIL_TIMEOUT));  	rc = hvutil_transport_send(hvt, vss_msg, sizeof(*vss_msg), NULL);  	if (rc) { @@ -388,6 +389,12 @@ hv_vss_init(struct hv_util_service *srv)  	 */  	vss_transaction.state = HVUTIL_DEVICE_INIT; +	return 0; +} + +int +hv_vss_init_transport(void) +{  	hvt = hvutil_transport_init(vss_devname, CN_VSS_IDX, CN_VSS_VAL,  				    vss_on_msg, vss_on_reset);  	if (!hvt) { diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c index c4f525325790..36ee89c0358b 100644 --- a/drivers/hv/hv_util.c +++ b/drivers/hv/hv_util.c @@ -141,6 +141,7 @@ static struct hv_util_service util_heartbeat = {  static struct hv_util_service util_kvp = {  	.util_cb = hv_kvp_onchannelcallback,  	.util_init = hv_kvp_init, +	.util_init_transport = hv_kvp_init_transport,  	.util_pre_suspend = hv_kvp_pre_suspend,  	.util_pre_resume = hv_kvp_pre_resume,  	.util_deinit = hv_kvp_deinit, @@ -149,6 +150,7 @@ static struct hv_util_service util_kvp = {  static struct hv_util_service util_vss = {  	.util_cb = hv_vss_onchannelcallback,  	.util_init = hv_vss_init, +	.util_init_transport = hv_vss_init_transport,  	.util_pre_suspend = hv_vss_pre_suspend,  	.util_pre_resume = hv_vss_pre_resume,  	.util_deinit = hv_vss_deinit, @@ -590,10 +592,8 @@ static int util_probe(struct hv_device *dev,  	srv->channel = dev->channel;  	if (srv->util_init) {  		ret = srv->util_init(srv); -		if (ret) { -			ret = -ENODEV; +		if (ret)  			goto error1; -		}  	}  	/* @@ -613,6 +613,13 @@ static int util_probe(struct hv_device *dev,  	if (ret)  		goto error; +	if (srv->util_init_transport) { +		ret = srv->util_init_transport(); +		if (ret) { +			vmbus_close(dev->channel); +			goto error; +		} +	}  	return 0;  error: diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h index d2856023d53c..52cb744b4d7f 100644 --- a/drivers/hv/hyperv_vmbus.h +++ b/drivers/hv/hyperv_vmbus.h @@ -370,12 +370,14 @@ void vmbus_on_event(unsigned long data);  void vmbus_on_msg_dpc(unsigned long data);  int hv_kvp_init(struct hv_util_service *srv); +int hv_kvp_init_transport(void);  void hv_kvp_deinit(void);  int hv_kvp_pre_suspend(void);  int hv_kvp_pre_resume(void);  void hv_kvp_onchannelcallback(void *context);  int hv_vss_init(struct hv_util_service *srv); +int hv_vss_init_transport(void);  void hv_vss_deinit(void);  int hv_vss_pre_suspend(void);  int hv_vss_pre_resume(void); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index 9b15f7daf505..2892b8da20a5 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -2507,7 +2507,7 @@ static int vmbus_bus_resume(struct device *dev)  	vmbus_request_offers();  	if (wait_for_completion_timeout( -		&vmbus_connection.ready_for_resume_event, 10 * HZ) == 0) +		&vmbus_connection.ready_for_resume_event, secs_to_jiffies(10)) == 0)  		pr_err("Some vmbus device is missing after suspending?\n");  	/* Reset the event for the next suspend. */ @@ -2560,7 +2560,7 @@ static const struct dev_pm_ops vmbus_bus_pm = {  static struct platform_driver vmbus_platform_driver = {  	.probe = vmbus_platform_driver_probe, -	.remove_new = vmbus_platform_driver_remove, +	.remove = vmbus_platform_driver_remove,  	.driver = {  		.name = "vmbus",  		.acpi_match_table = ACPI_PTR(vmbus_acpi_device_ids), diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c index 2f1c9d97ad21..3db1b9d09c32 100644 --- a/drivers/hwmon/acpi_power_meter.c +++ b/drivers/hwmon/acpi_power_meter.c @@ -682,7 +682,7 @@ static int setup_attrs(struct acpi_power_meter_resource *resource)  	/* _PMD method is optional. */  	res = read_domain_devices(resource); -	if (res != -ENODEV) +	if (res && res != -ENODEV)  		return res;  	if (resource->caps.flags & POWER_METER_CAN_MEASURE) { diff --git a/drivers/hwmon/drivetemp.c b/drivers/hwmon/drivetemp.c index 6bdd21aa005a..291d91f68646 100644 --- a/drivers/hwmon/drivetemp.c +++ b/drivers/hwmon/drivetemp.c @@ -165,6 +165,7 @@ static int drivetemp_scsi_command(struct drivetemp_data *st,  {  	u8 scsi_cmd[MAX_COMMAND_SIZE];  	enum req_op op; +	int err;  	memset(scsi_cmd, 0, sizeof(scsi_cmd));  	scsi_cmd[0] = ATA_16; @@ -192,8 +193,11 @@ static int drivetemp_scsi_command(struct drivetemp_data *st,  	scsi_cmd[12] = lba_high;  	scsi_cmd[14] = ata_command; -	return scsi_execute_cmd(st->sdev, scsi_cmd, op, st->smartdata, -				ATA_SECT_SIZE, HZ, 5, NULL); +	err = scsi_execute_cmd(st->sdev, scsi_cmd, op, st->smartdata, +			       ATA_SECT_SIZE, 10 * HZ, 5, NULL); +	if (err > 0) +		err = -EIO; +	return err;  }  static int drivetemp_ata_command(struct drivetemp_data *st, u8 feature, diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c index 49b366254529..bbb9cc44e29f 100644 --- a/drivers/hwmon/hwmon.c +++ b/drivers/hwmon/hwmon.c @@ -1074,7 +1074,7 @@ hwmon_device_register_for_thermal(struct device *dev, const char *name,  	return __hwmon_device_register(dev, name, drvdata, NULL, NULL);  } -EXPORT_SYMBOL_NS_GPL(hwmon_device_register_for_thermal, HWMON_THERMAL); +EXPORT_SYMBOL_NS_GPL(hwmon_device_register_for_thermal, "HWMON_THERMAL");  /**   * hwmon_device_register - register w/ hwmon diff --git a/drivers/hwmon/intel-m10-bmc-hwmon.c b/drivers/hwmon/intel-m10-bmc-hwmon.c index e221f2c1f332..aa01a4bedc21 100644 --- a/drivers/hwmon/intel-m10-bmc-hwmon.c +++ b/drivers/hwmon/intel-m10-bmc-hwmon.c @@ -787,4 +787,4 @@ MODULE_DEVICE_TABLE(platform, intel_m10bmc_hwmon_ids);  MODULE_AUTHOR("Intel Corporation");  MODULE_DESCRIPTION("Intel MAX 10 BMC hardware monitor");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(INTEL_M10_BMC_CORE); +MODULE_IMPORT_NS("INTEL_M10_BMC_CORE"); diff --git a/drivers/hwmon/ltc2991.c b/drivers/hwmon/ltc2991.c index 7ca139e4b6af..6d5d4cb846da 100644 --- a/drivers/hwmon/ltc2991.c +++ b/drivers/hwmon/ltc2991.c @@ -125,7 +125,7 @@ static int ltc2991_get_curr(struct ltc2991_state *st, u32 reg, int channel,  	/* Vx-Vy, 19.075uV/LSB */  	*val = DIV_ROUND_CLOSEST(sign_extend32(reg_val, 14) * 19075, -				 st->r_sense_uohm[channel]); +				 (s32)st->r_sense_uohm[channel]);  	return 0;  } diff --git a/drivers/hwmon/nct6775-core.c b/drivers/hwmon/nct6775-core.c index ee04795b98aa..c243b51837d2 100644 --- a/drivers/hwmon/nct6775-core.c +++ b/drivers/hwmon/nct6775-core.c @@ -57,7 +57,7 @@  #include "nct6775.h"  #undef DEFAULT_SYMBOL_NAMESPACE -#define DEFAULT_SYMBOL_NAMESPACE HWMON_NCT6775 +#define DEFAULT_SYMBOL_NAMESPACE "HWMON_NCT6775"  #define USE_ALTERNATE diff --git a/drivers/hwmon/nct6775-i2c.c b/drivers/hwmon/nct6775-i2c.c index aff69fa50461..ba71d776a291 100644 --- a/drivers/hwmon/nct6775-i2c.c +++ b/drivers/hwmon/nct6775-i2c.c @@ -184,4 +184,4 @@ module_i2c_driver(nct6775_i2c_driver);  MODULE_AUTHOR("Zev Weiss <zev@bewilderbeest.net>");  MODULE_DESCRIPTION("I2C driver for NCT6775F and compatible chips");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(HWMON_NCT6775); +MODULE_IMPORT_NS("HWMON_NCT6775"); diff --git a/drivers/hwmon/nct6775-platform.c b/drivers/hwmon/nct6775-platform.c index 1218a3b449a8..0a040364b512 100644 --- a/drivers/hwmon/nct6775-platform.c +++ b/drivers/hwmon/nct6775-platform.c @@ -1622,7 +1622,7 @@ static void __exit sensors_nct6775_platform_exit(void)  MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");  MODULE_DESCRIPTION("Platform driver for NCT6775F and compatible chips");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(HWMON_NCT6775); +MODULE_IMPORT_NS("HWMON_NCT6775");  module_init(sensors_nct6775_platform_init);  module_exit(sensors_nct6775_platform_exit); diff --git a/drivers/hwmon/peci/cputemp.c b/drivers/hwmon/peci/cputemp.c index 5a682195b98f..c7112dbf008b 100644 --- a/drivers/hwmon/peci/cputemp.c +++ b/drivers/hwmon/peci/cputemp.c @@ -607,4 +607,4 @@ MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>");  MODULE_AUTHOR("Iwona Winiarska <iwona.winiarska@intel.com>");  MODULE_DESCRIPTION("PECI cputemp driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PECI_CPU); +MODULE_IMPORT_NS("PECI_CPU"); diff --git a/drivers/hwmon/peci/dimmtemp.c b/drivers/hwmon/peci/dimmtemp.c index 4a72e9712408..d6762259dd69 100644 --- a/drivers/hwmon/peci/dimmtemp.c +++ b/drivers/hwmon/peci/dimmtemp.c @@ -666,4 +666,4 @@ MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>");  MODULE_AUTHOR("Iwona Winiarska <iwona.winiarska@intel.com>");  MODULE_DESCRIPTION("PECI dimmtemp driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PECI_CPU); +MODULE_IMPORT_NS("PECI_CPU"); diff --git a/drivers/hwmon/pmbus/acbel-fsg032.c b/drivers/hwmon/pmbus/acbel-fsg032.c index e0c55fd8f3a6..9f07fb4abaff 100644 --- a/drivers/hwmon/pmbus/acbel-fsg032.c +++ b/drivers/hwmon/pmbus/acbel-fsg032.c @@ -120,4 +120,4 @@ module_i2c_driver(acbel_fsg032_driver);  MODULE_AUTHOR("Lakshmi Yadlapati");  MODULE_DESCRIPTION("PMBus driver for AcBel Power System power supplies");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/adm1266.c b/drivers/hwmon/pmbus/adm1266.c index 2c4d94cc8729..d90f8f80be8e 100644 --- a/drivers/hwmon/pmbus/adm1266.c +++ b/drivers/hwmon/pmbus/adm1266.c @@ -509,4 +509,4 @@ module_i2c_driver(adm1266_driver);  MODULE_AUTHOR("Alexandru Tachici <alexandru.tachici@analog.com>");  MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1266");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/adm1275.c b/drivers/hwmon/pmbus/adm1275.c index 59ffc08289bd..127593e10a03 100644 --- a/drivers/hwmon/pmbus/adm1275.c +++ b/drivers/hwmon/pmbus/adm1275.c @@ -866,4 +866,4 @@ module_i2c_driver(adm1275_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for Analog Devices ADM1275 and compatibles");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/adp1050.c b/drivers/hwmon/pmbus/adp1050.c index 20f22730fc01..ef46c880b168 100644 --- a/drivers/hwmon/pmbus/adp1050.c +++ b/drivers/hwmon/pmbus/adp1050.c @@ -53,4 +53,4 @@ module_i2c_driver(adp1050_driver);  MODULE_AUTHOR("Radu Sabau <radu.sabau@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADP1050 HWMON PMBus Driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/bel-pfe.c b/drivers/hwmon/pmbus/bel-pfe.c index 7c5f4b10a7c1..ddf9d9a2958c 100644 --- a/drivers/hwmon/pmbus/bel-pfe.c +++ b/drivers/hwmon/pmbus/bel-pfe.c @@ -129,4 +129,4 @@ module_i2c_driver(pfe_pmbus_driver);  MODULE_AUTHOR("Tao Ren <rentao.bupt@gmail.com>");  MODULE_DESCRIPTION("PMBus driver for BEL PFE Family Power Supplies");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/bpa-rs600.c b/drivers/hwmon/pmbus/bpa-rs600.c index 0dce26c35556..6c3875ba37a0 100644 --- a/drivers/hwmon/pmbus/bpa-rs600.c +++ b/drivers/hwmon/pmbus/bpa-rs600.c @@ -205,4 +205,4 @@ module_i2c_driver(bpa_rs600_driver);  MODULE_AUTHOR("Chris Packham");  MODULE_DESCRIPTION("PMBus driver for BluTek BPA-RS600");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/delta-ahe50dc-fan.c b/drivers/hwmon/pmbus/delta-ahe50dc-fan.c index 4dd3b6686d6a..3850eaea75da 100644 --- a/drivers/hwmon/pmbus/delta-ahe50dc-fan.c +++ b/drivers/hwmon/pmbus/delta-ahe50dc-fan.c @@ -127,4 +127,4 @@ module_i2c_driver(ahe50dc_fan_driver);  MODULE_AUTHOR("Zev Weiss <zev@bewilderbeest.net>");  MODULE_DESCRIPTION("Driver for Delta AHE-50DC power shelf fan control module");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/dps920ab.c b/drivers/hwmon/pmbus/dps920ab.c index 04e0d598a6e5..cc5aac9dfdb3 100644 --- a/drivers/hwmon/pmbus/dps920ab.c +++ b/drivers/hwmon/pmbus/dps920ab.c @@ -203,4 +203,4 @@ module_i2c_driver(dps920ab_driver);  MODULE_AUTHOR("Robert Marko <robert.marko@sartura.hr>");  MODULE_DESCRIPTION("PMBus driver for Delta DPS920AB PSU");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/fsp-3y.c b/drivers/hwmon/pmbus/fsp-3y.c index 72a7c261ef06..a4dc09e2ef75 100644 --- a/drivers/hwmon/pmbus/fsp-3y.c +++ b/drivers/hwmon/pmbus/fsp-3y.c @@ -291,4 +291,4 @@ module_i2c_driver(fsp3y_driver);  MODULE_AUTHOR("Václav Kubernát");  MODULE_DESCRIPTION("PMBus driver for FSP/3Y-Power power supplies");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ibm-cffps.c b/drivers/hwmon/pmbus/ibm-cffps.c index 1ba4c5e95820..d05ef7a968a9 100644 --- a/drivers/hwmon/pmbus/ibm-cffps.c +++ b/drivers/hwmon/pmbus/ibm-cffps.c @@ -614,4 +614,4 @@ module_i2c_driver(ibm_cffps_driver);  MODULE_AUTHOR("Eddie James");  MODULE_DESCRIPTION("PMBus driver for IBM Common Form Factor power supplies");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/inspur-ipsps.c b/drivers/hwmon/pmbus/inspur-ipsps.c index 3e3cc9a0f116..074e0f164ee1 100644 --- a/drivers/hwmon/pmbus/inspur-ipsps.c +++ b/drivers/hwmon/pmbus/inspur-ipsps.c @@ -224,4 +224,4 @@ module_i2c_driver(ipsps_driver);  MODULE_AUTHOR("John Wang");  MODULE_DESCRIPTION("PMBus driver for Inspur Power System power supplies");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ir35221.c b/drivers/hwmon/pmbus/ir35221.c index 503be59c6c7f..46d8f334d49a 100644 --- a/drivers/hwmon/pmbus/ir35221.c +++ b/drivers/hwmon/pmbus/ir35221.c @@ -145,4 +145,4 @@ module_i2c_driver(ir35221_driver);  MODULE_AUTHOR("Samuel Mendoza-Jonas <sam@mendozajonas.com");  MODULE_DESCRIPTION("PMBus driver for IR35221");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ir36021.c b/drivers/hwmon/pmbus/ir36021.c index 5148c9187c9e..34ce15fc708b 100644 --- a/drivers/hwmon/pmbus/ir36021.c +++ b/drivers/hwmon/pmbus/ir36021.c @@ -76,4 +76,4 @@ module_i2c_driver(ir36021_driver);  MODULE_AUTHOR("Chris Packham <chris.packham@alliedtelesis.co.nz>");  MODULE_DESCRIPTION("PMBus driver for Infineon IR36021");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ir38064.c b/drivers/hwmon/pmbus/ir38064.c index d4bcc9c39774..7b4188e8bf48 100644 --- a/drivers/hwmon/pmbus/ir38064.c +++ b/drivers/hwmon/pmbus/ir38064.c @@ -87,4 +87,4 @@ module_i2c_driver(ir38064_driver);  MODULE_AUTHOR("Maxim Sloyko <maxims@google.com>");  MODULE_DESCRIPTION("PMBus driver for Infineon IR38064 and compatible chips");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/irps5401.c b/drivers/hwmon/pmbus/irps5401.c index f0bdf55c95bf..43674c64841d 100644 --- a/drivers/hwmon/pmbus/irps5401.c +++ b/drivers/hwmon/pmbus/irps5401.c @@ -63,4 +63,4 @@ module_i2c_driver(irps5401_driver);  MODULE_AUTHOR("Robert Hancock");  MODULE_DESCRIPTION("PMBus driver for Infineon IRPS5401");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/isl68137.c b/drivers/hwmon/pmbus/isl68137.c index 97cc951a13a4..2af921039309 100644 --- a/drivers/hwmon/pmbus/isl68137.c +++ b/drivers/hwmon/pmbus/isl68137.c @@ -532,4 +532,4 @@ module_i2c_driver(isl68137_driver);  MODULE_AUTHOR("Maxim Sloyko <maxims@google.com>");  MODULE_DESCRIPTION("PMBus driver for Renesas digital multiphase voltage regulators");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/lm25066.c b/drivers/hwmon/pmbus/lm25066.c index c36c124d1a2d..40b0dda32ea6 100644 --- a/drivers/hwmon/pmbus/lm25066.c +++ b/drivers/hwmon/pmbus/lm25066.c @@ -569,4 +569,4 @@ module_i2c_driver(lm25066_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for LM25066 and compatible chips");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/lt7182s.c b/drivers/hwmon/pmbus/lt7182s.c index aebd97af2741..9d6d50f39bd6 100644 --- a/drivers/hwmon/pmbus/lt7182s.c +++ b/drivers/hwmon/pmbus/lt7182s.c @@ -192,4 +192,4 @@ module_i2c_driver(lt7182s_driver);  MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");  MODULE_DESCRIPTION("PMBus driver for Analog Devices LT7182S");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ltc2978.c b/drivers/hwmon/pmbus/ltc2978.c index a6eb4d4b5487..4c306943383a 100644 --- a/drivers/hwmon/pmbus/ltc2978.c +++ b/drivers/hwmon/pmbus/ltc2978.c @@ -952,4 +952,4 @@ module_i2c_driver(ltc2978_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for LTC2978 and compatible chips");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ltc3815.c b/drivers/hwmon/pmbus/ltc3815.c index f58a8cedb0d7..824c16a75e2c 100644 --- a/drivers/hwmon/pmbus/ltc3815.c +++ b/drivers/hwmon/pmbus/ltc3815.c @@ -208,4 +208,4 @@ module_i2c_driver(ltc3815_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for LTC3815");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max15301.c b/drivers/hwmon/pmbus/max15301.c index f5367a7bc0f5..50dfd477772f 100644 --- a/drivers/hwmon/pmbus/max15301.c +++ b/drivers/hwmon/pmbus/max15301.c @@ -97,4 +97,4 @@ module_i2c_driver(max15301_driver);  MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX15301");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max16064.c b/drivers/hwmon/pmbus/max16064.c index 98e2b5dd5841..eb84915c2a83 100644 --- a/drivers/hwmon/pmbus/max16064.c +++ b/drivers/hwmon/pmbus/max16064.c @@ -111,4 +111,4 @@ module_i2c_driver(max16064_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX16064");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max16601.c b/drivers/hwmon/pmbus/max16601.c index 3ab219504600..d696e506aafb 100644 --- a/drivers/hwmon/pmbus/max16601.c +++ b/drivers/hwmon/pmbus/max16601.c @@ -366,4 +366,4 @@ module_i2c_driver(max16601_driver);  MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX16601");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max20730.c b/drivers/hwmon/pmbus/max20730.c index d56ec24764fd..95869d198ecf 100644 --- a/drivers/hwmon/pmbus/max20730.c +++ b/drivers/hwmon/pmbus/max20730.c @@ -787,4 +787,4 @@ module_i2c_driver(max20730_driver);  MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX20710 / MAX20730 / MAX20734 / MAX20743");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max20751.c b/drivers/hwmon/pmbus/max20751.c index 8f23c1eb559e..ac8c43122133 100644 --- a/drivers/hwmon/pmbus/max20751.c +++ b/drivers/hwmon/pmbus/max20751.c @@ -51,4 +51,4 @@ module_i2c_driver(max20751_driver);  MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX20751");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max31785.c b/drivers/hwmon/pmbus/max31785.c index 09218dba8965..1f94d38a1637 100644 --- a/drivers/hwmon/pmbus/max31785.c +++ b/drivers/hwmon/pmbus/max31785.c @@ -549,4 +549,4 @@ module_i2c_driver(max31785_driver);  MODULE_AUTHOR("Andrew Jeffery <andrew@aj.id.au>");  MODULE_DESCRIPTION("PMBus driver for the Maxim MAX31785");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max34440.c b/drivers/hwmon/pmbus/max34440.c index fe7f6b1b0985..c9dda33831ff 100644 --- a/drivers/hwmon/pmbus/max34440.c +++ b/drivers/hwmon/pmbus/max34440.c @@ -529,4 +529,4 @@ module_i2c_driver(max34440_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX34440/MAX34441");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/max8688.c b/drivers/hwmon/pmbus/max8688.c index 5d5b6aeefa80..b3a2a7492bbf 100644 --- a/drivers/hwmon/pmbus/max8688.c +++ b/drivers/hwmon/pmbus/max8688.c @@ -191,4 +191,4 @@ module_i2c_driver(max8688_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for Maxim MAX8688");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp2856.c b/drivers/hwmon/pmbus/mp2856.c index 41bb86667091..e83c70a3583f 100644 --- a/drivers/hwmon/pmbus/mp2856.c +++ b/drivers/hwmon/pmbus/mp2856.c @@ -463,4 +463,4 @@ module_i2c_driver(mp2856_driver);  MODULE_AUTHOR("Peter Yin <peter.yin@quantatw.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP2856/MP2857 device");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp2888.c b/drivers/hwmon/pmbus/mp2888.c index 3b45f126b611..772a623ca7d0 100644 --- a/drivers/hwmon/pmbus/mp2888.c +++ b/drivers/hwmon/pmbus/mp2888.c @@ -404,4 +404,4 @@ module_i2c_driver(mp2888_driver);  MODULE_AUTHOR("Vadim Pasternak <vadimp@nvidia.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP2888 device");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp2891.c b/drivers/hwmon/pmbus/mp2891.c index 94ab4ae5fba0..f8f4c91ec23c 100644 --- a/drivers/hwmon/pmbus/mp2891.c +++ b/drivers/hwmon/pmbus/mp2891.c @@ -597,4 +597,4 @@ module_i2c_driver(mp2891_driver);  MODULE_AUTHOR("Noah Wang <noahwang.wang@outlook.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP2891");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp2975.c b/drivers/hwmon/pmbus/mp2975.c index 280bb12f762c..c31982d85196 100644 --- a/drivers/hwmon/pmbus/mp2975.c +++ b/drivers/hwmon/pmbus/mp2975.c @@ -1101,4 +1101,4 @@ module_i2c_driver(mp2975_driver);  MODULE_AUTHOR("Vadim Pasternak <vadimp@nvidia.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP2975 device");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp2993.c b/drivers/hwmon/pmbus/mp2993.c index 63691dac2281..81c84fc8ed47 100644 --- a/drivers/hwmon/pmbus/mp2993.c +++ b/drivers/hwmon/pmbus/mp2993.c @@ -258,4 +258,4 @@ module_i2c_driver(mp2993_driver);  MODULE_AUTHOR("Noah Wang <noahwang.wang@outlook.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP2993");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp5023.c b/drivers/hwmon/pmbus/mp5023.c index 21acb7fd9a1a..c466d67e9a8f 100644 --- a/drivers/hwmon/pmbus/mp5023.c +++ b/drivers/hwmon/pmbus/mp5023.c @@ -64,4 +64,4 @@ module_i2c_driver(mp5023_driver);  MODULE_AUTHOR("Howard Chiu <howard.chiu@quantatw.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP5023 HSC");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp5920.c b/drivers/hwmon/pmbus/mp5920.c index f6d7527ade7d..319ae2721bcf 100644 --- a/drivers/hwmon/pmbus/mp5920.c +++ b/drivers/hwmon/pmbus/mp5920.c @@ -87,4 +87,4 @@ MODULE_AUTHOR("Tony Ao <tony_ao@wiwynn.com>");  MODULE_AUTHOR("Alex Vdovydchenko <xzeol@yahoo.com>");  MODULE_DESCRIPTION("PMBus driver for MP5920 HSC");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp5990.c b/drivers/hwmon/pmbus/mp5990.c index 5d1d5eac89da..4ce381a39480 100644 --- a/drivers/hwmon/pmbus/mp5990.c +++ b/drivers/hwmon/pmbus/mp5990.c @@ -176,4 +176,4 @@ module_i2c_driver(mp5990_driver);  MODULE_AUTHOR("Peter Yin <peter.yin@quantatw.com>");  MODULE_DESCRIPTION("PMBus driver for MP5990 HSC");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mp9941.c b/drivers/hwmon/pmbus/mp9941.c index 8ab5fc4d4092..42ca6748777a 100644 --- a/drivers/hwmon/pmbus/mp9941.c +++ b/drivers/hwmon/pmbus/mp9941.c @@ -316,4 +316,4 @@ module_i2c_driver(mp9941_driver);  MODULE_AUTHOR("Noah Wang <noahwang.wang@outlook.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MP9941");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mpq7932.c b/drivers/hwmon/pmbus/mpq7932.c index 2dcb6da853bd..c1e2d0cb2fd0 100644 --- a/drivers/hwmon/pmbus/mpq7932.c +++ b/drivers/hwmon/pmbus/mpq7932.c @@ -164,4 +164,4 @@ module_i2c_driver(mpq7932_regulator_driver);  MODULE_AUTHOR("Saravanan Sekar <saravanan@linumiz.com>");  MODULE_DESCRIPTION("MPQ7932 PMIC regulator driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/mpq8785.c b/drivers/hwmon/pmbus/mpq8785.c index 0d16491cd770..331c274ca892 100644 --- a/drivers/hwmon/pmbus/mpq8785.c +++ b/drivers/hwmon/pmbus/mpq8785.c @@ -87,4 +87,4 @@ module_i2c_driver(mpq8785_driver);  MODULE_AUTHOR("Charles Hsu <ythsu0511@gmail.com>");  MODULE_DESCRIPTION("PMBus driver for MPS MPQ8785");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/pim4328.c b/drivers/hwmon/pmbus/pim4328.c index 31d9ae06379a..aa98284bbdd8 100644 --- a/drivers/hwmon/pmbus/pim4328.c +++ b/drivers/hwmon/pmbus/pim4328.c @@ -230,4 +230,4 @@ module_i2c_driver(pim4328_driver);  MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>");  MODULE_DESCRIPTION("PMBus driver for PIM4006, PIM4328, PIM4820 power interface modules");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/pli1209bc.c b/drivers/hwmon/pmbus/pli1209bc.c index 178e0cdb7887..569b61dc1a32 100644 --- a/drivers/hwmon/pmbus/pli1209bc.c +++ b/drivers/hwmon/pmbus/pli1209bc.c @@ -145,4 +145,4 @@ module_i2c_driver(pli1209bc_driver);  MODULE_AUTHOR("Marcello Sylvester Bauer <sylv@sylv.io>");  MODULE_DESCRIPTION("PMBus driver for Vicor PLI1209BC");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/pm6764tr.c b/drivers/hwmon/pmbus/pm6764tr.c index 23f15b608dcf..c96c0aecb920 100644 --- a/drivers/hwmon/pmbus/pm6764tr.c +++ b/drivers/hwmon/pmbus/pm6764tr.c @@ -73,4 +73,4 @@ module_i2c_driver(pm6764tr_driver);  MODULE_AUTHOR("Charles Hsu");  MODULE_DESCRIPTION("PMBus driver for  ST PM6764TR");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/pmbus.c b/drivers/hwmon/pmbus/pmbus.c index ec40c5c59954..77cf268e7d2d 100644 --- a/drivers/hwmon/pmbus/pmbus.c +++ b/drivers/hwmon/pmbus/pmbus.c @@ -261,4 +261,4 @@ module_i2c_driver(pmbus_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("Generic PMBus driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index a0109296a994..a1375cb6b648 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c @@ -150,7 +150,7 @@ void pmbus_clear_cache(struct i2c_client *client)  	for (sensor = data->sensors; sensor; sensor = sensor->next)  		sensor->data = -ENODATA;  } -EXPORT_SYMBOL_NS_GPL(pmbus_clear_cache, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_clear_cache, "PMBUS");  void pmbus_set_update(struct i2c_client *client, u8 reg, bool update)  { @@ -161,7 +161,7 @@ void pmbus_set_update(struct i2c_client *client, u8 reg, bool update)  		if (sensor->reg == reg)  			sensor->update = update;  } -EXPORT_SYMBOL_NS_GPL(pmbus_set_update, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_set_update, "PMBUS");  /* Some chips need a delay between accesses. */  static void pmbus_wait(struct i2c_client *client) @@ -236,7 +236,7 @@ int pmbus_set_page(struct i2c_client *client, int page, int phase)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(pmbus_set_page, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_set_page, "PMBUS");  int pmbus_write_byte(struct i2c_client *client, int page, u8 value)  { @@ -252,7 +252,7 @@ int pmbus_write_byte(struct i2c_client *client, int page, u8 value)  	return rv;  } -EXPORT_SYMBOL_NS_GPL(pmbus_write_byte, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_write_byte, "PMBUS");  /*   * _pmbus_write_byte() is similar to pmbus_write_byte(), but checks if @@ -287,7 +287,7 @@ int pmbus_write_word_data(struct i2c_client *client, int page, u8 reg,  	return rv;  } -EXPORT_SYMBOL_NS_GPL(pmbus_write_word_data, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_write_word_data, "PMBUS");  static int pmbus_write_virt_reg(struct i2c_client *client, int page, int reg, @@ -393,7 +393,7 @@ int pmbus_update_fan(struct i2c_client *client, int page, int id,  	return _pmbus_write_word_data(client, page,  				      pmbus_fan_command_registers[id], command);  } -EXPORT_SYMBOL_NS_GPL(pmbus_update_fan, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_update_fan, "PMBUS");  int pmbus_read_word_data(struct i2c_client *client, int page, int phase, u8 reg)  { @@ -409,7 +409,7 @@ int pmbus_read_word_data(struct i2c_client *client, int page, int phase, u8 reg)  	return rv;  } -EXPORT_SYMBOL_NS_GPL(pmbus_read_word_data, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_read_word_data, "PMBUS");  static int pmbus_read_virt_reg(struct i2c_client *client, int page, int reg)  { @@ -472,7 +472,7 @@ int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg)  	return rv;  } -EXPORT_SYMBOL_NS_GPL(pmbus_read_byte_data, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_read_byte_data, "PMBUS");  int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, u8 value)  { @@ -488,7 +488,7 @@ int pmbus_write_byte_data(struct i2c_client *client, int page, u8 reg, u8 value)  	return rv;  } -EXPORT_SYMBOL_NS_GPL(pmbus_write_byte_data, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_write_byte_data, "PMBUS");  int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg,  			   u8 mask, u8 value) @@ -507,7 +507,7 @@ int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg,  	return rv;  } -EXPORT_SYMBOL_NS_GPL(pmbus_update_byte_data, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_update_byte_data, "PMBUS");  static int pmbus_read_block_data(struct i2c_client *client, int page, u8 reg,  				 char *data_buf) @@ -578,14 +578,14 @@ int pmbus_get_fan_rate_device(struct i2c_client *client, int page, int id,  {  	return pmbus_get_fan_rate(client, page, id, mode, false);  } -EXPORT_SYMBOL_NS_GPL(pmbus_get_fan_rate_device, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_get_fan_rate_device, "PMBUS");  int pmbus_get_fan_rate_cached(struct i2c_client *client, int page, int id,  			      enum pmbus_fan_mode mode)  {  	return pmbus_get_fan_rate(client, page, id, mode, true);  } -EXPORT_SYMBOL_NS_GPL(pmbus_get_fan_rate_cached, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_get_fan_rate_cached, "PMBUS");  static void pmbus_clear_fault_page(struct i2c_client *client, int page)  { @@ -600,7 +600,7 @@ void pmbus_clear_faults(struct i2c_client *client)  	for (i = 0; i < data->info->pages; i++)  		pmbus_clear_fault_page(client, i);  } -EXPORT_SYMBOL_NS_GPL(pmbus_clear_faults, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_clear_faults, "PMBUS");  static int pmbus_check_status_cml(struct i2c_client *client)  { @@ -655,13 +655,13 @@ bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg)  {  	return pmbus_check_register(client, _pmbus_read_byte_data, page, reg);  } -EXPORT_SYMBOL_NS_GPL(pmbus_check_byte_register, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_check_byte_register, "PMBUS");  bool pmbus_check_word_register(struct i2c_client *client, int page, int reg)  {  	return pmbus_check_register(client, __pmbus_read_word_data, page, reg);  } -EXPORT_SYMBOL_NS_GPL(pmbus_check_word_register, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_check_word_register, "PMBUS");  static bool __maybe_unused pmbus_check_block_register(struct i2c_client *client,  						      int page, int reg) @@ -685,7 +685,7 @@ const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client)  	return data->info;  } -EXPORT_SYMBOL_NS_GPL(pmbus_get_driver_info, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_get_driver_info, "PMBUS");  static int pmbus_get_status(struct i2c_client *client, int page, int reg)  { @@ -3217,7 +3217,7 @@ const struct regulator_ops pmbus_regulator_ops = {  	.set_voltage = pmbus_regulator_set_voltage,  	.list_voltage = pmbus_regulator_list_voltage,  }; -EXPORT_SYMBOL_NS_GPL(pmbus_regulator_ops, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_regulator_ops, "PMBUS");  static int pmbus_regulator_register(struct pmbus_data *data)  { @@ -3743,7 +3743,7 @@ int pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(pmbus_do_probe, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_do_probe, "PMBUS");  struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client)  { @@ -3751,7 +3751,7 @@ struct dentry *pmbus_get_debugfs_dir(struct i2c_client *client)  	return data->debugfs;  } -EXPORT_SYMBOL_NS_GPL(pmbus_get_debugfs_dir, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_get_debugfs_dir, "PMBUS");  int pmbus_lock_interruptible(struct i2c_client *client)  { @@ -3759,7 +3759,7 @@ int pmbus_lock_interruptible(struct i2c_client *client)  	return mutex_lock_interruptible(&data->update_lock);  } -EXPORT_SYMBOL_NS_GPL(pmbus_lock_interruptible, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_lock_interruptible, "PMBUS");  void pmbus_unlock(struct i2c_client *client)  { @@ -3767,7 +3767,7 @@ void pmbus_unlock(struct i2c_client *client)  	mutex_unlock(&data->update_lock);  } -EXPORT_SYMBOL_NS_GPL(pmbus_unlock, PMBUS); +EXPORT_SYMBOL_NS_GPL(pmbus_unlock, "PMBUS");  static int __init pmbus_core_init(void)  { diff --git a/drivers/hwmon/pmbus/pxe1610.c b/drivers/hwmon/pmbus/pxe1610.c index 5ac476d3cdd2..6a4a978eca7e 100644 --- a/drivers/hwmon/pmbus/pxe1610.c +++ b/drivers/hwmon/pmbus/pxe1610.c @@ -148,4 +148,4 @@ module_i2c_driver(pxe1610_driver);  MODULE_AUTHOR("Vijay Khemka <vijaykhemka@fb.com>");  MODULE_DESCRIPTION("PMBus driver for Infineon PXE1610, PXE1110 and PXM1310");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/q54sj108a2.c b/drivers/hwmon/pmbus/q54sj108a2.c index a235c1cdf4fe..4d7086d83aa3 100644 --- a/drivers/hwmon/pmbus/q54sj108a2.c +++ b/drivers/hwmon/pmbus/q54sj108a2.c @@ -421,4 +421,4 @@ module_i2c_driver(q54sj108a2_driver);  MODULE_AUTHOR("Xiao.Ma <xiao.mx.ma@deltaww.com>");  MODULE_DESCRIPTION("PMBus driver for Delta Q54SJ108A2 series modules");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/stpddc60.c b/drivers/hwmon/pmbus/stpddc60.c index 34d0f06f4845..5cb905ed8ae5 100644 --- a/drivers/hwmon/pmbus/stpddc60.c +++ b/drivers/hwmon/pmbus/stpddc60.c @@ -246,4 +246,4 @@ module_i2c_driver(stpddc60_driver);  MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>");  MODULE_DESCRIPTION("PMBus driver for ST STPDDC60");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/tda38640.c b/drivers/hwmon/pmbus/tda38640.c index 044d5fbdf9eb..07fe58c24485 100644 --- a/drivers/hwmon/pmbus/tda38640.c +++ b/drivers/hwmon/pmbus/tda38640.c @@ -221,4 +221,4 @@ module_i2c_driver(tda38640_driver);  MODULE_AUTHOR("Patrick Rudolph <patrick.rudolph@9elements.com>");  MODULE_DESCRIPTION("PMBus driver for Infineon TDA38640");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/tps40422.c b/drivers/hwmon/pmbus/tps40422.c index d99b9850ea36..7c9fedaa068c 100644 --- a/drivers/hwmon/pmbus/tps40422.c +++ b/drivers/hwmon/pmbus/tps40422.c @@ -51,4 +51,4 @@ module_i2c_driver(tps40422_driver);  MODULE_AUTHOR("Zhu Laiwen <richard.zhu@nsn.com>");  MODULE_DESCRIPTION("PMBus driver for TI TPS40422");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/tps53679.c b/drivers/hwmon/pmbus/tps53679.c index 5c9466244d70..63524dff5e75 100644 --- a/drivers/hwmon/pmbus/tps53679.c +++ b/drivers/hwmon/pmbus/tps53679.c @@ -308,4 +308,4 @@ module_i2c_driver(tps53679_driver);  MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");  MODULE_DESCRIPTION("PMBus driver for Texas Instruments TPS53679");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/tps546d24.c b/drivers/hwmon/pmbus/tps546d24.c index 520ca37269f7..44d7a6df1dbd 100644 --- a/drivers/hwmon/pmbus/tps546d24.c +++ b/drivers/hwmon/pmbus/tps546d24.c @@ -68,4 +68,4 @@ module_i2c_driver(tps546d24_driver);  MODULE_AUTHOR("Duke Du <dukedu83@gmail.com>");  MODULE_DESCRIPTION("PMBus driver for TI tps546d24");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ucd9000.c b/drivers/hwmon/pmbus/ucd9000.c index 5d3d1773bf52..9b0eadc81a2e 100644 --- a/drivers/hwmon/pmbus/ucd9000.c +++ b/drivers/hwmon/pmbus/ucd9000.c @@ -642,4 +642,4 @@ module_i2c_driver(ucd9000_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for TI UCD90xxx");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/ucd9200.c b/drivers/hwmon/pmbus/ucd9200.c index 7920d1c06df0..f68adaf4a110 100644 --- a/drivers/hwmon/pmbus/ucd9200.c +++ b/drivers/hwmon/pmbus/ucd9200.c @@ -209,4 +209,4 @@ module_i2c_driver(ucd9200_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for TI UCD922x, UCD924x");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/xdp710.c b/drivers/hwmon/pmbus/xdp710.c index dd107e83f612..660bbfe16e1e 100644 --- a/drivers/hwmon/pmbus/xdp710.c +++ b/drivers/hwmon/pmbus/xdp710.c @@ -128,4 +128,4 @@ module_i2c_driver(xdp710_driver);  MODULE_AUTHOR("Peter Yin <peter.yin@quantatw.com>");  MODULE_DESCRIPTION("PMBus driver for XDP710 HSC");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/xdpe12284.c b/drivers/hwmon/pmbus/xdpe12284.c index facb1201aa43..f3aa6339d60d 100644 --- a/drivers/hwmon/pmbus/xdpe12284.c +++ b/drivers/hwmon/pmbus/xdpe12284.c @@ -194,4 +194,4 @@ module_i2c_driver(xdpe122_driver);  MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");  MODULE_DESCRIPTION("PMBus driver for Infineon XDPE122 family");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/xdpe152c4.c b/drivers/hwmon/pmbus/xdpe152c4.c index 7f3b31d4f033..67a3d5fe1daf 100644 --- a/drivers/hwmon/pmbus/xdpe152c4.c +++ b/drivers/hwmon/pmbus/xdpe152c4.c @@ -72,4 +72,4 @@ module_i2c_driver(xdpe152_driver);  MODULE_AUTHOR("Greg Schwendimann <greg.schwendimann@infineon.com>");  MODULE_DESCRIPTION("PMBus driver for Infineon XDPE152 family");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/pmbus/zl6100.c b/drivers/hwmon/pmbus/zl6100.c index 7920a16203e1..97be69630cfb 100644 --- a/drivers/hwmon/pmbus/zl6100.c +++ b/drivers/hwmon/pmbus/zl6100.c @@ -420,4 +420,4 @@ module_i2c_driver(zl6100_driver);  MODULE_AUTHOR("Guenter Roeck");  MODULE_DESCRIPTION("PMBus driver for ZL6100 and compatibles");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PMBUS); +MODULE_IMPORT_NS("PMBUS"); diff --git a/drivers/hwmon/tmp513.c b/drivers/hwmon/tmp513.c index 926d28cd3fab..5acbfd7d088d 100644 --- a/drivers/hwmon/tmp513.c +++ b/drivers/hwmon/tmp513.c @@ -182,7 +182,7 @@ struct tmp51x_data {  	struct regmap *regmap;  }; -// Set the shift based on the gain 8=4, 4=3, 2=2, 1=1 +// Set the shift based on the gain: 8 -> 1, 4 -> 2, 2 -> 3, 1 -> 4  static inline u8 tmp51x_get_pga_shift(struct tmp51x_data *data)  {  	return 5 - ffs(data->pga_gain); @@ -204,8 +204,11 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,  		 * 2's complement number shifted by one to four depending  		 * on the pga gain setting. 1lsb = 10uV  		 */ -		*val = sign_extend32(regval, 17 - tmp51x_get_pga_shift(data)); -		*val = DIV_ROUND_CLOSEST(*val * 10 * MILLI, data->shunt_uohms); +		*val = sign_extend32(regval, +				     reg == TMP51X_SHUNT_CURRENT_RESULT ? +				     16 - tmp51x_get_pga_shift(data) : 15); +		*val = DIV_ROUND_CLOSEST(*val * 10 * (long)MILLI, (long)data->shunt_uohms); +  		break;  	case TMP51X_BUS_VOLTAGE_RESULT:  	case TMP51X_BUS_VOLTAGE_H_LIMIT: @@ -220,8 +223,8 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,  		break;  	case TMP51X_BUS_CURRENT_RESULT:  		// Current = (ShuntVoltage * CalibrationRegister) / 4096 -		*val = sign_extend32(regval, 16) * data->curr_lsb_ua; -		*val = DIV_ROUND_CLOSEST(*val, MILLI); +		*val = sign_extend32(regval, 15) * (long)data->curr_lsb_ua; +		*val = DIV_ROUND_CLOSEST(*val, (long)MILLI);  		break;  	case TMP51X_LOCAL_TEMP_RESULT:  	case TMP51X_REMOTE_TEMP_RESULT_1: @@ -232,7 +235,7 @@ static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,  	case TMP51X_REMOTE_TEMP_LIMIT_2:  	case TMP513_REMOTE_TEMP_LIMIT_3:  		// 1lsb = 0.0625 degrees centigrade -		*val = sign_extend32(regval, 16) >> TMP51X_TEMP_SHIFT; +		*val = sign_extend32(regval, 15) >> TMP51X_TEMP_SHIFT;  		*val = DIV_ROUND_CLOSEST(*val * 625, 10);  		break;  	case TMP51X_N_FACTOR_AND_HYST_1: @@ -261,7 +264,7 @@ static int tmp51x_set_value(struct tmp51x_data *data, u8 reg, long val)  		 * The user enter current value and we convert it to  		 * voltage. 1lsb = 10uV  		 */ -		val = DIV_ROUND_CLOSEST(val * data->shunt_uohms, 10 * MILLI); +		val = DIV_ROUND_CLOSEST(val * (long)data->shunt_uohms, 10 * (long)MILLI);  		max_val = U16_MAX >> tmp51x_get_pga_shift(data);  		regval = clamp_val(val, -max_val, max_val);  		break; diff --git a/drivers/hwspinlock/u8500_hsem.c b/drivers/hwspinlock/u8500_hsem.c index 1edca1092f29..5a2d8c3e0d80 100644 --- a/drivers/hwspinlock/u8500_hsem.c +++ b/drivers/hwspinlock/u8500_hsem.c @@ -131,7 +131,7 @@ static void u8500_hsem_remove(struct platform_device *pdev)  static struct platform_driver u8500_hsem_driver = {  	.probe		= u8500_hsem_probe, -	.remove_new	= u8500_hsem_remove, +	.remove		= u8500_hsem_remove,  	.driver		= {  		.name	= "u8500_hsem",  	}, diff --git a/drivers/hwtracing/coresight/coresight-catu.c b/drivers/hwtracing/coresight/coresight-catu.c index bfea880d6dfb..275cc0d9f505 100644 --- a/drivers/hwtracing/coresight/coresight-catu.c +++ b/drivers/hwtracing/coresight/coresight-catu.c @@ -689,7 +689,7 @@ MODULE_DEVICE_TABLE(acpi, catu_acpi_ids);  static struct platform_driver catu_platform_driver = {  	.probe	= catu_platform_probe, -	.remove_new = catu_platform_remove, +	.remove = catu_platform_remove,  	.driver	= {  		.name			= "coresight-catu-platform",  		.acpi_match_table	= ACPI_PTR(catu_acpi_ids), diff --git a/drivers/hwtracing/coresight/coresight-cpu-debug.c b/drivers/hwtracing/coresight/coresight-cpu-debug.c index 75962dae9aa1..342c3aaf414d 100644 --- a/drivers/hwtracing/coresight/coresight-cpu-debug.c +++ b/drivers/hwtracing/coresight/coresight-cpu-debug.c @@ -763,7 +763,7 @@ static const struct dev_pm_ops debug_dev_pm_ops = {  static struct platform_driver debug_platform_driver = {  	.probe	= debug_platform_probe, -	.remove_new = debug_platform_remove, +	.remove = debug_platform_remove,  	.driver	= {  		.name			= "coresight-debug-platform",  		.acpi_match_table	= ACPI_PTR(debug_platform_ids), diff --git a/drivers/hwtracing/coresight/coresight-dummy.c b/drivers/hwtracing/coresight/coresight-dummy.c index bb85fa663ffc..02ef2b945a0c 100644 --- a/drivers/hwtracing/coresight/coresight-dummy.c +++ b/drivers/hwtracing/coresight/coresight-dummy.c @@ -144,7 +144,7 @@ static const struct of_device_id dummy_match[] = {  static struct platform_driver dummy_driver = {  	.probe	= dummy_probe, -	.remove_new = dummy_remove, +	.remove = dummy_remove,  	.driver	= {  		.name   = "coresight-dummy",  		.of_match_table = dummy_match, diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index 66d44a404ad0..dd8c74f893db 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -2399,7 +2399,7 @@ MODULE_DEVICE_TABLE(acpi, etm4x_acpi_ids);  static struct platform_driver etm4_platform_driver = {  	.probe		= etm4_probe_platform_dev, -	.remove_new	= etm4_remove_platform_dev, +	.remove		= etm4_remove_platform_dev,  	.driver			= {  		.name			= "coresight-etm4x",  		.of_match_table		= etm4_sysreg_match, diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c index 5a819c8970fb..33efe1acbef7 100644 --- a/drivers/hwtracing/coresight/coresight-funnel.c +++ b/drivers/hwtracing/coresight/coresight-funnel.c @@ -377,7 +377,7 @@ MODULE_DEVICE_TABLE(acpi, funnel_acpi_ids);  static struct platform_driver funnel_driver = {  	.probe		= funnel_platform_probe, -	.remove_new	= funnel_platform_remove, +	.remove		= funnel_platform_remove,  	.driver		= {  		.name   = "coresight-funnel",  		/* THIS_MODULE is taken care of by platform_driver_register() */ diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c index 3e55be9c8418..0fba87de6d1a 100644 --- a/drivers/hwtracing/coresight/coresight-replicator.c +++ b/drivers/hwtracing/coresight/coresight-replicator.c @@ -389,7 +389,7 @@ MODULE_DEVICE_TABLE(acpi, replicator_acpi_ids);  static struct platform_driver replicator_driver = {  	.probe          = replicator_platform_probe, -	.remove_new     = replicator_platform_remove, +	.remove         = replicator_platform_remove,  	.driver         = {  		.name   = "coresight-replicator",  		/* THIS_MODULE is taken care of by platform_driver_register() */ diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c index cb3e04755c99..b581a30a1cd9 100644 --- a/drivers/hwtracing/coresight/coresight-stm.c +++ b/drivers/hwtracing/coresight/coresight-stm.c @@ -1036,7 +1036,7 @@ MODULE_DEVICE_TABLE(acpi, stm_acpi_ids);  static struct platform_driver stm_platform_driver = {  	.probe	= stm_platform_probe, -	.remove_new = stm_platform_remove, +	.remove = stm_platform_remove,  	.driver	= {  		.name			= "coresight-stm-platform",  		.acpi_match_table	= ACPI_PTR(stm_acpi_ids), diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c index 3a482fd2cb22..e9876252a789 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-core.c +++ b/drivers/hwtracing/coresight/coresight-tmc-core.c @@ -730,7 +730,7 @@ MODULE_DEVICE_TABLE(acpi, tmc_acpi_ids);  static struct platform_driver tmc_platform_driver = {  	.probe	= tmc_platform_probe, -	.remove_new = tmc_platform_remove, +	.remove = tmc_platform_remove,  	.driver	= {  		.name			= "coresight-tmc-platform",  		.acpi_match_table	= ACPI_PTR(tmc_acpi_ids), diff --git a/drivers/hwtracing/coresight/coresight-tpiu.c b/drivers/hwtracing/coresight/coresight-tpiu.c index b048e146fbb1..97ef36f03ec2 100644 --- a/drivers/hwtracing/coresight/coresight-tpiu.c +++ b/drivers/hwtracing/coresight/coresight-tpiu.c @@ -307,7 +307,7 @@ MODULE_DEVICE_TABLE(acpi, tpiu_acpi_ids);  static struct platform_driver tpiu_platform_driver = {  	.probe	= tpiu_platform_probe, -	.remove_new = tpiu_platform_remove, +	.remove = tpiu_platform_remove,  	.driver = {  		.name			= "coresight-tpiu-platform",  		.acpi_match_table	= ACPI_PTR(tpiu_acpi_ids), diff --git a/drivers/hwtracing/coresight/coresight-trbe.c b/drivers/hwtracing/coresight/coresight-trbe.c index 96a32b213669..919804b12a67 100644 --- a/drivers/hwtracing/coresight/coresight-trbe.c +++ b/drivers/hwtracing/coresight/coresight-trbe.c @@ -1562,7 +1562,7 @@ static struct platform_driver arm_trbe_driver = {  		.suppress_bind_attrs = true,  	},  	.probe	= arm_trbe_device_probe, -	.remove_new = arm_trbe_device_remove, +	.remove = arm_trbe_device_remove,  };  static int __init arm_trbe_init(void) diff --git a/drivers/hwtracing/coresight/ultrasoc-smb.c b/drivers/hwtracing/coresight/ultrasoc-smb.c index ef7f560f0ffa..dc3c9504dd7c 100644 --- a/drivers/hwtracing/coresight/ultrasoc-smb.c +++ b/drivers/hwtracing/coresight/ultrasoc-smb.c @@ -600,7 +600,7 @@ static struct platform_driver smb_driver = {  		.suppress_bind_attrs = true,  	},  	.probe = smb_probe, -	.remove_new = smb_remove, +	.remove = smb_remove,  };  module_platform_driver(smb_driver); diff --git a/drivers/hwtracing/intel_th/acpi.c b/drivers/hwtracing/intel_th/acpi.c index 503620e9fd10..d229324978bd 100644 --- a/drivers/hwtracing/intel_th/acpi.c +++ b/drivers/hwtracing/intel_th/acpi.c @@ -69,7 +69,7 @@ static void intel_th_acpi_remove(struct platform_device *pdev)  static struct platform_driver intel_th_acpi_driver = {  	.probe		= intel_th_acpi_probe, -	.remove_new	= intel_th_acpi_remove, +	.remove		= intel_th_acpi_remove,  	.driver		= {  		.name			= DRIVER_NAME,  		.acpi_match_table	= intel_th_acpi_ids, diff --git a/drivers/i2c/busses/i2c-amd-asf-plat.c b/drivers/i2c/busses/i2c-amd-asf-plat.c index ba47df5370c7..7512614bf4b7 100644 --- a/drivers/i2c/busses/i2c-amd-asf-plat.c +++ b/drivers/i2c/busses/i2c-amd-asf-plat.c @@ -364,6 +364,6 @@ static struct platform_driver amd_asf_driver = {  };  module_platform_driver(amd_asf_driver); -MODULE_IMPORT_NS(PIIX4_SMBUS); +MODULE_IMPORT_NS("PIIX4_SMBUS");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("AMD Alert Standard Format Driver"); diff --git a/drivers/i2c/busses/i2c-cgbc.c b/drivers/i2c/busses/i2c-cgbc.c index eba0b205de11..f054d167ac47 100644 --- a/drivers/i2c/busses/i2c-cgbc.c +++ b/drivers/i2c/busses/i2c-cgbc.c @@ -395,7 +395,7 @@ static struct platform_driver cgbc_i2c_driver = {  		.name = "cgbc-i2c",  	},  	.probe		= cgbc_i2c_probe, -	.remove_new	= cgbc_i2c_remove, +	.remove		= cgbc_i2c_remove,  };  module_platform_driver(cgbc_i2c_driver); diff --git a/drivers/i2c/busses/i2c-designware-common.c b/drivers/i2c/busses/i2c-designware-common.c index 857783d458fb..183a35038eef 100644 --- a/drivers/i2c/busses/i2c-designware-common.c +++ b/drivers/i2c/busses/i2c-designware-common.c @@ -29,7 +29,7 @@  #include <linux/types.h>  #include <linux/units.h> -#define DEFAULT_SYMBOL_NAMESPACE	I2C_DW_COMMON +#define DEFAULT_SYMBOL_NAMESPACE	"I2C_DW_COMMON"  #include "i2c-designware-core.h" diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index eca8998d640f..c8cbe5b1aeb1 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -22,7 +22,7 @@  #include <linux/regmap.h>  #include <linux/reset.h> -#define DEFAULT_SYMBOL_NAMESPACE	I2C_DW +#define DEFAULT_SYMBOL_NAMESPACE	"I2C_DW"  #include "i2c-designware-core.h" @@ -1094,4 +1094,4 @@ EXPORT_SYMBOL_GPL(i2c_dw_probe_master);  MODULE_DESCRIPTION("Synopsys DesignWare I2C bus master adapter");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(I2C_DW_COMMON); +MODULE_IMPORT_NS("I2C_DW_COMMON"); diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index 38265c3dc454..8e0267c7cc29 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c @@ -368,5 +368,5 @@ module_pci_driver(dw_i2c_driver);  MODULE_AUTHOR("Baruch Siach <baruch@tkos.co.il>");  MODULE_DESCRIPTION("Synopsys DesignWare PCI I2C bus adapter");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(I2C_DW); -MODULE_IMPORT_NS(I2C_DW_COMMON); +MODULE_IMPORT_NS("I2C_DW"); +MODULE_IMPORT_NS("I2C_DW_COMMON"); diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 3e12aab6bf2d..d6e1ee935399 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -397,5 +397,5 @@ module_exit(dw_i2c_exit_driver);  MODULE_AUTHOR("Baruch Siach <baruch@tkos.co.il>");  MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(I2C_DW); -MODULE_IMPORT_NS(I2C_DW_COMMON); +MODULE_IMPORT_NS("I2C_DW"); +MODULE_IMPORT_NS("I2C_DW_COMMON"); diff --git a/drivers/i2c/busses/i2c-designware-slave.c b/drivers/i2c/busses/i2c-designware-slave.c index fad568e3523b..dc2b788eac5b 100644 --- a/drivers/i2c/busses/i2c-designware-slave.c +++ b/drivers/i2c/busses/i2c-designware-slave.c @@ -16,7 +16,7 @@  #include <linux/pm_runtime.h>  #include <linux/regmap.h> -#define DEFAULT_SYMBOL_NAMESPACE	I2C_DW +#define DEFAULT_SYMBOL_NAMESPACE	"I2C_DW"  #include "i2c-designware-core.h" @@ -282,4 +282,4 @@ EXPORT_SYMBOL_GPL(i2c_dw_probe_slave);  MODULE_AUTHOR("Luis Oliveira <lolivei@synopsys.com>");  MODULE_DESCRIPTION("Synopsys DesignWare I2C bus slave adapter");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(I2C_DW_COMMON); +MODULE_IMPORT_NS("I2C_DW_COMMON"); diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index f751d231ded8..5c9a8dfbc4a0 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -335,6 +335,7 @@ static const struct of_device_id i2c_imx_dt_ids[] = {  	{ .compatible = "fsl,imx6sll-i2c", .data = &imx6_i2c_hwdata, },  	{ .compatible = "fsl,imx6sx-i2c", .data = &imx6_i2c_hwdata, },  	{ .compatible = "fsl,imx6ul-i2c", .data = &imx6_i2c_hwdata, }, +	{ .compatible = "fsl,imx7d-i2c", .data = &imx6_i2c_hwdata, },  	{ .compatible = "fsl,imx7s-i2c", .data = &imx6_i2c_hwdata, },  	{ .compatible = "fsl,imx8mm-i2c", .data = &imx6_i2c_hwdata, },  	{ .compatible = "fsl,imx8mn-i2c", .data = &imx6_i2c_hwdata, }, @@ -532,22 +533,20 @@ static void i2c_imx_dma_free(struct imx_i2c_struct *i2c_imx)  static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool atomic)  { +	bool multi_master = i2c_imx->multi_master;  	unsigned long orig_jiffies = jiffies;  	unsigned int temp; -	if (!i2c_imx->multi_master) -		return 0; -  	while (1) {  		temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR);  		/* check for arbitration lost */ -		if (temp & I2SR_IAL) { +		if (multi_master && (temp & I2SR_IAL)) {  			i2c_imx_clear_irq(i2c_imx, I2SR_IAL);  			return -EAGAIN;  		} -		if (for_busy && (temp & I2SR_IBB)) { +		if (for_busy && (!multi_master || (temp & I2SR_IBB))) {  			i2c_imx->stopped = 0;  			break;  		} diff --git a/drivers/i2c/busses/i2c-ljca.c b/drivers/i2c/busses/i2c-ljca.c index 1dc516ef0fdd..93274f0c2d72 100644 --- a/drivers/i2c/busses/i2c-ljca.c +++ b/drivers/i2c/busses/i2c-ljca.c @@ -340,4 +340,4 @@ MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");  MODULE_AUTHOR("Lixu Zhang <lixu.zhang@intel.com>");  MODULE_DESCRIPTION("Intel La Jolla Cove Adapter USB-I2C driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LJCA); +MODULE_IMPORT_NS("LJCA"); diff --git a/drivers/i2c/busses/i2c-microchip-corei2c.c b/drivers/i2c/busses/i2c-microchip-corei2c.c index d1543e7d8380..5db73429125c 100644 --- a/drivers/i2c/busses/i2c-microchip-corei2c.c +++ b/drivers/i2c/busses/i2c-microchip-corei2c.c @@ -93,27 +93,35 @@   * @base:		pointer to register struct   * @dev:		device reference   * @i2c_clk:		clock reference for i2c input clock + * @msg_queue:		pointer to the messages requiring sending   * @buf:		pointer to msg buffer for easier use   * @msg_complete:	xfer completion object   * @adapter:		core i2c abstraction   * @msg_err:		error code for completed message   * @bus_clk_rate:	current i2c bus clock rate   * @isr_status:		cached copy of local ISR status + * @total_num:		total number of messages to be sent/received + * @current_num:	index of the current message being sent/received   * @msg_len:		number of bytes transferred in msg   * @addr:		address of the current slave + * @restart_needed:	whether or not a repeated start is required after current message   */  struct mchp_corei2c_dev {  	void __iomem *base;  	struct device *dev;  	struct clk *i2c_clk; +	struct i2c_msg *msg_queue;  	u8 *buf;  	struct completion msg_complete;  	struct i2c_adapter adapter;  	int msg_err; +	int total_num; +	int current_num;  	u32 bus_clk_rate;  	u32 isr_status;  	u16 msg_len;  	u8 addr; +	bool restart_needed;  };  static void mchp_corei2c_core_disable(struct mchp_corei2c_dev *idev) @@ -222,6 +230,47 @@ static int mchp_corei2c_fill_tx(struct mchp_corei2c_dev *idev)  	return 0;  } +static void mchp_corei2c_next_msg(struct mchp_corei2c_dev *idev) +{ +	struct i2c_msg *this_msg; +	u8 ctrl; + +	if (idev->current_num >= idev->total_num) { +		complete(&idev->msg_complete); +		return; +	} + +	/* +	 * If there's been an error, the isr needs to return control +	 * to the "main" part of the driver, so as not to keep sending +	 * messages once it completes and clears the SI bit. +	 */ +	if (idev->msg_err) { +		complete(&idev->msg_complete); +		return; +	} + +	this_msg = idev->msg_queue++; + +	if (idev->current_num < (idev->total_num - 1)) { +		struct i2c_msg *next_msg = idev->msg_queue; + +		idev->restart_needed = next_msg->flags & I2C_M_RD; +	} else { +		idev->restart_needed = false; +	} + +	idev->addr = i2c_8bit_addr_from_msg(this_msg); +	idev->msg_len = this_msg->len; +	idev->buf = this_msg->buf; + +	ctrl = readb(idev->base + CORE_I2C_CTRL); +	ctrl |= CTRL_STA; +	writeb(ctrl, idev->base + CORE_I2C_CTRL); + +	idev->current_num++; +} +  static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev)  {  	u32 status = idev->isr_status; @@ -238,8 +287,6 @@ static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev)  		ctrl &= ~CTRL_STA;  		writeb(idev->addr, idev->base + CORE_I2C_DATA);  		writeb(ctrl, idev->base + CORE_I2C_CTRL); -		if (idev->msg_len == 0) -			finished = true;  		break;  	case STATUS_M_ARB_LOST:  		idev->msg_err = -EAGAIN; @@ -247,10 +294,14 @@ static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev)  		break;  	case STATUS_M_SLAW_ACK:  	case STATUS_M_TX_DATA_ACK: -		if (idev->msg_len > 0) +		if (idev->msg_len > 0) {  			mchp_corei2c_fill_tx(idev); -		else -			last_byte = true; +		} else { +			if (idev->restart_needed) +				finished = true; +			else +				last_byte = true; +		}  		break;  	case STATUS_M_TX_DATA_NACK:  	case STATUS_M_SLAR_NACK: @@ -287,7 +338,7 @@ static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev)  		mchp_corei2c_stop(idev);  	if (last_byte || finished) -		complete(&idev->msg_complete); +		mchp_corei2c_next_msg(idev);  	return IRQ_HANDLED;  } @@ -311,21 +362,48 @@ static irqreturn_t mchp_corei2c_isr(int irq, void *_dev)  	return ret;  } -static int mchp_corei2c_xfer_msg(struct mchp_corei2c_dev *idev, -				 struct i2c_msg *msg) +static int mchp_corei2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, +			     int num)  { -	u8 ctrl; +	struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap); +	struct i2c_msg *this_msg = msgs;  	unsigned long time_left; +	u8 ctrl; + +	mchp_corei2c_core_enable(idev); + +	/* +	 * The isr controls the flow of a transfer, this info needs to be saved +	 * to a location that it can access the queue information from. +	 */ +	idev->restart_needed = false; +	idev->msg_queue = msgs; +	idev->total_num = num; +	idev->current_num = 0; -	idev->addr = i2c_8bit_addr_from_msg(msg); -	idev->msg_len = msg->len; -	idev->buf = msg->buf; +	/* +	 * But the first entry to the isr is triggered by the start in this +	 * function, so the first message needs to be "dequeued". +	 */ +	idev->addr = i2c_8bit_addr_from_msg(this_msg); +	idev->msg_len = this_msg->len; +	idev->buf = this_msg->buf;  	idev->msg_err = 0; -	reinit_completion(&idev->msg_complete); +	if (idev->total_num > 1) { +		struct i2c_msg *next_msg = msgs + 1; -	mchp_corei2c_core_enable(idev); +		idev->restart_needed = next_msg->flags & I2C_M_RD; +	} +	idev->current_num++; +	idev->msg_queue++; + +	reinit_completion(&idev->msg_complete); + +	/* +	 * Send the first start to pass control to the isr +	 */  	ctrl = readb(idev->base + CORE_I2C_CTRL);  	ctrl |= CTRL_STA;  	writeb(ctrl, idev->base + CORE_I2C_CTRL); @@ -335,20 +413,8 @@ static int mchp_corei2c_xfer_msg(struct mchp_corei2c_dev *idev,  	if (!time_left)  		return -ETIMEDOUT; -	return idev->msg_err; -} - -static int mchp_corei2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, -			     int num) -{ -	struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap); -	int i, ret; - -	for (i = 0; i < num; i++) { -		ret = mchp_corei2c_xfer_msg(idev, msgs++); -		if (ret) -			return ret; -	} +	if (idev->msg_err) +		return idev->msg_err;  	return num;  } diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index efb33802804f..d2877e4cc28d 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c @@ -1075,6 +1075,7 @@ static const struct of_device_id nmk_i2c_eyeq_match_table[] = {  		.compatible = "mobileye,eyeq6h-i2c",  		.data = (void *)NMK_I2C_EYEQ_FLAG_32B_BUS,  	}, +	{ /* sentinel */ }  };  static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 9402fa3811c5..dd75916157f0 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c @@ -195,7 +195,7 @@ int piix4_sb800_region_request(struct device *dev, struct sb800_mmio_cfg *mmio_c  	return 0;  } -EXPORT_SYMBOL_NS_GPL(piix4_sb800_region_request, PIIX4_SMBUS); +EXPORT_SYMBOL_NS_GPL(piix4_sb800_region_request, "PIIX4_SMBUS");  void piix4_sb800_region_release(struct device *dev, struct sb800_mmio_cfg *mmio_cfg)  { @@ -208,7 +208,7 @@ void piix4_sb800_region_release(struct device *dev, struct sb800_mmio_cfg *mmio_  	release_region(SB800_PIIX4_SMB_IDX, SB800_PIIX4_SMB_MAP_SIZE);  } -EXPORT_SYMBOL_NS_GPL(piix4_sb800_region_release, PIIX4_SMBUS); +EXPORT_SYMBOL_NS_GPL(piix4_sb800_region_release, "PIIX4_SMBUS");  static bool piix4_sb800_use_mmio(struct pci_dev *PIIX4_dev)  { @@ -591,7 +591,7 @@ int piix4_transaction(struct i2c_adapter *piix4_adapter, unsigned short piix4_sm  		inb_p(SMBHSTDAT1));  	return result;  } -EXPORT_SYMBOL_NS_GPL(piix4_transaction, PIIX4_SMBUS); +EXPORT_SYMBOL_NS_GPL(piix4_transaction, "PIIX4_SMBUS");  /* Return negative errno on error. */  static s32 piix4_access(struct i2c_adapter * adap, u16 addr, @@ -767,7 +767,7 @@ int piix4_sb800_port_sel(u8 port, struct sb800_mmio_cfg *mmio_cfg)  	return (smba_en_lo & piix4_port_mask_sb800);  } -EXPORT_SYMBOL_NS_GPL(piix4_sb800_port_sel, PIIX4_SMBUS); +EXPORT_SYMBOL_NS_GPL(piix4_sb800_port_sel, "PIIX4_SMBUS");  /*   * Handles access to multiple SMBus ports on the SB800. diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index d4d139b97513..9a1af5bbd604 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c @@ -95,7 +95,7 @@ enum {  static inline int wait_timeout(struct i2c_pnx_algo_data *data)  { -	long timeout = data->timeout; +	long timeout = jiffies_to_msecs(data->timeout);  	while (timeout > 0 &&  			(ioread32(I2C_REG_STS(data)) & mstatus_active)) {  		mdelay(1); @@ -106,7 +106,7 @@ static inline int wait_timeout(struct i2c_pnx_algo_data *data)  static inline int wait_reset(struct i2c_pnx_algo_data *data)  { -	long timeout = data->timeout; +	long timeout = jiffies_to_msecs(data->timeout);  	while (timeout > 0 &&  			(ioread32(I2C_REG_CTL(data)) & mcntrl_reset)) {  		mdelay(1); diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c index a7b77d14ee86..5693a38da7b5 100644 --- a/drivers/i2c/busses/i2c-rcar.c +++ b/drivers/i2c/busses/i2c-rcar.c @@ -130,6 +130,8 @@  #define ID_P_PM_BLOCKED		BIT(31)  #define ID_P_MASK		GENMASK(31, 27) +#define ID_SLAVE_NACK		BIT(0) +  enum rcar_i2c_type {  	I2C_RCAR_GEN1,  	I2C_RCAR_GEN2, @@ -166,6 +168,7 @@ struct rcar_i2c_priv {  	int irq;  	struct i2c_client *host_notify_client; +	u8 slave_flags;  };  #define rcar_i2c_priv_to_dev(p)		((p)->adap.dev.parent) @@ -655,6 +658,7 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)  {  	u32 ssr_raw, ssr_filtered;  	u8 value; +	int ret;  	ssr_raw = rcar_i2c_read(priv, ICSSR) & 0xff;  	ssr_filtered = ssr_raw & rcar_i2c_read(priv, ICSIER); @@ -670,7 +674,10 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)  			rcar_i2c_write(priv, ICRXTX, value);  			rcar_i2c_write(priv, ICSIER, SDE | SSR | SAR);  		} else { -			i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); +			ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value); +			if (ret) +				priv->slave_flags |= ID_SLAVE_NACK; +  			rcar_i2c_read(priv, ICRXTX);	/* dummy read */  			rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR);  		} @@ -683,18 +690,21 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)  	if (ssr_filtered & SSR) {  		i2c_slave_event(priv->slave, I2C_SLAVE_STOP, &value);  		rcar_i2c_write(priv, ICSCR, SIE | SDBS); /* clear our NACK */ +		priv->slave_flags &= ~ID_SLAVE_NACK;  		rcar_i2c_write(priv, ICSIER, SAR);  		rcar_i2c_write(priv, ICSSR, ~SSR & 0xff);  	}  	/* master wants to write to us */  	if (ssr_filtered & SDR) { -		int ret; -  		value = rcar_i2c_read(priv, ICRXTX);  		ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value); -		/* Send NACK in case of error */ -		rcar_i2c_write(priv, ICSCR, SIE | SDBS | (ret < 0 ? FNA : 0)); +		if (ret) +			priv->slave_flags |= ID_SLAVE_NACK; + +		/* Send NACK in case of error, but it will come 1 byte late :( */ +		rcar_i2c_write(priv, ICSCR, SIE | SDBS | +			       (priv->slave_flags & ID_SLAVE_NACK ? FNA : 0));  		rcar_i2c_write(priv, ICSSR, ~SDR & 0xff);  	} diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c index c218f73c3650..9264adc97ca9 100644 --- a/drivers/i2c/busses/i2c-riic.c +++ b/drivers/i2c/busses/i2c-riic.c @@ -352,7 +352,7 @@ static int riic_init_hw(struct riic_dev *riic)  		if (brl <= (0x1F + 3))  			break; -		total_ticks /= 2; +		total_ticks = DIV_ROUND_UP(total_ticks, 2);  		rate /= 2;  	} diff --git a/drivers/i2c/i2c-atr.c b/drivers/i2c/i2c-atr.c index f21475ae5921..8fe9ddff8e96 100644 --- a/drivers/i2c/i2c-atr.c +++ b/drivers/i2c/i2c-atr.c @@ -412,7 +412,7 @@ static int i2c_atr_bus_notifier_call(struct notifier_block *nb,  				dev_name(dev), ret);  		break; -	case BUS_NOTIFY_DEL_DEVICE: +	case BUS_NOTIFY_REMOVED_DEVICE:  		i2c_atr_detach_client(client->adapter, client);  		break; @@ -547,7 +547,7 @@ err_destroy_mutex:  	return ERR_PTR(ret);  } -EXPORT_SYMBOL_NS_GPL(i2c_atr_new, I2C_ATR); +EXPORT_SYMBOL_NS_GPL(i2c_atr_new, "I2C_ATR");  void i2c_atr_delete(struct i2c_atr *atr)  { @@ -562,7 +562,7 @@ void i2c_atr_delete(struct i2c_atr *atr)  	mutex_destroy(&atr->lock);  	kfree(atr);  } -EXPORT_SYMBOL_NS_GPL(i2c_atr_delete, I2C_ATR); +EXPORT_SYMBOL_NS_GPL(i2c_atr_delete, "I2C_ATR");  int i2c_atr_add_adapter(struct i2c_atr *atr, u32 chan_id,  			struct device *adapter_parent, @@ -657,7 +657,7 @@ err_fwnode_put:  	kfree(chan);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(i2c_atr_add_adapter, I2C_ATR); +EXPORT_SYMBOL_NS_GPL(i2c_atr_add_adapter, "I2C_ATR");  void i2c_atr_del_adapter(struct i2c_atr *atr, u32 chan_id)  { @@ -690,19 +690,19 @@ void i2c_atr_del_adapter(struct i2c_atr *atr, u32 chan_id)  	kfree(chan->orig_addrs);  	kfree(chan);  } -EXPORT_SYMBOL_NS_GPL(i2c_atr_del_adapter, I2C_ATR); +EXPORT_SYMBOL_NS_GPL(i2c_atr_del_adapter, "I2C_ATR");  void i2c_atr_set_driver_data(struct i2c_atr *atr, void *data)  {  	atr->priv = data;  } -EXPORT_SYMBOL_NS_GPL(i2c_atr_set_driver_data, I2C_ATR); +EXPORT_SYMBOL_NS_GPL(i2c_atr_set_driver_data, "I2C_ATR");  void *i2c_atr_get_driver_data(struct i2c_atr *atr)  {  	return atr->priv;  } -EXPORT_SYMBOL_NS_GPL(i2c_atr_get_driver_data, I2C_ATR); +EXPORT_SYMBOL_NS_GPL(i2c_atr_get_driver_data, "I2C_ATR");  MODULE_AUTHOR("Luca Ceresoli <luca.ceresoli@bootlin.com>");  MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>"); diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 7c810893bfa3..75d30861ffe2 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -1562,6 +1562,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)  	res = device_add(&adap->dev);  	if (res) {  		pr_err("adapter '%s': can't register device (%d)\n", adap->name, res); +		put_device(&adap->dev);  		goto out_list;  	} diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c index b9ca785f8b17..0a66267e4836 100644 --- a/drivers/i2c/i2c-core-of-prober.c +++ b/drivers/i2c/i2c-core-of-prober.c @@ -181,7 +181,7 @@ out_put_i2c_adapter:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(i2c_of_probe_component, I2C_OF_PROBER); +EXPORT_SYMBOL_NS_GPL(i2c_of_probe_component, "I2C_OF_PROBER");  static int i2c_of_probe_simple_get_supply(struct device *dev, struct device_node *node,  					  struct i2c_of_probe_simple_ctx *ctx) @@ -366,7 +366,7 @@ out_put_node:  	of_node_put(node);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_enable, I2C_OF_PROBER); +EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_enable, "I2C_OF_PROBER");  /**   * i2c_of_probe_simple_cleanup_early - \ @@ -383,7 +383,7 @@ void i2c_of_probe_simple_cleanup_early(struct device *dev, void *data)  	i2c_of_probe_simple_put_gpiod(ctx);  } -EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_cleanup_early, I2C_OF_PROBER); +EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_cleanup_early, "I2C_OF_PROBER");  /**   * i2c_of_probe_simple_cleanup - Clean up and release resources for I2C OF prober simple helpers @@ -405,11 +405,11 @@ void i2c_of_probe_simple_cleanup(struct device *dev, void *data)  	i2c_of_probe_simple_disable_regulator(dev, ctx);  	i2c_of_probe_simple_put_supply(ctx);  } -EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_cleanup, I2C_OF_PROBER); +EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_cleanup, "I2C_OF_PROBER");  struct i2c_of_probe_ops i2c_of_probe_simple_ops = {  	.enable = i2c_of_probe_simple_enable,  	.cleanup_early = i2c_of_probe_simple_cleanup_early,  	.cleanup = i2c_of_probe_simple_cleanup,  }; -EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_ops, I2C_OF_PROBER); +EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_ops, "I2C_OF_PROBER"); diff --git a/drivers/i2c/i2c-slave-testunit.c b/drivers/i2c/i2c-slave-testunit.c index 0d6fbaa48248..6de4307050dd 100644 --- a/drivers/i2c/i2c-slave-testunit.c +++ b/drivers/i2c/i2c-slave-testunit.c @@ -38,6 +38,7 @@ enum testunit_regs {  enum testunit_flags {  	TU_FLAG_IN_PROCESS, +	TU_FLAG_NACK,  };  struct testunit_data { @@ -90,8 +91,10 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,  	switch (event) {  	case I2C_SLAVE_WRITE_REQUESTED: -		if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags)) -			return -EBUSY; +		if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) { +			ret = -EBUSY; +			break; +		}  		memset(tu->regs, 0, TU_NUM_REGS);  		tu->reg_idx = 0; @@ -99,8 +102,10 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,  		break;  	case I2C_SLAVE_WRITE_RECEIVED: -		if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags)) -			return -EBUSY; +		if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) { +			ret = -EBUSY; +			break; +		}  		if (tu->reg_idx < TU_NUM_REGS)  			tu->regs[tu->reg_idx] = *val; @@ -129,6 +134,8 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,  		 * here because we still need them in the workqueue!  		 */  		tu->reg_idx = 0; + +		clear_bit(TU_FLAG_NACK, &tu->flags);  		break;  	case I2C_SLAVE_READ_PROCESSED: @@ -151,6 +158,10 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,  		break;  	} +	/* If an error occurred somewhen, we NACK everything until next STOP */ +	if (ret) +		set_bit(TU_FLAG_NACK, &tu->flags); +  	return ret;  } diff --git a/drivers/i2c/muxes/i2c-demux-pinctrl.c b/drivers/i2c/muxes/i2c-demux-pinctrl.c index dce18f763a09..77a740561fd7 100644 --- a/drivers/i2c/muxes/i2c-demux-pinctrl.c +++ b/drivers/i2c/muxes/i2c-demux-pinctrl.c @@ -68,7 +68,7 @@ static int i2c_demux_activate_master(struct i2c_demux_pinctrl_priv *priv, u32 ne  	}  	/* -	 * Check if there are pinctrl states at all. Note: we cant' use +	 * Check if there are pinctrl states at all. Note: we can't use  	 * devm_pinctrl_get_select() because we need to distinguish between  	 * the -ENODEV from devm_pinctrl_get() and pinctrl_lookup_state().  	 */ @@ -261,7 +261,9 @@ static int i2c_demux_pinctrl_probe(struct platform_device *pdev)  	pm_runtime_no_callbacks(&pdev->dev);  	/* switch to first parent as active master */ -	i2c_demux_activate_master(priv, 0); +	err = i2c_demux_activate_master(priv, 0); +	if (err) +		goto err_rollback;  	err = device_create_file(&pdev->dev, &dev_attr_available_masters);  	if (err) diff --git a/drivers/i3c/master/ast2600-i3c-master.c b/drivers/i3c/master/ast2600-i3c-master.c index 84942dbb6f80..e05e83812c71 100644 --- a/drivers/i3c/master/ast2600-i3c-master.c +++ b/drivers/i3c/master/ast2600-i3c-master.c @@ -174,7 +174,7 @@ MODULE_DEVICE_TABLE(of, ast2600_i3c_master_of_match);  static struct platform_driver ast2600_i3c_driver = {  	.probe = ast2600_i3c_probe, -	.remove_new = ast2600_i3c_remove, +	.remove = ast2600_i3c_remove,  	.driver = {  		.name = "ast2600-i3c-master",  		.of_match_table = ast2600_i3c_master_of_match, diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c index 5b5c2e4bdc51..d4b80eb8cecd 100644 --- a/drivers/i3c/master/dw-i3c-master.c +++ b/drivers/i3c/master/dw-i3c-master.c @@ -1783,7 +1783,7 @@ MODULE_DEVICE_TABLE(acpi, amd_i3c_device_match);  static struct platform_driver dw_i3c_driver = {  	.probe = dw_i3c_probe, -	.remove_new = dw_i3c_remove, +	.remove = dw_i3c_remove,  	.driver = {  		.name = "dw-i3c-master",  		.of_match_table = dw_i3c_master_of_match, diff --git a/drivers/i3c/master/i3c-master-cdns.c b/drivers/i3c/master/i3c-master-cdns.c index fe4d59833ad5..06c0592487d3 100644 --- a/drivers/i3c/master/i3c-master-cdns.c +++ b/drivers/i3c/master/i3c-master-cdns.c @@ -1676,7 +1676,7 @@ static void cdns_i3c_master_remove(struct platform_device *pdev)  static struct platform_driver cdns_i3c_master = {  	.probe = cdns_i3c_master_probe, -	.remove_new = cdns_i3c_master_remove, +	.remove = cdns_i3c_master_remove,  	.driver = {  		.name = "cdns-i3c-master",  		.of_match_table = cdns_i3c_master_of_ids, diff --git a/drivers/i3c/master/mipi-i3c-hci/core.c b/drivers/i3c/master/mipi-i3c-hci/core.c index e6e482a259b4..648c501407ce 100644 --- a/drivers/i3c/master/mipi-i3c-hci/core.c +++ b/drivers/i3c/master/mipi-i3c-hci/core.c @@ -844,7 +844,7 @@ MODULE_DEVICE_TABLE(acpi, i3c_hci_acpi_match);  static struct platform_driver i3c_hci_driver = {  	.probe = i3c_hci_probe, -	.remove_new = i3c_hci_remove, +	.remove = i3c_hci_remove,  	.driver = {  		.name = "mipi-i3c-hci",  		.of_match_table = of_match_ptr(i3c_hci_of_match), diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index c1ee3828e7ee..d6057d8c7dec 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -1966,7 +1966,7 @@ MODULE_DEVICE_TABLE(of, svc_i3c_master_of_match_tbl);  static struct platform_driver svc_i3c_master = {  	.probe = svc_i3c_master_probe, -	.remove_new = svc_i3c_master_remove, +	.remove = svc_i3c_master_remove,  	.driver = {  		.name = "silvaco-i3c-master",  		.of_match_table = svc_i3c_master_of_match_tbl, diff --git a/drivers/iio/accel/adis16201.c b/drivers/iio/accel/adis16201.c index d054721859b3..8601b9a8b8e7 100644 --- a/drivers/iio/accel/adis16201.c +++ b/drivers/iio/accel/adis16201.c @@ -300,4 +300,4 @@ MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16201 Dual-Axis Digital Inclinometer and Accelerometer");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("spi:adis16201"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/accel/adis16209.c b/drivers/iio/accel/adis16209.c index 0035e4f4db63..41ffd92f27fd 100644 --- a/drivers/iio/accel/adis16209.c +++ b/drivers/iio/accel/adis16209.c @@ -310,4 +310,4 @@ MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16209 Dual-Axis Digital Inclinometer and Accelerometer");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("spi:adis16209"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/accel/adxl313_core.c b/drivers/iio/accel/adxl313_core.c index 4de0a41bd679..46cca10e776f 100644 --- a/drivers/iio/accel/adxl313_core.c +++ b/drivers/iio/accel/adxl313_core.c @@ -32,19 +32,19 @@ const struct regmap_access_table adxl312_readable_regs_table = {  	.yes_ranges = adxl312_readable_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl312_readable_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl312_readable_regs_table, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl312_readable_regs_table, "IIO_ADXL313");  const struct regmap_access_table adxl313_readable_regs_table = {  	.yes_ranges = adxl313_readable_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl313_readable_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl313_readable_regs_table, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl313_readable_regs_table, "IIO_ADXL313");  const struct regmap_access_table adxl314_readable_regs_table = {  	.yes_ranges = adxl312_readable_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl312_readable_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl314_readable_regs_table, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl314_readable_regs_table, "IIO_ADXL313");  static int adxl312_check_id(struct device *dev,  			    struct adxl313_data *data) @@ -121,7 +121,7 @@ const struct adxl313_chip_info adxl31x_chip_info[] = {  		.check_id = &adxl312_check_id,  	},  }; -EXPORT_SYMBOL_NS_GPL(adxl31x_chip_info, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl31x_chip_info, "IIO_ADXL313");  static const struct regmap_range adxl312_writable_reg_range[] = {  	regmap_reg_range(ADXL313_REG_OFS_AXIS(0), ADXL313_REG_OFS_AXIS(2)), @@ -144,19 +144,19 @@ const struct regmap_access_table adxl312_writable_regs_table = {  	.yes_ranges = adxl312_writable_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl312_writable_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl312_writable_regs_table, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl312_writable_regs_table, "IIO_ADXL313");  const struct regmap_access_table adxl313_writable_regs_table = {  	.yes_ranges = adxl313_writable_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl313_writable_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl313_writable_regs_table, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl313_writable_regs_table, "IIO_ADXL313");  const struct regmap_access_table adxl314_writable_regs_table = {  	.yes_ranges = adxl312_writable_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl312_writable_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl314_writable_regs_table, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl314_writable_regs_table, "IIO_ADXL313");  static const int adxl313_odr_freqs[][2] = {  	[0] = { 6, 250000 }, @@ -417,7 +417,7 @@ int adxl313_core_probe(struct device *dev,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(adxl313_core_probe, IIO_ADXL313); +EXPORT_SYMBOL_NS_GPL(adxl313_core_probe, "IIO_ADXL313");  MODULE_AUTHOR("Lucas Stankus <lucas.p.stankus@gmail.com>");  MODULE_DESCRIPTION("ADXL313 3-Axis Digital Accelerometer core driver"); diff --git a/drivers/iio/accel/adxl313_i2c.c b/drivers/iio/accel/adxl313_i2c.c index a4cf0cf2c5aa..dfa51860cd83 100644 --- a/drivers/iio/accel/adxl313_i2c.c +++ b/drivers/iio/accel/adxl313_i2c.c @@ -92,4 +92,4 @@ module_i2c_driver(adxl313_i2c_driver);  MODULE_AUTHOR("Lucas Stankus <lucas.p.stankus@gmail.com>");  MODULE_DESCRIPTION("ADXL313 3-Axis Digital Accelerometer I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADXL313); +MODULE_IMPORT_NS("IIO_ADXL313"); diff --git a/drivers/iio/accel/adxl313_spi.c b/drivers/iio/accel/adxl313_spi.c index 6f8d73f6e5a9..ebc5d09f108d 100644 --- a/drivers/iio/accel/adxl313_spi.c +++ b/drivers/iio/accel/adxl313_spi.c @@ -119,4 +119,4 @@ module_spi_driver(adxl313_spi_driver);  MODULE_AUTHOR("Lucas Stankus <lucas.p.stankus@gmail.com>");  MODULE_DESCRIPTION("ADXL313 3-Axis Digital Accelerometer SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADXL313); +MODULE_IMPORT_NS("IIO_ADXL313"); diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c index 006ce66c0aa3..b1efab0f6404 100644 --- a/drivers/iio/accel/adxl345_core.c +++ b/drivers/iio/accel/adxl345_core.c @@ -248,7 +248,7 @@ int adxl345_core_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(adxl345_core_probe, IIO_ADXL345); +EXPORT_SYMBOL_NS_GPL(adxl345_core_probe, "IIO_ADXL345");  MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>");  MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer core driver"); diff --git a/drivers/iio/accel/adxl345_i2c.c b/drivers/iio/accel/adxl345_i2c.c index 4065b8f7c8a8..cb23fb11fcd7 100644 --- a/drivers/iio/accel/adxl345_i2c.c +++ b/drivers/iio/accel/adxl345_i2c.c @@ -74,4 +74,4 @@ module_i2c_driver(adxl345_i2c_driver);  MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>");  MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADXL345); +MODULE_IMPORT_NS("IIO_ADXL345"); diff --git a/drivers/iio/accel/adxl345_spi.c b/drivers/iio/accel/adxl345_spi.c index 57e16b441702..968e7b390d4b 100644 --- a/drivers/iio/accel/adxl345_spi.c +++ b/drivers/iio/accel/adxl345_spi.c @@ -88,4 +88,4 @@ module_spi_driver(adxl345_spi_driver);  MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>");  MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADXL345); +MODULE_IMPORT_NS("IIO_ADXL345"); diff --git a/drivers/iio/accel/adxl355_core.c b/drivers/iio/accel/adxl355_core.c index 7ccd2f653b9b..e8cd21fa77a6 100644 --- a/drivers/iio/accel/adxl355_core.c +++ b/drivers/iio/accel/adxl355_core.c @@ -72,7 +72,7 @@ const struct regmap_access_table adxl355_readable_regs_tbl = {  	.yes_ranges = adxl355_read_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl355_read_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl355_readable_regs_tbl, IIO_ADXL355); +EXPORT_SYMBOL_NS_GPL(adxl355_readable_regs_tbl, "IIO_ADXL355");  static const struct regmap_range adxl355_write_reg_range[] = {  	regmap_reg_range(ADXL355_OFFSET_X_H_REG, ADXL355_RESET_REG), @@ -82,7 +82,7 @@ const struct regmap_access_table adxl355_writeable_regs_tbl = {  	.yes_ranges = adxl355_write_reg_range,  	.n_yes_ranges = ARRAY_SIZE(adxl355_write_reg_range),  }; -EXPORT_SYMBOL_NS_GPL(adxl355_writeable_regs_tbl, IIO_ADXL355); +EXPORT_SYMBOL_NS_GPL(adxl355_writeable_regs_tbl, "IIO_ADXL355");  const struct adxl355_chip_info adxl35x_chip_info[] = {  	[ADXL355] = { @@ -136,7 +136,7 @@ const struct adxl355_chip_info adxl35x_chip_info[] = {  		},  	},  }; -EXPORT_SYMBOL_NS_GPL(adxl35x_chip_info, IIO_ADXL355); +EXPORT_SYMBOL_NS_GPL(adxl35x_chip_info, "IIO_ADXL355");  enum adxl355_op_mode {  	ADXL355_MEASUREMENT, @@ -801,7 +801,7 @@ int adxl355_core_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(adxl355_core_probe, IIO_ADXL355); +EXPORT_SYMBOL_NS_GPL(adxl355_core_probe, "IIO_ADXL355");  MODULE_AUTHOR("Puranjay Mohan <puranjay12@gmail.com>");  MODULE_DESCRIPTION("ADXL355 3-Axis Digital Accelerometer core driver"); diff --git a/drivers/iio/accel/adxl355_i2c.c b/drivers/iio/accel/adxl355_i2c.c index 32398cde9608..1a512c7b792b 100644 --- a/drivers/iio/accel/adxl355_i2c.c +++ b/drivers/iio/accel/adxl355_i2c.c @@ -67,4 +67,4 @@ module_i2c_driver(adxl355_i2c_driver);  MODULE_AUTHOR("Puranjay Mohan <puranjay12@gmail.com>");  MODULE_DESCRIPTION("ADXL355 3-Axis Digital Accelerometer I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADXL355); +MODULE_IMPORT_NS("IIO_ADXL355"); diff --git a/drivers/iio/accel/adxl355_spi.c b/drivers/iio/accel/adxl355_spi.c index 5153ac815e4b..869e3e57d6f7 100644 --- a/drivers/iio/accel/adxl355_spi.c +++ b/drivers/iio/accel/adxl355_spi.c @@ -70,4 +70,4 @@ module_spi_driver(adxl355_spi_driver);  MODULE_AUTHOR("Puranjay Mohan <puranjay12@gmail.com>");  MODULE_DESCRIPTION("ADXL355 3-Axis Digital Accelerometer SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADXL355); +MODULE_IMPORT_NS("IIO_ADXL355"); diff --git a/drivers/iio/accel/adxl367.c b/drivers/iio/accel/adxl367.c index 705375f3b56e..a48ac0d7bd96 100644 --- a/drivers/iio/accel/adxl367.c +++ b/drivers/iio/accel/adxl367.c @@ -1475,7 +1475,7 @@ int adxl367_probe(struct device *dev, const struct adxl367_ops *ops,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(adxl367_probe, IIO_ADXL367); +EXPORT_SYMBOL_NS_GPL(adxl367_probe, "IIO_ADXL367");  MODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL367 3-axis accelerometer driver"); diff --git a/drivers/iio/accel/adxl367_i2c.c b/drivers/iio/accel/adxl367_i2c.c index deb82a43ec36..80f0b642b9b0 100644 --- a/drivers/iio/accel/adxl367_i2c.c +++ b/drivers/iio/accel/adxl367_i2c.c @@ -83,7 +83,7 @@ static struct i2c_driver adxl367_i2c_driver = {  module_i2c_driver(adxl367_i2c_driver); -MODULE_IMPORT_NS(IIO_ADXL367); +MODULE_IMPORT_NS("IIO_ADXL367");  MODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL367 3-axis accelerometer I2C driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/iio/accel/adxl367_spi.c b/drivers/iio/accel/adxl367_spi.c index b70117265791..49d7c8fbe8ed 100644 --- a/drivers/iio/accel/adxl367_spi.c +++ b/drivers/iio/accel/adxl367_spi.c @@ -160,7 +160,7 @@ static struct spi_driver adxl367_spi_driver = {  module_spi_driver(adxl367_spi_driver); -MODULE_IMPORT_NS(IIO_ADXL367); +MODULE_IMPORT_NS("IIO_ADXL367");  MODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL367 3-axis accelerometer SPI driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c index 5b9eb364760a..8ba5fbe6e1f5 100644 --- a/drivers/iio/accel/adxl372.c +++ b/drivers/iio/accel/adxl372.c @@ -1176,7 +1176,7 @@ bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)  {  	return (reg == ADXL372_FIFO_DATA);  } -EXPORT_SYMBOL_NS_GPL(adxl372_readable_noinc_reg, IIO_ADXL372); +EXPORT_SYMBOL_NS_GPL(adxl372_readable_noinc_reg, "IIO_ADXL372");  int adxl372_probe(struct device *dev, struct regmap *regmap,  		  int irq, const char *name) @@ -1260,7 +1260,7 @@ int adxl372_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(adxl372_probe, IIO_ADXL372); +EXPORT_SYMBOL_NS_GPL(adxl372_probe, "IIO_ADXL372");  MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer driver"); diff --git a/drivers/iio/accel/adxl372_i2c.c b/drivers/iio/accel/adxl372_i2c.c index 3571cfde1c0e..43d5fd921be7 100644 --- a/drivers/iio/accel/adxl372_i2c.c +++ b/drivers/iio/accel/adxl372_i2c.c @@ -67,4 +67,4 @@ module_i2c_driver(adxl372_i2c_driver);  MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer I2C driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ADXL372); +MODULE_IMPORT_NS("IIO_ADXL372"); diff --git a/drivers/iio/accel/adxl372_spi.c b/drivers/iio/accel/adxl372_spi.c index 787699773f96..1ab1997a55b1 100644 --- a/drivers/iio/accel/adxl372_spi.c +++ b/drivers/iio/accel/adxl372_spi.c @@ -58,4 +58,4 @@ module_spi_driver(adxl372_spi_driver);  MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer SPI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ADXL372); +MODULE_IMPORT_NS("IIO_ADXL372"); diff --git a/drivers/iio/accel/adxl380.c b/drivers/iio/accel/adxl380.c index a1460120d9da..90340f134722 100644 --- a/drivers/iio/accel/adxl380.c +++ b/drivers/iio/accel/adxl380.c @@ -194,7 +194,7 @@ const struct adxl380_chip_info adxl380_chip_info = {  	.temp_offset =  25 * 102 / 10 - 470,  }; -EXPORT_SYMBOL_NS_GPL(adxl380_chip_info, IIO_ADXL380); +EXPORT_SYMBOL_NS_GPL(adxl380_chip_info, "IIO_ADXL380");  const struct adxl380_chip_info adxl382_chip_info = {  	.name = "adxl382", @@ -211,7 +211,7 @@ const struct adxl380_chip_info adxl382_chip_info = {  	 */  	.temp_offset =  25 * 102 / 10 - 570,  }; -EXPORT_SYMBOL_NS_GPL(adxl382_chip_info, IIO_ADXL380); +EXPORT_SYMBOL_NS_GPL(adxl382_chip_info, "IIO_ADXL380");  static const unsigned int adxl380_th_reg_high_addr[2] = {  	[ADXL380_ACTIVITY] = ADXL380_THRESH_ACT_H_REG, @@ -263,7 +263,7 @@ bool adxl380_readable_noinc_reg(struct device *dev, unsigned int reg)  {  	return reg == ADXL380_FIFO_DATA;  } -EXPORT_SYMBOL_NS_GPL(adxl380_readable_noinc_reg, IIO_ADXL380); +EXPORT_SYMBOL_NS_GPL(adxl380_readable_noinc_reg, "IIO_ADXL380");  static int adxl380_set_measure_en(struct adxl380_state *st, bool en)  { @@ -1892,7 +1892,7 @@ int adxl380_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(adxl380_probe, IIO_ADXL380); +EXPORT_SYMBOL_NS_GPL(adxl380_probe, "IIO_ADXL380");  MODULE_AUTHOR("Ramona Gradinariu <ramona.gradinariu@analog.com>");  MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>"); diff --git a/drivers/iio/accel/adxl380_i2c.c b/drivers/iio/accel/adxl380_i2c.c index 1dc1e77be815..b4f86f972361 100644 --- a/drivers/iio/accel/adxl380_i2c.c +++ b/drivers/iio/accel/adxl380_i2c.c @@ -61,4 +61,4 @@ MODULE_AUTHOR("Ramona Gradinariu <ramona.gradinariu@analog.com>");  MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL380 3-axis accelerometer I2C driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ADXL380); +MODULE_IMPORT_NS("IIO_ADXL380"); diff --git a/drivers/iio/accel/adxl380_spi.c b/drivers/iio/accel/adxl380_spi.c index e7b5778cb6cf..6edd0d211ffa 100644 --- a/drivers/iio/accel/adxl380_spi.c +++ b/drivers/iio/accel/adxl380_spi.c @@ -63,4 +63,4 @@ MODULE_AUTHOR("Ramona Gradinariu <ramona.gradinariu@analog.com>");  MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADXL380 3-axis accelerometer SPI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ADXL380); +MODULE_IMPORT_NS("IIO_ADXL380"); diff --git a/drivers/iio/accel/bma400_core.c b/drivers/iio/accel/bma400_core.c index 906d2577be2d..ae806ed60271 100644 --- a/drivers/iio/accel/bma400_core.c +++ b/drivers/iio/accel/bma400_core.c @@ -194,7 +194,7 @@ const struct regmap_config bma400_regmap_config = {  	.writeable_reg = bma400_is_writable_reg,  	.volatile_reg = bma400_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bma400_regmap_config, IIO_BMA400); +EXPORT_SYMBOL_NS(bma400_regmap_config, "IIO_BMA400");  static const struct iio_mount_matrix *  bma400_accel_get_mount_matrix(const struct iio_dev *indio_dev, @@ -1763,7 +1763,7 @@ int bma400_probe(struct device *dev, struct regmap *regmap, int irq,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS(bma400_probe, IIO_BMA400); +EXPORT_SYMBOL_NS(bma400_probe, "IIO_BMA400");  MODULE_AUTHOR("Dan Robertson <dan@dlrobertson.com>");  MODULE_AUTHOR("Jagath Jog J <jagathjog1996@gmail.com>"); diff --git a/drivers/iio/accel/bma400_i2c.c b/drivers/iio/accel/bma400_i2c.c index c1c72f577295..24a390c3ae66 100644 --- a/drivers/iio/accel/bma400_i2c.c +++ b/drivers/iio/accel/bma400_i2c.c @@ -53,4 +53,4 @@ module_i2c_driver(bma400_i2c_driver);  MODULE_AUTHOR("Dan Robertson <dan@dlrobertson.com>");  MODULE_DESCRIPTION("Bosch BMA400 triaxial acceleration sensor (I2C)");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMA400); +MODULE_IMPORT_NS("IIO_BMA400"); diff --git a/drivers/iio/accel/bma400_spi.c b/drivers/iio/accel/bma400_spi.c index 765d8c4a4c4d..d386f643515b 100644 --- a/drivers/iio/accel/bma400_spi.c +++ b/drivers/iio/accel/bma400_spi.c @@ -112,4 +112,4 @@ module_spi_driver(bma400_spi_driver);  MODULE_AUTHOR("Dan Robertson <dan@dlrobertson.com>");  MODULE_DESCRIPTION("Bosch BMA400 triaxial acceleration sensor (SPI)");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMA400); +MODULE_IMPORT_NS("IIO_BMA400"); diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c index 158579350d59..744a034bb8b5 100644 --- a/drivers/iio/accel/bmc150-accel-core.c +++ b/drivers/iio/accel/bmc150-accel-core.c @@ -203,7 +203,7 @@ const struct regmap_config bmc150_regmap_conf = {  	.val_bits = 8,  	.max_register = 0x3f,  }; -EXPORT_SYMBOL_NS_GPL(bmc150_regmap_conf, IIO_BMC150); +EXPORT_SYMBOL_NS_GPL(bmc150_regmap_conf, "IIO_BMC150");  static int bmc150_accel_set_mode(struct bmc150_accel_data *data,  				 enum bmc150_power_modes mode, @@ -1760,7 +1760,7 @@ err_disable_regulators:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(bmc150_accel_core_probe, IIO_BMC150); +EXPORT_SYMBOL_NS_GPL(bmc150_accel_core_probe, "IIO_BMC150");  void bmc150_accel_core_remove(struct device *dev)  { @@ -1783,7 +1783,7 @@ void bmc150_accel_core_remove(struct device *dev)  	regulator_bulk_disable(ARRAY_SIZE(data->regulators),  			       data->regulators);  } -EXPORT_SYMBOL_NS_GPL(bmc150_accel_core_remove, IIO_BMC150); +EXPORT_SYMBOL_NS_GPL(bmc150_accel_core_remove, "IIO_BMC150");  #ifdef CONFIG_PM_SLEEP  static int bmc150_accel_suspend(struct device *dev) @@ -1858,7 +1858,7 @@ const struct dev_pm_ops bmc150_accel_pm_ops = {  	SET_RUNTIME_PM_OPS(bmc150_accel_runtime_suspend,  			   bmc150_accel_runtime_resume, NULL)  }; -EXPORT_SYMBOL_NS_GPL(bmc150_accel_pm_ops, IIO_BMC150); +EXPORT_SYMBOL_NS_GPL(bmc150_accel_pm_ops, "IIO_BMC150");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/iio/accel/bmc150-accel-i2c.c b/drivers/iio/accel/bmc150-accel-i2c.c index 1c2e40369839..0d4ce6c38931 100644 --- a/drivers/iio/accel/bmc150-accel-i2c.c +++ b/drivers/iio/accel/bmc150-accel-i2c.c @@ -291,4 +291,4 @@ module_i2c_driver(bmc150_accel_driver);  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("BMC150 I2C accelerometer driver"); -MODULE_IMPORT_NS(IIO_BMC150); +MODULE_IMPORT_NS("IIO_BMC150"); diff --git a/drivers/iio/accel/bmc150-accel-spi.c b/drivers/iio/accel/bmc150-accel-spi.c index a6b9f599eb7b..70b3642656ab 100644 --- a/drivers/iio/accel/bmc150-accel-spi.c +++ b/drivers/iio/accel/bmc150-accel-spi.c @@ -81,4 +81,4 @@ module_spi_driver(bmc150_accel_driver);  MODULE_AUTHOR("Markus Pargmann <mpa@pengutronix.de>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("BMC150 SPI accelerometer driver"); -MODULE_IMPORT_NS(IIO_BMC150); +MODULE_IMPORT_NS("IIO_BMC150"); diff --git a/drivers/iio/accel/bmi088-accel-core.c b/drivers/iio/accel/bmi088-accel-core.c index fc1c1613d673..9206fbdbf520 100644 --- a/drivers/iio/accel/bmi088-accel-core.c +++ b/drivers/iio/accel/bmi088-accel-core.c @@ -147,7 +147,7 @@ const struct regmap_config bmi088_regmap_conf = {  	.volatile_table = &bmi088_volatile_table,  	.cache_type = REGCACHE_RBTREE,  }; -EXPORT_SYMBOL_NS_GPL(bmi088_regmap_conf, IIO_BMI088); +EXPORT_SYMBOL_NS_GPL(bmi088_regmap_conf, "IIO_BMI088");  static int bmi088_accel_power_up(struct bmi088_accel_data *data)  { @@ -587,7 +587,7 @@ int bmi088_accel_core_probe(struct device *dev, struct regmap *regmap,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(bmi088_accel_core_probe, IIO_BMI088); +EXPORT_SYMBOL_NS_GPL(bmi088_accel_core_probe, "IIO_BMI088");  void bmi088_accel_core_remove(struct device *dev) @@ -601,7 +601,7 @@ void bmi088_accel_core_remove(struct device *dev)  	pm_runtime_set_suspended(dev);  	bmi088_accel_power_down(data);  } -EXPORT_SYMBOL_NS_GPL(bmi088_accel_core_remove, IIO_BMI088); +EXPORT_SYMBOL_NS_GPL(bmi088_accel_core_remove, "IIO_BMI088");  static int bmi088_accel_runtime_suspend(struct device *dev)  { diff --git a/drivers/iio/accel/bmi088-accel-i2c.c b/drivers/iio/accel/bmi088-accel-i2c.c index 17e9156bbe89..bd22bd0d3c25 100644 --- a/drivers/iio/accel/bmi088-accel-i2c.c +++ b/drivers/iio/accel/bmi088-accel-i2c.c @@ -67,4 +67,4 @@ module_i2c_driver(bmi088_accel_driver);  MODULE_AUTHOR("Jun Yan <jerrysteve1101@gmail.com>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("BMI088 accelerometer driver (I2C)"); -MODULE_IMPORT_NS(IIO_BMI088); +MODULE_IMPORT_NS("IIO_BMI088"); diff --git a/drivers/iio/accel/bmi088-accel-spi.c b/drivers/iio/accel/bmi088-accel-spi.c index df1adc059aa9..c9d51a74c07f 100644 --- a/drivers/iio/accel/bmi088-accel-spi.c +++ b/drivers/iio/accel/bmi088-accel-spi.c @@ -94,4 +94,4 @@ module_spi_driver(bmi088_accel_driver);  MODULE_AUTHOR("Niek van Agt <niek.van.agt@topicproducts.com>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("BMI088 accelerometer driver (SPI)"); -MODULE_IMPORT_NS(IIO_BMI088); +MODULE_IMPORT_NS("IIO_BMI088"); diff --git a/drivers/iio/accel/fxls8962af-core.c b/drivers/iio/accel/fxls8962af-core.c index f07fba17048e..65aac60f1245 100644 --- a/drivers/iio/accel/fxls8962af-core.c +++ b/drivers/iio/accel/fxls8962af-core.c @@ -180,7 +180,7 @@ const struct regmap_config fxls8962af_i2c_regmap_conf = {  	.val_bits = 8,  	.max_register = FXLS8962AF_MAX_REG,  }; -EXPORT_SYMBOL_NS_GPL(fxls8962af_i2c_regmap_conf, IIO_FXLS8962AF); +EXPORT_SYMBOL_NS_GPL(fxls8962af_i2c_regmap_conf, "IIO_FXLS8962AF");  const struct regmap_config fxls8962af_spi_regmap_conf = {  	.reg_bits = 8, @@ -188,7 +188,7 @@ const struct regmap_config fxls8962af_spi_regmap_conf = {  	.val_bits = 8,  	.max_register = FXLS8962AF_MAX_REG,  }; -EXPORT_SYMBOL_NS_GPL(fxls8962af_spi_regmap_conf, IIO_FXLS8962AF); +EXPORT_SYMBOL_NS_GPL(fxls8962af_spi_regmap_conf, "IIO_FXLS8962AF");  enum {  	fxls8962af_idx_x, @@ -1220,7 +1220,7 @@ int fxls8962af_core_probe(struct device *dev, struct regmap *regmap, int irq)  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(fxls8962af_core_probe, IIO_FXLS8962AF); +EXPORT_SYMBOL_NS_GPL(fxls8962af_core_probe, "IIO_FXLS8962AF");  static int fxls8962af_runtime_suspend(struct device *dev)  { diff --git a/drivers/iio/accel/fxls8962af-i2c.c b/drivers/iio/accel/fxls8962af-i2c.c index 160124673308..2e1bb43ef2a1 100644 --- a/drivers/iio/accel/fxls8962af-i2c.c +++ b/drivers/iio/accel/fxls8962af-i2c.c @@ -55,4 +55,4 @@ module_i2c_driver(fxls8962af_driver);  MODULE_AUTHOR("Sean Nyekjaer <sean@geanix.com>");  MODULE_DESCRIPTION("NXP FXLS8962AF/FXLS8964AF accelerometer i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_FXLS8962AF); +MODULE_IMPORT_NS("IIO_FXLS8962AF"); diff --git a/drivers/iio/accel/fxls8962af-spi.c b/drivers/iio/accel/fxls8962af-spi.c index a0d192211839..46fc6e002714 100644 --- a/drivers/iio/accel/fxls8962af-spi.c +++ b/drivers/iio/accel/fxls8962af-spi.c @@ -55,4 +55,4 @@ module_spi_driver(fxls8962af_driver);  MODULE_AUTHOR("Sean Nyekjaer <sean@geanix.com>");  MODULE_DESCRIPTION("NXP FXLS8962AF/FXLS8964AF accelerometer spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_FXLS8962AF); +MODULE_IMPORT_NS("IIO_FXLS8962AF"); diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c index 26b1033799fe..078fab2abb68 100644 --- a/drivers/iio/accel/hid-sensor-accel-3d.c +++ b/drivers/iio/accel/hid-sensor-accel-3d.c @@ -458,4 +458,4 @@ module_platform_driver(hid_accel_3d_platform_driver);  MODULE_DESCRIPTION("HID Sensor Accel 3D");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/accel/kionix-kx022a-i2c.c b/drivers/iio/accel/kionix-kx022a-i2c.c index 8a1d4fc28ddd..b39a43ecadff 100644 --- a/drivers/iio/accel/kionix-kx022a-i2c.c +++ b/drivers/iio/accel/kionix-kx022a-i2c.c @@ -65,4 +65,4 @@ module_i2c_driver(kx022a_i2c_driver);  MODULE_DESCRIPTION("ROHM/Kionix KX022A accelerometer driver");  MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_KX022A); +MODULE_IMPORT_NS("IIO_KX022A"); diff --git a/drivers/iio/accel/kionix-kx022a-spi.c b/drivers/iio/accel/kionix-kx022a-spi.c index f798b964d0b5..c38a47806a00 100644 --- a/drivers/iio/accel/kionix-kx022a-spi.c +++ b/drivers/iio/accel/kionix-kx022a-spi.c @@ -65,4 +65,4 @@ module_spi_driver(kx022a_spi_driver);  MODULE_DESCRIPTION("ROHM/Kionix kx022A accelerometer driver");  MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_KX022A); +MODULE_IMPORT_NS("IIO_KX022A"); diff --git a/drivers/iio/accel/kionix-kx022a.c b/drivers/iio/accel/kionix-kx022a.c index 53261e1d5d1f..670bac21965b 100644 --- a/drivers/iio/accel/kionix-kx022a.c +++ b/drivers/iio/accel/kionix-kx022a.c @@ -1176,7 +1176,7 @@ const struct kx022a_chip_info kx022a_chip_info = {  	.xout_l				= KX022A_REG_XOUT_L,  	.get_fifo_bytes_available	= kx022a_get_fifo_bytes_available,  }; -EXPORT_SYMBOL_NS_GPL(kx022a_chip_info, IIO_KX022A); +EXPORT_SYMBOL_NS_GPL(kx022a_chip_info, "IIO_KX022A");  const struct kx022a_chip_info kx132_chip_info = {  	.name			  = "kx132-1211", @@ -1202,7 +1202,7 @@ const struct kx022a_chip_info kx132_chip_info = {  	.xout_l			  = KX132_REG_XOUT_L,  	.get_fifo_bytes_available = kx132_get_fifo_bytes_available,  }; -EXPORT_SYMBOL_NS_GPL(kx132_chip_info, IIO_KX022A); +EXPORT_SYMBOL_NS_GPL(kx132_chip_info, "IIO_KX022A");  /*   * Despite the naming, KX132ACR-LBZ is not similar to KX132-1211 but it is @@ -1234,7 +1234,7 @@ const struct kx022a_chip_info kx132acr_chip_info = {  	.xout_l				= KX022A_REG_XOUT_L,  	.get_fifo_bytes_available	= kx022a_get_fifo_bytes_available,  }; -EXPORT_SYMBOL_NS_GPL(kx132acr_chip_info, IIO_KX022A); +EXPORT_SYMBOL_NS_GPL(kx132acr_chip_info, "IIO_KX022A");  int kx022a_probe_internal(struct device *dev, const struct kx022a_chip_info *chip_info)  { @@ -1372,7 +1372,7 @@ int kx022a_probe_internal(struct device *dev, const struct kx022a_chip_info *chi  	return ret;  } -EXPORT_SYMBOL_NS_GPL(kx022a_probe_internal, IIO_KX022A); +EXPORT_SYMBOL_NS_GPL(kx022a_probe_internal, "IIO_KX022A");  MODULE_DESCRIPTION("ROHM/Kionix KX022A accelerometer driver");  MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); diff --git a/drivers/iio/accel/kxsd9-i2c.c b/drivers/iio/accel/kxsd9-i2c.c index c4c7e2d4e98a..3857d2edf250 100644 --- a/drivers/iio/accel/kxsd9-i2c.c +++ b/drivers/iio/accel/kxsd9-i2c.c @@ -62,4 +62,4 @@ module_i2c_driver(kxsd9_i2c_driver);  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("KXSD9 accelerometer I2C interface"); -MODULE_IMPORT_NS(IIO_KXSD9); +MODULE_IMPORT_NS("IIO_KXSD9"); diff --git a/drivers/iio/accel/kxsd9-spi.c b/drivers/iio/accel/kxsd9-spi.c index 4414670dfb43..a05f4467d94a 100644 --- a/drivers/iio/accel/kxsd9-spi.c +++ b/drivers/iio/accel/kxsd9-spi.c @@ -63,4 +63,4 @@ module_spi_driver(kxsd9_spi_driver);  MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");  MODULE_DESCRIPTION("Kionix KXSD9 SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_KXSD9); +MODULE_IMPORT_NS("IIO_KXSD9"); diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c index 6d2b0a22e550..0ededf8cfdca 100644 --- a/drivers/iio/accel/kxsd9.c +++ b/drivers/iio/accel/kxsd9.c @@ -474,7 +474,7 @@ err_power_down:  	return ret;  } -EXPORT_SYMBOL_NS(kxsd9_common_probe, IIO_KXSD9); +EXPORT_SYMBOL_NS(kxsd9_common_probe, "IIO_KXSD9");  void kxsd9_common_remove(struct device *dev)  { @@ -488,7 +488,7 @@ void kxsd9_common_remove(struct device *dev)  	pm_runtime_disable(dev);  	kxsd9_power_down(st);  } -EXPORT_SYMBOL_NS(kxsd9_common_remove, IIO_KXSD9); +EXPORT_SYMBOL_NS(kxsd9_common_remove, "IIO_KXSD9");  static int kxsd9_runtime_suspend(struct device *dev)  { diff --git a/drivers/iio/accel/mma7455_core.c b/drivers/iio/accel/mma7455_core.c index 50f7ac1845c6..30746621052c 100644 --- a/drivers/iio/accel/mma7455_core.c +++ b/drivers/iio/accel/mma7455_core.c @@ -239,7 +239,7 @@ const struct regmap_config mma7455_core_regmap = {  	.val_bits = 8,  	.max_register = MMA7455_REG_TW,  }; -EXPORT_SYMBOL_NS_GPL(mma7455_core_regmap, IIO_MMA7455); +EXPORT_SYMBOL_NS_GPL(mma7455_core_regmap, "IIO_MMA7455");  int mma7455_core_probe(struct device *dev, struct regmap *regmap,  		       const char *name) @@ -294,7 +294,7 @@ int mma7455_core_probe(struct device *dev, struct regmap *regmap,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(mma7455_core_probe, IIO_MMA7455); +EXPORT_SYMBOL_NS_GPL(mma7455_core_probe, "IIO_MMA7455");  void mma7455_core_remove(struct device *dev)  { @@ -307,7 +307,7 @@ void mma7455_core_remove(struct device *dev)  	regmap_write(mma7455->regmap, MMA7455_REG_MCTL,  		     MMA7455_MCTL_MODE_STANDBY);  } -EXPORT_SYMBOL_NS_GPL(mma7455_core_remove, IIO_MMA7455); +EXPORT_SYMBOL_NS_GPL(mma7455_core_remove, "IIO_MMA7455");  MODULE_AUTHOR("Joachim Eastwood <manabian@gmail.com>");  MODULE_DESCRIPTION("Freescale MMA7455L core accelerometer driver"); diff --git a/drivers/iio/accel/mma7455_i2c.c b/drivers/iio/accel/mma7455_i2c.c index 36a357c8e9ed..2ff8eb1f9ce9 100644 --- a/drivers/iio/accel/mma7455_i2c.c +++ b/drivers/iio/accel/mma7455_i2c.c @@ -59,4 +59,4 @@ module_i2c_driver(mma7455_i2c_driver);  MODULE_AUTHOR("Joachim Eastwood <manabian@gmail.com>");  MODULE_DESCRIPTION("Freescale MMA7455L I2C accelerometer driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MMA7455); +MODULE_IMPORT_NS("IIO_MMA7455"); diff --git a/drivers/iio/accel/mma7455_spi.c b/drivers/iio/accel/mma7455_spi.c index fcdde2e8a84b..aca02e83f789 100644 --- a/drivers/iio/accel/mma7455_spi.c +++ b/drivers/iio/accel/mma7455_spi.c @@ -47,4 +47,4 @@ module_spi_driver(mma7455_spi_driver);  MODULE_AUTHOR("Joachim Eastwood <manabian@gmail.com>");  MODULE_DESCRIPTION("Freescale MMA7455L SPI accelerometer driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MMA7455); +MODULE_IMPORT_NS("IIO_MMA7455"); diff --git a/drivers/iio/accel/mma9551.c b/drivers/iio/accel/mma9551.c index 6d73eec95126..1b96687da01a 100644 --- a/drivers/iio/accel/mma9551.c +++ b/drivers/iio/accel/mma9551.c @@ -607,4 +607,4 @@ MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");  MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("MMA9551L motion-sensing platform driver"); -MODULE_IMPORT_NS(IIO_MMA9551); +MODULE_IMPORT_NS("IIO_MMA9551"); diff --git a/drivers/iio/accel/mma9551_core.c b/drivers/iio/accel/mma9551_core.c index b898f865fb87..3e7d9b79ed0e 100644 --- a/drivers/iio/accel/mma9551_core.c +++ b/drivers/iio/accel/mma9551_core.c @@ -219,7 +219,7 @@ int mma9551_read_config_byte(struct i2c_client *client, u8 app_id,  	return mma9551_transfer(client, app_id, MMA9551_CMD_READ_CONFIG,  				reg, NULL, 0, val, 1);  } -EXPORT_SYMBOL_NS(mma9551_read_config_byte, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_config_byte, "IIO_MMA9551");  /**   * mma9551_write_config_byte() - write 1 configuration byte @@ -244,7 +244,7 @@ int mma9551_write_config_byte(struct i2c_client *client, u8 app_id,  	return mma9551_transfer(client, app_id, MMA9551_CMD_WRITE_CONFIG, reg,  				&val, 1, NULL, 0);  } -EXPORT_SYMBOL_NS(mma9551_write_config_byte, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_write_config_byte, "IIO_MMA9551");  /**   * mma9551_read_status_byte() - read 1 status byte @@ -269,7 +269,7 @@ int mma9551_read_status_byte(struct i2c_client *client, u8 app_id,  	return mma9551_transfer(client, app_id, MMA9551_CMD_READ_STATUS,  				reg, NULL, 0, val, 1);  } -EXPORT_SYMBOL_NS(mma9551_read_status_byte, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_status_byte, "IIO_MMA9551");  /**   * mma9551_read_config_word() - read 1 config word @@ -303,7 +303,7 @@ int mma9551_read_config_word(struct i2c_client *client, u8 app_id,  	return 0;  } -EXPORT_SYMBOL_NS(mma9551_read_config_word, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_config_word, "IIO_MMA9551");  /**   * mma9551_write_config_word() - write 1 config word @@ -330,7 +330,7 @@ int mma9551_write_config_word(struct i2c_client *client, u8 app_id,  	return mma9551_transfer(client, app_id, MMA9551_CMD_WRITE_CONFIG, reg,  				(u8 *)&v, 2, NULL, 0);  } -EXPORT_SYMBOL_NS(mma9551_write_config_word, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_write_config_word, "IIO_MMA9551");  /**   * mma9551_read_status_word() - read 1 status word @@ -364,7 +364,7 @@ int mma9551_read_status_word(struct i2c_client *client, u8 app_id,  	return 0;  } -EXPORT_SYMBOL_NS(mma9551_read_status_word, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_status_word, "IIO_MMA9551");  /**   * mma9551_read_config_words() - read multiple config words @@ -403,7 +403,7 @@ int mma9551_read_config_words(struct i2c_client *client, u8 app_id,  	return 0;  } -EXPORT_SYMBOL_NS(mma9551_read_config_words, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_config_words, "IIO_MMA9551");  /**   * mma9551_read_status_words() - read multiple status words @@ -442,7 +442,7 @@ int mma9551_read_status_words(struct i2c_client *client, u8 app_id,  	return 0;  } -EXPORT_SYMBOL_NS(mma9551_read_status_words, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_status_words, "IIO_MMA9551");  /**   * mma9551_write_config_words() - write multiple config words @@ -477,7 +477,7 @@ int mma9551_write_config_words(struct i2c_client *client, u8 app_id,  	return mma9551_transfer(client, app_id, MMA9551_CMD_WRITE_CONFIG,  				reg, (u8 *)be_buf, len * sizeof(u16), NULL, 0);  } -EXPORT_SYMBOL_NS(mma9551_write_config_words, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_write_config_words, "IIO_MMA9551");  /**   * mma9551_update_config_bits() - update bits in register @@ -513,7 +513,7 @@ int mma9551_update_config_bits(struct i2c_client *client, u8 app_id,  	return mma9551_write_config_byte(client, app_id, reg, tmp);  } -EXPORT_SYMBOL_NS(mma9551_update_config_bits, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_update_config_bits, "IIO_MMA9551");  /**   * mma9551_gpio_config() - configure gpio @@ -592,7 +592,7 @@ int mma9551_gpio_config(struct i2c_client *client, enum mma9551_gpio_pin pin,  	return ret;  } -EXPORT_SYMBOL_NS(mma9551_gpio_config, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_gpio_config, "IIO_MMA9551");  /**   * mma9551_read_version() - read device version information @@ -622,7 +622,7 @@ int mma9551_read_version(struct i2c_client *client)  	return 0;  } -EXPORT_SYMBOL_NS(mma9551_read_version, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_version, "IIO_MMA9551");  /**   * mma9551_set_device_state() - sets HW power mode @@ -652,7 +652,7 @@ int mma9551_set_device_state(struct i2c_client *client, bool enable)  					  MMA9551_SLEEP_CFG_FLEEN :  					  MMA9551_SLEEP_CFG_SNCEN);  } -EXPORT_SYMBOL_NS(mma9551_set_device_state, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_set_device_state, "IIO_MMA9551");  /**   * mma9551_set_power_state() - sets runtime PM state @@ -686,7 +686,7 @@ int mma9551_set_power_state(struct i2c_client *client, bool on)  	return 0;  } -EXPORT_SYMBOL_NS(mma9551_set_power_state, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_set_power_state, "IIO_MMA9551");  /**   * mma9551_sleep() - sleep @@ -705,7 +705,7 @@ void mma9551_sleep(int freq)  	else  		msleep_interruptible(sleep_val);  } -EXPORT_SYMBOL_NS(mma9551_sleep, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_sleep, "IIO_MMA9551");  /**   * mma9551_read_accel_chan() - read accelerometer channel @@ -761,7 +761,7 @@ out_poweroff:  	mma9551_set_power_state(client, false);  	return ret;  } -EXPORT_SYMBOL_NS(mma9551_read_accel_chan, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_accel_chan, "IIO_MMA9551");  /**   * mma9551_read_accel_scale() - read accelerometer scale @@ -779,7 +779,7 @@ int mma9551_read_accel_scale(int *val, int *val2)  	return IIO_VAL_INT_PLUS_MICRO;  } -EXPORT_SYMBOL_NS(mma9551_read_accel_scale, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_read_accel_scale, "IIO_MMA9551");  /**   * mma9551_app_reset() - reset application @@ -798,7 +798,7 @@ int mma9551_app_reset(struct i2c_client *client, u32 app_mask)  					 MMA9551_RSC_OFFSET(app_mask),  					 MMA9551_RSC_VAL(app_mask));  } -EXPORT_SYMBOL_NS(mma9551_app_reset, IIO_MMA9551); +EXPORT_SYMBOL_NS(mma9551_app_reset, "IIO_MMA9551");  MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");  MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>"); diff --git a/drivers/iio/accel/mma9553.c b/drivers/iio/accel/mma9553.c index 8536743a6886..00e224efc8ed 100644 --- a/drivers/iio/accel/mma9553.c +++ b/drivers/iio/accel/mma9553.c @@ -1244,4 +1244,4 @@ module_i2c_driver(mma9553_driver);  MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("MMA9553L pedometer platform driver"); -MODULE_IMPORT_NS(IIO_MMA9551); +MODULE_IMPORT_NS("IIO_MMA9551"); diff --git a/drivers/iio/accel/ssp_accel_sensor.c b/drivers/iio/accel/ssp_accel_sensor.c index 7ca9d0d543e0..3e572af2ec03 100644 --- a/drivers/iio/accel/ssp_accel_sensor.c +++ b/drivers/iio/accel/ssp_accel_sensor.c @@ -141,4 +141,4 @@ module_platform_driver(ssp_accel_driver);  MODULE_AUTHOR("Karol Wrona <k.wrona@samsung.com>");  MODULE_DESCRIPTION("Samsung sensorhub accelerometers driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_SSP_SENSORS); +MODULE_IMPORT_NS("IIO_SSP_SENSORS"); diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c index 0e371efbda70..99cb661fabb2 100644 --- a/drivers/iio/accel/st_accel_core.c +++ b/drivers/iio/accel/st_accel_core.c @@ -1490,7 +1490,7 @@ const struct st_sensor_settings *st_accel_get_settings(const char *name)  	return &st_accel_sensors_settings[index];  } -EXPORT_SYMBOL_NS(st_accel_get_settings, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_accel_get_settings, "IIO_ST_SENSORS");  int st_accel_common_probe(struct iio_dev *indio_dev)  { @@ -1544,9 +1544,9 @@ int st_accel_common_probe(struct iio_dev *indio_dev)  	return devm_iio_device_register(parent, indio_dev);  } -EXPORT_SYMBOL_NS(st_accel_common_probe, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_accel_common_probe, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/accel/st_accel_i2c.c b/drivers/iio/accel/st_accel_i2c.c index 329a4d6fb2ec..ab4fdba75a0a 100644 --- a/drivers/iio/accel/st_accel_i2c.c +++ b/drivers/iio/accel/st_accel_i2c.c @@ -216,4 +216,4 @@ module_i2c_driver(st_accel_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics accelerometers i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/accel/st_accel_spi.c b/drivers/iio/accel/st_accel_spi.c index 825adab37105..6146754fe47f 100644 --- a/drivers/iio/accel/st_accel_spi.c +++ b/drivers/iio/accel/st_accel_spi.c @@ -184,4 +184,4 @@ module_spi_driver(st_accel_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics accelerometers spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/adc/ad4695.c b/drivers/iio/adc/ad4695.c index 595ec4158e73..0146aed9069f 100644 --- a/drivers/iio/adc/ad4695.c +++ b/drivers/iio/adc/ad4695.c @@ -91,6 +91,7 @@  #define AD4695_T_WAKEUP_SW_MS		3  #define AD4695_T_REFBUF_MS		100  #define AD4695_T_REGCONFIG_NS		20 +#define AD4695_T_SCK_CNV_DELAY_NS	80  #define AD4695_REG_ACCESS_SCLK_HZ	(10 * MEGA)  /* Max number of voltage input channels. */ @@ -132,8 +133,13 @@ struct ad4695_state {  	unsigned int vref_mv;  	/* Common mode input pin voltage. */  	unsigned int com_mv; -	/* 1 per voltage and temperature chan plus 1 xfer to trigger 1st CNV */ -	struct spi_transfer buf_read_xfer[AD4695_MAX_CHANNELS + 2]; +	/* +	 * 2 per voltage and temperature chan plus 1 xfer to trigger 1st +	 * CNV. Excluding the trigger xfer, every 2nd xfer only serves +	 * to control CS and add a delay between the last SCLK and next +	 * CNV rising edges. +	 */ +	struct spi_transfer buf_read_xfer[AD4695_MAX_CHANNELS * 2 + 3];  	struct spi_message buf_read_msg;  	/* Raw conversion data received. */  	u8 buf[ALIGN((AD4695_MAX_CHANNELS + 2) * AD4695_MAX_CHANNEL_SIZE, @@ -423,7 +429,7 @@ static int ad4695_buffer_preenable(struct iio_dev *indio_dev)  	u8 temp_chan_bit = st->chip_info->num_voltage_inputs;  	u32 bit, num_xfer, num_slots;  	u32 temp_en = 0; -	int ret; +	int ret, rx_buf_offset = 0;  	/*  	 * We are using the advanced sequencer since it is the only way to read @@ -449,11 +455,9 @@ static int ad4695_buffer_preenable(struct iio_dev *indio_dev)  	iio_for_each_active_channel(indio_dev, bit) {  		xfer = &st->buf_read_xfer[num_xfer];  		xfer->bits_per_word = 16; -		xfer->rx_buf = &st->buf[(num_xfer - 1) * 2]; +		xfer->rx_buf = &st->buf[rx_buf_offset];  		xfer->len = 2; -		xfer->cs_change = 1; -		xfer->cs_change_delay.value = AD4695_T_CONVERT_NS; -		xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; +		rx_buf_offset += xfer->len;  		if (bit == temp_chan_bit) {  			temp_en = 1; @@ -468,21 +472,44 @@ static int ad4695_buffer_preenable(struct iio_dev *indio_dev)  		}  		num_xfer++; + +		/* +		 * We need to add a blank xfer in data reads, to meet the timing +		 * requirement of a minimum delay between the last SCLK rising +		 * edge and the CS deassert. +		 */ +		xfer = &st->buf_read_xfer[num_xfer]; +		xfer->delay.value = AD4695_T_SCK_CNV_DELAY_NS; +		xfer->delay.unit = SPI_DELAY_UNIT_NSECS; +		xfer->cs_change = 1; +		xfer->cs_change_delay.value = AD4695_T_CONVERT_NS; +		xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; + +		num_xfer++;  	}  	/*  	 * The advanced sequencer requires that at least 2 slots are enabled.  	 * Since slot 0 is always used for other purposes, we need only 1 -	 * enabled voltage channel to meet this requirement. If the temperature -	 * channel is the only enabled channel, we need to add one more slot -	 * in the sequence but not read from it. +	 * enabled voltage channel to meet this requirement.  If the temperature +	 * channel is the only enabled channel, we need to add one more slot in +	 * the sequence but not read from it. This is because the temperature +	 * sensor is sampled at the end of the channel sequence in advanced +	 * sequencer mode (see datasheet page 38). +	 * +	 * From the iio_for_each_active_channel() block above, we now have an +	 * xfer with data followed by a blank xfer to allow us to meet the +	 * timing spec, so move both of those up before adding an extra to +	 * handle the temperature-only case.  	 */  	if (num_slots < 2) { -		/* move last xfer so we can insert one more xfer before it */ -		st->buf_read_xfer[num_xfer] = *xfer; +		/* Move last two xfers */ +		st->buf_read_xfer[num_xfer] = st->buf_read_xfer[num_xfer - 1]; +		st->buf_read_xfer[num_xfer - 1] = st->buf_read_xfer[num_xfer - 2];  		num_xfer++; -		/* modify 2nd to last xfer for extra slot */ +		/* Modify inserted xfer for extra slot. */ +		xfer = &st->buf_read_xfer[num_xfer - 3];  		memset(xfer, 0, sizeof(*xfer));  		xfer->cs_change = 1;  		xfer->delay.value = st->chip_info->t_acq_ns; @@ -499,6 +526,12 @@ static int ad4695_buffer_preenable(struct iio_dev *indio_dev)  			return ret;  		num_slots++; + +		/* +		 * We still want to point at the last xfer when finished, so +		 * update the pointer. +		 */ +		xfer = &st->buf_read_xfer[num_xfer - 1];  	}  	/* @@ -583,8 +616,20 @@ out:   */  static int ad4695_read_one_sample(struct ad4695_state *st, unsigned int address)  { -	struct spi_transfer xfer[2] = { }; -	int ret, i = 0; +	struct spi_transfer xfers[2] = { +		{ +			.speed_hz = AD4695_REG_ACCESS_SCLK_HZ, +			.bits_per_word = 16, +			.tx_buf = &st->cnv_cmd, +			.len = 2, +		}, +		{ +			/* Required delay between last SCLK and CNV/CS */ +			.delay.value = AD4695_T_SCK_CNV_DELAY_NS, +			.delay.unit = SPI_DELAY_UNIT_NSECS, +		} +	}; +	int ret;  	ret = ad4695_set_single_cycle_mode(st, address);  	if (ret) @@ -592,29 +637,22 @@ static int ad4695_read_one_sample(struct ad4695_state *st, unsigned int address)  	/*  	 * Setting the first channel to the temperature channel isn't supported -	 * in single-cycle mode, so we have to do an extra xfer to read the -	 * temperature. +	 * in single-cycle mode, so we have to do an extra conversion to read +	 * the temperature.  	 */  	if (address == AD4695_CMD_TEMP_CHAN) { -		/* We aren't reading, so we can make this a short xfer. */ -		st->cnv_cmd2 = AD4695_CMD_TEMP_CHAN << 3; -		xfer[0].tx_buf = &st->cnv_cmd2; -		xfer[0].len = 1; -		xfer[0].cs_change = 1; -		xfer[0].cs_change_delay.value = AD4695_T_CONVERT_NS; -		xfer[0].cs_change_delay.unit = SPI_DELAY_UNIT_NSECS; - -		i = 1; +		st->cnv_cmd = AD4695_CMD_TEMP_CHAN << 11; + +		ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); +		if (ret) +			return ret;  	}  	/* Then read the result and exit conversion mode. */  	st->cnv_cmd = AD4695_CMD_EXIT_CNV_MODE << 11; -	xfer[i].bits_per_word = 16; -	xfer[i].tx_buf = &st->cnv_cmd; -	xfer[i].rx_buf = &st->raw_data; -	xfer[i].len = 2; +	xfers[0].rx_buf = &st->raw_data; -	return spi_sync_transfer(st->spi, xfer, i + 1); +	return spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));  }  static int ad4695_read_raw(struct iio_dev *indio_dev, diff --git a/drivers/iio/adc/ad7091r-base.c b/drivers/iio/adc/ad7091r-base.c index eb0a059b4b0e..606486c4dfe8 100644 --- a/drivers/iio/adc/ad7091r-base.c +++ b/drivers/iio/adc/ad7091r-base.c @@ -35,7 +35,7 @@ const struct iio_event_spec ad7091r_events[] = {  		.mask_separate = BIT(IIO_EV_INFO_HYSTERESIS),  	},  }; -EXPORT_SYMBOL_NS_GPL(ad7091r_events, IIO_AD7091R); +EXPORT_SYMBOL_NS_GPL(ad7091r_events, "IIO_AD7091R");  static int ad7091r_set_channel(struct ad7091r_state *st, unsigned int channel)  { @@ -370,7 +370,7 @@ int ad7091r_probe(struct device *dev, const struct ad7091r_init_info *init_info,  	return devm_iio_device_register(dev, iio_dev);  } -EXPORT_SYMBOL_NS_GPL(ad7091r_probe, IIO_AD7091R); +EXPORT_SYMBOL_NS_GPL(ad7091r_probe, "IIO_AD7091R");  bool ad7091r_writeable_reg(struct device *dev, unsigned int reg)  { @@ -382,7 +382,7 @@ bool ad7091r_writeable_reg(struct device *dev, unsigned int reg)  		return true;  	}  } -EXPORT_SYMBOL_NS_GPL(ad7091r_writeable_reg, IIO_AD7091R); +EXPORT_SYMBOL_NS_GPL(ad7091r_writeable_reg, "IIO_AD7091R");  bool ad7091r_volatile_reg(struct device *dev, unsigned int reg)  { @@ -394,7 +394,7 @@ bool ad7091r_volatile_reg(struct device *dev, unsigned int reg)  		return false;  	}  } -EXPORT_SYMBOL_NS_GPL(ad7091r_volatile_reg, IIO_AD7091R); +EXPORT_SYMBOL_NS_GPL(ad7091r_volatile_reg, "IIO_AD7091R");  MODULE_AUTHOR("Beniamin Bia <beniamin.bia@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7091Rx multi-channel converters"); diff --git a/drivers/iio/adc/ad7091r5.c b/drivers/iio/adc/ad7091r5.c index 1b59708abf30..b472b9498fd1 100644 --- a/drivers/iio/adc/ad7091r5.c +++ b/drivers/iio/adc/ad7091r5.c @@ -135,4 +135,4 @@ module_i2c_driver(ad7091r5_driver);  MODULE_AUTHOR("Beniamin Bia <beniamin.bia@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7091R5 multi-channel ADC driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD7091R); +MODULE_IMPORT_NS("IIO_AD7091R"); diff --git a/drivers/iio/adc/ad7091r8.c b/drivers/iio/adc/ad7091r8.c index c9e014d6a77c..cebade4c2d49 100644 --- a/drivers/iio/adc/ad7091r8.c +++ b/drivers/iio/adc/ad7091r8.c @@ -269,4 +269,4 @@ module_spi_driver(ad7091r8_driver);  MODULE_AUTHOR("Marcelo Schmitt <marcelo.schmitt@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7091R8 ADC driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_AD7091R); +MODULE_IMPORT_NS("IIO_AD7091R"); diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c index b79c48d46ccc..3d678c420cbf 100644 --- a/drivers/iio/adc/ad7124.c +++ b/drivers/iio/adc/ad7124.c @@ -917,6 +917,9 @@ static int ad7124_setup(struct ad7124_state *st)  		 * set all channels to this default value.  		 */  		ad7124_set_channel_odr(st, i, 10); + +		/* Disable all channels to prevent unintended conversions. */ +		ad_sd_write_reg(&st->sd, AD7124_CHANNEL(i), 2, 0);  	}  	ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control); @@ -1036,4 +1039,4 @@ module_spi_driver(ad71124_driver);  MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7124 SPI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA"); diff --git a/drivers/iio/adc/ad7173.c b/drivers/iio/adc/ad7173.c index a0fca16c3be0..8b03c1e5567e 100644 --- a/drivers/iio/adc/ad7173.c +++ b/drivers/iio/adc/ad7173.c @@ -200,6 +200,7 @@ struct ad7173_channel {  struct ad7173_state {  	struct ad_sigma_delta sd; +	struct ad_sigma_delta_info sigma_delta_info;  	const struct ad7173_device_info *info;  	struct ad7173_channel *channels;  	struct regulator_bulk_data regulators[3]; @@ -753,7 +754,7 @@ static int ad7173_disable_one(struct ad_sigma_delta *sd, unsigned int chan)  	return ad_sd_write_reg(sd, AD7173_REG_CH(chan), 2, 0);  } -static struct ad_sigma_delta_info ad7173_sigma_delta_info = { +static const struct ad_sigma_delta_info ad7173_sigma_delta_info = {  	.set_channel = ad7173_set_channel,  	.append_status = ad7173_append_status,  	.disable_all = ad7173_disable_all, @@ -1403,7 +1404,7 @@ static int ad7173_fw_parse_device_config(struct iio_dev *indio_dev)  	if (ret < 0)  		return dev_err_probe(dev, ret, "Interrupt 'rdy' is required\n"); -	ad7173_sigma_delta_info.irq_line = ret; +	st->sigma_delta_info.irq_line = ret;  	return ad7173_fw_parse_channel_config(indio_dev);  } @@ -1436,8 +1437,9 @@ static int ad7173_probe(struct spi_device *spi)  	spi->mode = SPI_MODE_3;  	spi_setup(spi); -	ad7173_sigma_delta_info.num_slots = st->info->num_configs; -	ret = ad_sd_init(&st->sd, indio_dev, spi, &ad7173_sigma_delta_info); +	st->sigma_delta_info = ad7173_sigma_delta_info; +	st->sigma_delta_info.num_slots = st->info->num_configs; +	ret = ad_sd_init(&st->sd, indio_dev, spi, &st->sigma_delta_info);  	if (ret)  		return ret; @@ -1509,7 +1511,7 @@ static struct spi_driver ad7173_driver = {  };  module_spi_driver(ad7173_driver); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA");  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafo.de>");  MODULE_AUTHOR("Dumitru Ceclan <dumitru.ceclan@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7173 and similar ADC driver"); diff --git a/drivers/iio/adc/ad7192.c b/drivers/iio/adc/ad7192.c index 955e9eff0099..1c87db0e0460 100644 --- a/drivers/iio/adc/ad7192.c +++ b/drivers/iio/adc/ad7192.c @@ -1461,4 +1461,4 @@ module_spi_driver(ad7192_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7192 and similar ADC");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA"); diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c index 8b2046baaa3e..e35d55d03d86 100644 --- a/drivers/iio/adc/ad7606.c +++ b/drivers/iio/adc/ad7606.c @@ -195,7 +195,7 @@ const struct ad7606_chip_info ad7605_4_info = {  	.num_channels = 5,  	.scale_setup_cb = ad7606_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7605_4_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7605_4_info, "IIO_AD7606");  const struct ad7606_chip_info ad7606_8_info = {  	.channels = ad7606_channels_16bit, @@ -206,7 +206,7 @@ const struct ad7606_chip_info ad7606_8_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7606_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7606_8_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606_8_info, "IIO_AD7606");  const struct ad7606_chip_info ad7606_6_info = {  	.channels = ad7606_channels_16bit, @@ -217,7 +217,7 @@ const struct ad7606_chip_info ad7606_6_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7606_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7606_6_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606_6_info, "IIO_AD7606");  const struct ad7606_chip_info ad7606_4_info = {  	.channels = ad7606_channels_16bit, @@ -228,7 +228,7 @@ const struct ad7606_chip_info ad7606_4_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7606_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7606_4_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606_4_info, "IIO_AD7606");  const struct ad7606_chip_info ad7606b_info = {  	.channels = ad7606_channels_16bit, @@ -240,7 +240,7 @@ const struct ad7606_chip_info ad7606b_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7606_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7606b_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606b_info, "IIO_AD7606");  const struct ad7606_chip_info ad7606c_16_info = {  	.channels = ad7606_channels_16bit, @@ -251,7 +251,7 @@ const struct ad7606_chip_info ad7606c_16_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7606c_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7606c_16_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606c_16_info, "IIO_AD7606");  const struct ad7606_chip_info ad7607_info = {  	.channels = ad7607_channels, @@ -262,7 +262,7 @@ const struct ad7606_chip_info ad7607_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7607_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7607_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7607_info, "IIO_AD7606");  const struct ad7606_chip_info ad7608_info = {  	.channels = ad7608_channels, @@ -273,7 +273,7 @@ const struct ad7606_chip_info ad7608_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7608_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7608_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7608_info, "IIO_AD7606");  const struct ad7606_chip_info ad7609_info = {  	.channels = ad7608_channels, @@ -284,7 +284,7 @@ const struct ad7606_chip_info ad7609_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7609_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7609_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7609_info, "IIO_AD7606");  const struct ad7606_chip_info ad7606c_18_info = {  	.channels = ad7606_channels_18bit, @@ -295,7 +295,7 @@ const struct ad7606_chip_info ad7606c_18_info = {  	.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),  	.scale_setup_cb = ad7606c_18bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7606c_18_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606c_18_info, "IIO_AD7606");  const struct ad7606_chip_info ad7616_info = {  	.channels = ad7616_channels, @@ -308,7 +308,7 @@ const struct ad7606_chip_info ad7616_info = {  	.os_req_reset = true,  	.scale_setup_cb = ad7606_16bit_chan_scale_setup,  }; -EXPORT_SYMBOL_NS_GPL(ad7616_info, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7616_info, "IIO_AD7606");  int ad7606_reset(struct ad7606_state *st)  { @@ -321,7 +321,7 @@ int ad7606_reset(struct ad7606_state *st)  	return -ENODEV;  } -EXPORT_SYMBOL_NS_GPL(ad7606_reset, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606_reset, "IIO_AD7606");  static int ad7606_16bit_chan_scale_setup(struct ad7606_state *st,  					 struct iio_chan_spec *chan, int ch) @@ -1328,7 +1328,7 @@ int ad7606_probe(struct device *dev, int irq, void __iomem *base_address,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(ad7606_probe, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606_probe, "IIO_AD7606");  #ifdef CONFIG_PM_SLEEP @@ -1360,7 +1360,7 @@ static int ad7606_resume(struct device *dev)  }  SIMPLE_DEV_PM_OPS(ad7606_pm_ops, ad7606_suspend, ad7606_resume); -EXPORT_SYMBOL_NS_GPL(ad7606_pm_ops, IIO_AD7606); +EXPORT_SYMBOL_NS_GPL(ad7606_pm_ops, "IIO_AD7606");  #endif diff --git a/drivers/iio/adc/ad7606_par.c b/drivers/iio/adc/ad7606_par.c index a25182a3daa7..64733b607aa8 100644 --- a/drivers/iio/adc/ad7606_par.c +++ b/drivers/iio/adc/ad7606_par.c @@ -245,5 +245,5 @@ module_platform_driver(ad7606_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7606 ADC");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD7606); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_AD7606"); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/adc/ad7606_spi.c b/drivers/iio/adc/ad7606_spi.c index 0662300cde8d..e2c147525706 100644 --- a/drivers/iio/adc/ad7606_spi.c +++ b/drivers/iio/adc/ad7606_spi.c @@ -482,4 +482,4 @@ module_spi_driver(ad7606_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7606 ADC");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD7606); +MODULE_IMPORT_NS("IIO_AD7606"); diff --git a/drivers/iio/adc/ad7625.c b/drivers/iio/adc/ad7625.c index ddd1e4a26429..aefe3bf75c91 100644 --- a/drivers/iio/adc/ad7625.c +++ b/drivers/iio/adc/ad7625.c @@ -681,4 +681,4 @@ module_platform_driver(ad7625_driver);  MODULE_AUTHOR("Trevor Gamblin <tgamblin@baylibre.com>");  MODULE_DESCRIPTION("Analog Devices AD7625 ADC");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/adc/ad7780.c b/drivers/iio/adc/ad7780.c index 8ccb74f47030..24d2dcad8f4d 100644 --- a/drivers/iio/adc/ad7780.c +++ b/drivers/iio/adc/ad7780.c @@ -375,4 +375,4 @@ module_spi_driver(ad7780_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7780 and similar ADCs");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA"); diff --git a/drivers/iio/adc/ad7791.c b/drivers/iio/adc/ad7791.c index 5d2ad3dd6caa..e1bf13fe2cd7 100644 --- a/drivers/iio/adc/ad7791.c +++ b/drivers/iio/adc/ad7791.c @@ -474,4 +474,4 @@ module_spi_driver(ad7791_driver);  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("Analog Devices AD7787/AD7788/AD7789/AD7790/AD7791 ADC driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA"); diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c index b86e89370e0d..d55c71566707 100644 --- a/drivers/iio/adc/ad7793.c +++ b/drivers/iio/adc/ad7793.c @@ -849,4 +849,4 @@ module_spi_driver(ad7793_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD7793 and similar ADCs");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA"); diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c index 05fb7a75531f..f30119b42ba0 100644 --- a/drivers/iio/adc/ad9467.c +++ b/drivers/iio/adc/ad9467.c @@ -895,7 +895,7 @@ static int ad9467_update_scan_mode(struct iio_dev *indio_dev,  	return 0;  } -static struct iio_info ad9467_info = { +static const struct iio_info ad9467_info = {  	.read_raw = ad9467_read_raw,  	.write_raw = ad9467_write_raw,  	.update_scan_mode = ad9467_update_scan_mode, @@ -903,6 +903,14 @@ static struct iio_info ad9467_info = {  	.read_avail = ad9467_read_avail,  }; +/* Same as above, but without .read_avail */ +static const struct iio_info ad9467_info_no_read_avail = { +	.read_raw = ad9467_read_raw, +	.write_raw = ad9467_write_raw, +	.update_scan_mode = ad9467_update_scan_mode, +	.debugfs_reg_access = ad9467_reg_access, +}; +  static int ad9467_scale_fill(struct ad9467_state *st)  {  	const struct ad9467_chip_info *info = st->info; @@ -1214,11 +1222,12 @@ static int ad9467_probe(struct spi_device *spi)  	}  	if (st->info->num_scales > 1) -		ad9467_info.read_avail = ad9467_read_avail; +		indio_dev->info = &ad9467_info; +	else +		indio_dev->info = &ad9467_info_no_read_avail;  	indio_dev->name = st->info->name;  	indio_dev->channels = st->info->channels;  	indio_dev->num_channels = st->info->num_channels; -	indio_dev->info = &ad9467_info;  	ret = ad9467_iio_backend_get(st);  	if (ret) @@ -1280,4 +1289,4 @@ module_spi_driver(ad9467_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD9467 ADC driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/adc/ad_sigma_delta.c b/drivers/iio/adc/ad_sigma_delta.c index 2f3b61765055..3fd200b34161 100644 --- a/drivers/iio/adc/ad_sigma_delta.c +++ b/drivers/iio/adc/ad_sigma_delta.c @@ -43,7 +43,7 @@ void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm)  	 * to select the channel */  	sigma_delta->comm = comm & AD_SD_COMM_CHAN_MASK;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_set_comm, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_set_comm, "IIO_AD_SIGMA_DELTA");  /**   * ad_sd_write_reg() - Write a register @@ -95,7 +95,7 @@ int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_write_reg, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_write_reg, "IIO_AD_SIGMA_DELTA");  static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta,  	unsigned int reg, unsigned int size, uint8_t *val) @@ -172,7 +172,7 @@ int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta,  out:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_read_reg, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_read_reg, "IIO_AD_SIGMA_DELTA");  /**   * ad_sd_reset() - Reset the serial interface @@ -200,7 +200,7 @@ int ad_sd_reset(struct ad_sigma_delta *sigma_delta,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_reset, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_reset, "IIO_AD_SIGMA_DELTA");  int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,  	unsigned int mode, unsigned int channel) @@ -239,7 +239,7 @@ out:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate, "IIO_AD_SIGMA_DELTA");  /**   * ad_sd_calibrate_all() - Performs channel calibration @@ -263,7 +263,7 @@ int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate_all, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate_all, "IIO_AD_SIGMA_DELTA");  /**   * ad_sigma_delta_single_conversion() - Performs a single data conversion @@ -339,7 +339,7 @@ out:  	return IIO_VAL_INT;  } -EXPORT_SYMBOL_NS_GPL(ad_sigma_delta_single_conversion, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sigma_delta_single_conversion, "IIO_AD_SIGMA_DELTA");  static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)  { @@ -564,7 +564,7 @@ int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_validate_trigger, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_validate_trigger, "IIO_AD_SIGMA_DELTA");  static int devm_ad_sd_probe_trigger(struct device *dev, struct iio_dev *indio_dev)  { @@ -638,7 +638,7 @@ int devm_ad_sd_setup_buffer_and_trigger(struct device *dev, struct iio_dev *indi  	return devm_ad_sd_probe_trigger(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(devm_ad_sd_setup_buffer_and_trigger, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(devm_ad_sd_setup_buffer_and_trigger, "IIO_AD_SIGMA_DELTA");  /**   * ad_sd_init() - Initializes a ad_sigma_delta struct @@ -683,7 +683,7 @@ int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad_sd_init, IIO_AD_SIGMA_DELTA); +EXPORT_SYMBOL_NS_GPL(ad_sd_init, "IIO_AD_SIGMA_DELTA");  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("Analog Devices Sigma-Delta ADCs"); diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c index 5c8c87eb36d1..c7357601f0f8 100644 --- a/drivers/iio/adc/adi-axi-adc.c +++ b/drivers/iio/adc/adi-axi-adc.c @@ -437,5 +437,5 @@ module_platform_driver(adi_axi_adc_driver);  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices Generic AXI ADC IP core driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER"); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index a3f0a2321666..5927756b749a 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c @@ -979,7 +979,7 @@ static int at91_ts_register(struct iio_dev *idev,  	return ret;  err: -	input_free_device(st->ts_input); +	input_free_device(input);  	return ret;  } diff --git a/drivers/iio/adc/ltc2497-core.c b/drivers/iio/adc/ltc2497-core.c index ad8ddf80310e..2dc5c7044269 100644 --- a/drivers/iio/adc/ltc2497-core.c +++ b/drivers/iio/adc/ltc2497-core.c @@ -226,7 +226,7 @@ err_regulator_disable:  	return ret;  } -EXPORT_SYMBOL_NS(ltc2497core_probe, LTC2497); +EXPORT_SYMBOL_NS(ltc2497core_probe, "LTC2497");  void ltc2497core_remove(struct iio_dev *indio_dev)  { @@ -238,7 +238,7 @@ void ltc2497core_remove(struct iio_dev *indio_dev)  	regulator_disable(ddata->ref);  } -EXPORT_SYMBOL_NS(ltc2497core_remove, LTC2497); +EXPORT_SYMBOL_NS(ltc2497core_remove, "LTC2497");  MODULE_DESCRIPTION("common code for LTC2496/LTC2497 drivers");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/iio/adc/ltc2497.h b/drivers/iio/adc/ltc2497.h index 781519b52475..64e81c95a3dd 100644 --- a/drivers/iio/adc/ltc2497.h +++ b/drivers/iio/adc/ltc2497.h @@ -23,4 +23,4 @@ struct ltc2497core_driverdata {  int ltc2497core_probe(struct device *dev, struct iio_dev *indio_dev);  void ltc2497core_remove(struct iio_dev *indio_dev); -MODULE_IMPORT_NS(LTC2497); +MODULE_IMPORT_NS("LTC2497"); diff --git a/drivers/iio/adc/max11205.c b/drivers/iio/adc/max11205.c index 9d8bc0b154dd..6c803df220b6 100644 --- a/drivers/iio/adc/max11205.c +++ b/drivers/iio/adc/max11205.c @@ -177,4 +177,4 @@ module_spi_driver(max11205_spi_driver);  MODULE_AUTHOR("Ramona Bolboaca <ramona.bolboaca@analog.com>");  MODULE_DESCRIPTION("MAX11205 ADC driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); +MODULE_IMPORT_NS("IIO_AD_SIGMA_DELTA"); diff --git a/drivers/iio/adc/men_z188_adc.c b/drivers/iio/adc/men_z188_adc.c index 198c7e68e0cf..cf8a8c0412ec 100644 --- a/drivers/iio/adc/men_z188_adc.c +++ b/drivers/iio/adc/men_z188_adc.c @@ -172,4 +172,4 @@ MODULE_AUTHOR("Johannes Thumshirn <johannes.thumshirn@men.de>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("IIO ADC driver for MEN 16z188 ADC Core");  MODULE_ALIAS("mcb:16z188"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c index 240cfa391674..dfd47a6e1f4a 100644 --- a/drivers/iio/adc/rockchip_saradc.c +++ b/drivers/iio/adc/rockchip_saradc.c @@ -368,6 +368,8 @@ static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p)  	int ret;  	int i, j = 0; +	memset(&data, 0, sizeof(data)); +  	mutex_lock(&info->lock);  	iio_for_each_active_channel(i_dev, i) { diff --git a/drivers/iio/adc/sd_adc_modulator.c b/drivers/iio/adc/sd_adc_modulator.c index 654b6a38b650..9f7a75168aac 100644 --- a/drivers/iio/adc/sd_adc_modulator.c +++ b/drivers/iio/adc/sd_adc_modulator.c @@ -159,4 +159,4 @@ module_platform_driver(iio_sd_mod_adc);  MODULE_DESCRIPTION("Basic sigma delta modulator");  MODULE_AUTHOR("Arnaud Pouliquen <arnaud.pouliquen@st.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c index c2d4f5339cd4..fe11b0d8eab3 100644 --- a/drivers/iio/adc/stm32-dfsdm-adc.c +++ b/drivers/iio/adc/stm32-dfsdm-adc.c @@ -691,11 +691,14 @@ static int stm32_dfsdm_generic_channel_parse_of(struct stm32_dfsdm *dfsdm,  		return -EINVAL;  	} -	ret = fwnode_property_read_string(node, "label", &ch->datasheet_name); -	if (ret < 0) { -		dev_err(&indio_dev->dev, -			" Error parsing 'label' for idx %d\n", ch->channel); -		return ret; +	if (fwnode_property_present(node, "label")) { +		/* label is optional */ +		ret = fwnode_property_read_string(node, "label", &ch->datasheet_name); +		if (ret < 0) { +			dev_err(&indio_dev->dev, +				" Error parsing 'label' for idx %d\n", ch->channel); +			return ret; +		}  	}  	df_ch =  &dfsdm->ch_list[ch->channel]; @@ -1897,4 +1900,4 @@ module_platform_driver(stm32_dfsdm_adc_driver);  MODULE_DESCRIPTION("STM32 sigma delta ADC");  MODULE_AUTHOR("Arnaud Pouliquen <arnaud.pouliquen@st.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/adc/ti-ads1119.c b/drivers/iio/adc/ti-ads1119.c index e9d9d4d46d38..c268e27eec12 100644 --- a/drivers/iio/adc/ti-ads1119.c +++ b/drivers/iio/adc/ti-ads1119.c @@ -500,12 +500,14 @@ static irqreturn_t ads1119_trigger_handler(int irq, void *private)  	struct iio_dev *indio_dev = pf->indio_dev;  	struct ads1119_state *st = iio_priv(indio_dev);  	struct { -		unsigned int sample; +		s16 sample;  		s64 timestamp __aligned(8);  	} scan;  	unsigned int index;  	int ret; +	memset(&scan, 0, sizeof(scan)); +  	if (!iio_trigger_using_own(indio_dev)) {  		index = find_first_bit(indio_dev->active_scan_mask,  				       iio_get_masklength(indio_dev)); diff --git a/drivers/iio/adc/ti-ads124s08.c b/drivers/iio/adc/ti-ads124s08.c index 425b48d8986f..f452f57f11c9 100644 --- a/drivers/iio/adc/ti-ads124s08.c +++ b/drivers/iio/adc/ti-ads124s08.c @@ -183,9 +183,9 @@ static int ads124s_reset(struct iio_dev *indio_dev)  	struct ads124s_private *priv = iio_priv(indio_dev);  	if (priv->reset_gpio) { -		gpiod_set_value(priv->reset_gpio, 0); +		gpiod_set_value_cansleep(priv->reset_gpio, 0);  		udelay(200); -		gpiod_set_value(priv->reset_gpio, 1); +		gpiod_set_value_cansleep(priv->reset_gpio, 1);  	} else {  		return ads124s_write_cmd(indio_dev, ADS124S08_CMD_RESET);  	} diff --git a/drivers/iio/adc/ti-ads1298.c b/drivers/iio/adc/ti-ads1298.c index 36d43495f603..03f762415fa5 100644 --- a/drivers/iio/adc/ti-ads1298.c +++ b/drivers/iio/adc/ti-ads1298.c @@ -613,6 +613,8 @@ static int ads1298_init(struct iio_dev *indio_dev)  	}  	indio_dev->name = devm_kasprintf(dev, GFP_KERNEL, "ads129%u%s",  					 indio_dev->num_channels, suffix); +	if (!indio_dev->name) +		return -ENOMEM;  	/* Enable internal test signal, double amplitude, double frequency */  	ret = regmap_write(priv->regmap, ADS1298_REG_CONFIG2, diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c index 9b1814f1965a..a31658b760a4 100644 --- a/drivers/iio/adc/ti-ads8688.c +++ b/drivers/iio/adc/ti-ads8688.c @@ -381,7 +381,7 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p)  	struct iio_poll_func *pf = p;  	struct iio_dev *indio_dev = pf->indio_dev;  	/* Ensure naturally aligned timestamp */ -	u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)] __aligned(8); +	u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)] __aligned(8) = { };  	int i, j = 0;  	iio_for_each_active_channel(indio_dev, i) { diff --git a/drivers/iio/addac/stx104.c b/drivers/iio/addac/stx104.c index 6946a65512ca..7bdf2cb94176 100644 --- a/drivers/iio/addac/stx104.c +++ b/drivers/iio/addac/stx104.c @@ -520,4 +520,4 @@ module_isa_driver(stx104_driver, num_stx104);  MODULE_AUTHOR("William Breathitt Gray <vilhelm.gray@gmail.com>");  MODULE_DESCRIPTION("Apex Embedded Systems STX104 IIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(I8254); +MODULE_IMPORT_NS("I8254"); diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c index 56e5913ab82d..b6a46036d5ea 100644 --- a/drivers/iio/afe/iio-rescale.c +++ b/drivers/iio/afe/iio-rescale.c @@ -107,7 +107,7 @@ int rescale_process_scale(struct rescale *rescale, int scale_type,  		return -EOPNOTSUPP;  	}  } -EXPORT_SYMBOL_NS_GPL(rescale_process_scale, IIO_RESCALE); +EXPORT_SYMBOL_NS_GPL(rescale_process_scale, "IIO_RESCALE");  int rescale_process_offset(struct rescale *rescale, int scale_type,  			   int scale, int scale2, int schan_off, @@ -141,7 +141,7 @@ int rescale_process_offset(struct rescale *rescale, int scale_type,  		return -EOPNOTSUPP;  	}  } -EXPORT_SYMBOL_NS_GPL(rescale_process_offset, IIO_RESCALE); +EXPORT_SYMBOL_NS_GPL(rescale_process_offset, "IIO_RESCALE");  static int rescale_read_raw(struct iio_dev *indio_dev,  			    struct iio_chan_spec const *chan, diff --git a/drivers/iio/buffer/industrialio-buffer-dma.c b/drivers/iio/buffer/industrialio-buffer-dma.c index dbde1443d6ed..7ea784304ffb 100644 --- a/drivers/iio/buffer/industrialio-buffer-dma.c +++ b/drivers/iio/buffer/industrialio-buffer-dma.c @@ -248,7 +248,7 @@ void iio_dma_buffer_block_done(struct iio_dma_buffer_block *block)  	iio_dma_buffer_queue_wake(queue);  	dma_fence_end_signalling(cookie);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_block_done, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_block_done, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_block_list_abort() - Indicate that a list block has been @@ -287,7 +287,7 @@ void iio_dma_buffer_block_list_abort(struct iio_dma_buffer_queue *queue,  	iio_dma_buffer_queue_wake(queue);  	dma_fence_end_signalling(cookie);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_block_list_abort, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_block_list_abort, "IIO_DMA_BUFFER");  static bool iio_dma_block_reusable(struct iio_dma_buffer_block *block)  { @@ -420,7 +420,7 @@ out_unlock:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_request_update, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_request_update, "IIO_DMA_BUFFER");  static void iio_dma_buffer_fileio_free(struct iio_dma_buffer_queue *queue)  { @@ -506,7 +506,7 @@ int iio_dma_buffer_enable(struct iio_buffer *buffer,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_enable, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_enable, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_disable() - Disable DMA buffer @@ -530,7 +530,7 @@ int iio_dma_buffer_disable(struct iio_buffer *buffer,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_disable, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_disable, "IIO_DMA_BUFFER");  static void iio_dma_buffer_enqueue(struct iio_dma_buffer_queue *queue,  	struct iio_dma_buffer_block *block) @@ -636,7 +636,7 @@ int iio_dma_buffer_read(struct iio_buffer *buffer, size_t n,  {  	return iio_dma_buffer_io(buffer, n, user_buffer, false);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_read, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_read, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_write() - DMA buffer write callback @@ -653,7 +653,7 @@ int iio_dma_buffer_write(struct iio_buffer *buffer, size_t n,  	return iio_dma_buffer_io(buffer, n,  				 (__force __user char *)user_buffer, true);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_write, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_write, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_usage() - DMA buffer data_available and @@ -696,7 +696,7 @@ size_t iio_dma_buffer_usage(struct iio_buffer *buf)  	return data_available;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_usage, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_usage, "IIO_DMA_BUFFER");  struct iio_dma_buffer_block *  iio_dma_buffer_attach_dmabuf(struct iio_buffer *buffer, @@ -723,7 +723,7 @@ iio_dma_buffer_attach_dmabuf(struct iio_buffer *buffer,  	return block;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_attach_dmabuf, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_attach_dmabuf, "IIO_DMA_BUFFER");  void iio_dma_buffer_detach_dmabuf(struct iio_buffer *buffer,  				  struct iio_dma_buffer_block *block) @@ -731,7 +731,7 @@ void iio_dma_buffer_detach_dmabuf(struct iio_buffer *buffer,  	block->state = IIO_BLOCK_STATE_DEAD;  	iio_buffer_block_put_atomic(block);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_detach_dmabuf, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_detach_dmabuf, "IIO_DMA_BUFFER");  static int iio_dma_can_enqueue_block(struct iio_dma_buffer_block *block)  { @@ -784,7 +784,7 @@ out_end_signalling:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_enqueue_dmabuf, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_enqueue_dmabuf, "IIO_DMA_BUFFER");  void iio_dma_buffer_lock_queue(struct iio_buffer *buffer)  { @@ -792,7 +792,7 @@ void iio_dma_buffer_lock_queue(struct iio_buffer *buffer)  	mutex_lock(&queue->lock);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_lock_queue, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_lock_queue, "IIO_DMA_BUFFER");  void iio_dma_buffer_unlock_queue(struct iio_buffer *buffer)  { @@ -800,7 +800,7 @@ void iio_dma_buffer_unlock_queue(struct iio_buffer *buffer)  	mutex_unlock(&queue->lock);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_unlock_queue, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_unlock_queue, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_set_bytes_per_datum() - DMA buffer set_bytes_per_datum callback @@ -816,7 +816,7 @@ int iio_dma_buffer_set_bytes_per_datum(struct iio_buffer *buffer, size_t bpd)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_set_bytes_per_datum, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_set_bytes_per_datum, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_set_length - DMA buffer set_length callback @@ -836,7 +836,7 @@ int iio_dma_buffer_set_length(struct iio_buffer *buffer, unsigned int length)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_set_length, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_set_length, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_init() - Initialize DMA buffer queue @@ -864,7 +864,7 @@ int iio_dma_buffer_init(struct iio_dma_buffer_queue *queue,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_init, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_init, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_exit() - Cleanup DMA buffer queue @@ -882,7 +882,7 @@ void iio_dma_buffer_exit(struct iio_dma_buffer_queue *queue)  	mutex_unlock(&queue->lock);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_exit, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_exit, "IIO_DMA_BUFFER");  /**   * iio_dma_buffer_release() - Release final buffer resources @@ -896,7 +896,7 @@ void iio_dma_buffer_release(struct iio_dma_buffer_queue *queue)  {  	mutex_destroy(&queue->lock);  } -EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_release, IIO_DMA_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dma_buffer_release, "IIO_DMA_BUFFER");  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("DMA buffer for the IIO framework"); diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c index 19af1caf14cd..d2e1529ad8fd 100644 --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c @@ -286,7 +286,7 @@ void iio_dmaengine_buffer_free(struct iio_buffer *buffer)  	iio_buffer_put(buffer);  } -EXPORT_SYMBOL_NS_GPL(iio_dmaengine_buffer_free, IIO_DMAENGINE_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dmaengine_buffer_free, "IIO_DMAENGINE_BUFFER");  struct iio_buffer *iio_dmaengine_buffer_setup_ext(struct device *dev,  						  struct iio_dev *indio_dev, @@ -312,7 +312,7 @@ struct iio_buffer *iio_dmaengine_buffer_setup_ext(struct device *dev,  	return buffer;  } -EXPORT_SYMBOL_NS_GPL(iio_dmaengine_buffer_setup_ext, IIO_DMAENGINE_BUFFER); +EXPORT_SYMBOL_NS_GPL(iio_dmaengine_buffer_setup_ext, "IIO_DMAENGINE_BUFFER");  static void __devm_iio_dmaengine_buffer_free(void *buffer)  { @@ -345,9 +345,9 @@ int devm_iio_dmaengine_buffer_setup_ext(struct device *dev,  	return devm_add_action_or_reset(dev, __devm_iio_dmaengine_buffer_free,  					buffer);  } -EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_ext, IIO_DMAENGINE_BUFFER); +EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_ext, "IIO_DMAENGINE_BUFFER");  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("DMA buffer for the IIO framework");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_DMA_BUFFER); +MODULE_IMPORT_NS("IIO_DMA_BUFFER"); diff --git a/drivers/iio/chemical/bme680_core.c b/drivers/iio/chemical/bme680_core.c index 9783953e64e0..d12270409c8a 100644 --- a/drivers/iio/chemical/bme680_core.c +++ b/drivers/iio/chemical/bme680_core.c @@ -155,7 +155,7 @@ const struct regmap_config bme680_regmap_config = {  	.volatile_table = &bme680_volatile_table,  	.cache_type = REGCACHE_RBTREE,  }; -EXPORT_SYMBOL_NS(bme680_regmap_config, IIO_BME680); +EXPORT_SYMBOL_NS(bme680_regmap_config, "IIO_BME680");  static const struct iio_chan_spec bme680_channels[] = {  	{ @@ -1156,7 +1156,7 @@ int bme680_core_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(bme680_core_probe, IIO_BME680); +EXPORT_SYMBOL_NS_GPL(bme680_core_probe, "IIO_BME680");  MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");  MODULE_DESCRIPTION("Bosch BME680 Driver"); diff --git a/drivers/iio/chemical/bme680_i2c.c b/drivers/iio/chemical/bme680_i2c.c index 7c4224d75955..7a949228b4a6 100644 --- a/drivers/iio/chemical/bme680_i2c.c +++ b/drivers/iio/chemical/bme680_i2c.c @@ -60,4 +60,4 @@ module_i2c_driver(bme680_i2c_driver);  MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");  MODULE_DESCRIPTION("BME680 I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BME680); +MODULE_IMPORT_NS("IIO_BME680"); diff --git a/drivers/iio/chemical/bme680_spi.c b/drivers/iio/chemical/bme680_spi.c index 7c54bd17d4b0..3916a51ba68e 100644 --- a/drivers/iio/chemical/bme680_spi.c +++ b/drivers/iio/chemical/bme680_spi.c @@ -163,4 +163,4 @@ module_spi_driver(bme680_spi_driver);  MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");  MODULE_DESCRIPTION("Bosch BME680 SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BME680); +MODULE_IMPORT_NS("IIO_BME680"); diff --git a/drivers/iio/chemical/ens160_core.c b/drivers/iio/chemical/ens160_core.c index c1aa3b498d3b..4a89cd5894d9 100644 --- a/drivers/iio/chemical/ens160_core.c +++ b/drivers/iio/chemical/ens160_core.c @@ -360,7 +360,7 @@ int devm_ens160_core_probe(struct device *dev, struct regmap *regmap, int irq,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS(devm_ens160_core_probe, IIO_ENS160); +EXPORT_SYMBOL_NS(devm_ens160_core_probe, "IIO_ENS160");  MODULE_AUTHOR("Gustavo Silva <gustavograzs@gmail.com>");  MODULE_DESCRIPTION("ScioSense ENS160 driver"); diff --git a/drivers/iio/chemical/ens160_i2c.c b/drivers/iio/chemical/ens160_i2c.c index 57a189a4c257..aa0dfe639245 100644 --- a/drivers/iio/chemical/ens160_i2c.c +++ b/drivers/iio/chemical/ens160_i2c.c @@ -59,4 +59,4 @@ module_i2c_driver(ens160_i2c_driver);  MODULE_AUTHOR("Gustavo Silva <gustavograzs@gmail.com>");  MODULE_DESCRIPTION("ScioSense ENS160 I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ENS160); +MODULE_IMPORT_NS("IIO_ENS160"); diff --git a/drivers/iio/chemical/ens160_spi.c b/drivers/iio/chemical/ens160_spi.c index 10e4f5fd0f45..a674c0e1bf4b 100644 --- a/drivers/iio/chemical/ens160_spi.c +++ b/drivers/iio/chemical/ens160_spi.c @@ -58,4 +58,4 @@ module_spi_driver(ens160_spi_driver);  MODULE_AUTHOR("Gustavo Silva <gustavograzs@gmail.com>");  MODULE_DESCRIPTION("ScioSense ENS160 SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ENS160); +MODULE_IMPORT_NS("IIO_ENS160"); diff --git a/drivers/iio/chemical/scd30_core.c b/drivers/iio/chemical/scd30_core.c index 7be5a45cf71a..ac3080929f0b 100644 --- a/drivers/iio/chemical/scd30_core.c +++ b/drivers/iio/chemical/scd30_core.c @@ -747,7 +747,7 @@ int scd30_probe(struct device *dev, int irq, const char *name, void *priv,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS(scd30_probe, IIO_SCD30); +EXPORT_SYMBOL_NS(scd30_probe, "IIO_SCD30");  MODULE_AUTHOR("Tomasz Duszynski <tomasz.duszynski@octakon.com>");  MODULE_DESCRIPTION("Sensirion SCD30 carbon dioxide sensor core driver"); diff --git a/drivers/iio/chemical/scd30_i2c.c b/drivers/iio/chemical/scd30_i2c.c index b31dfaf52df9..436df9c61a71 100644 --- a/drivers/iio/chemical/scd30_i2c.c +++ b/drivers/iio/chemical/scd30_i2c.c @@ -137,4 +137,4 @@ module_i2c_driver(scd30_i2c_driver);  MODULE_AUTHOR("Tomasz Duszynski <tomasz.duszynski@octakon.com>");  MODULE_DESCRIPTION("Sensirion SCD30 carbon dioxide sensor i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_SCD30); +MODULE_IMPORT_NS("IIO_SCD30"); diff --git a/drivers/iio/chemical/scd30_serial.c b/drivers/iio/chemical/scd30_serial.c index 55044f07d5a3..e8b453aae859 100644 --- a/drivers/iio/chemical/scd30_serial.c +++ b/drivers/iio/chemical/scd30_serial.c @@ -261,4 +261,4 @@ module_serdev_device_driver(scd30_serdev_driver);  MODULE_AUTHOR("Tomasz Duszynski <tomasz.duszynski@octakon.com>");  MODULE_DESCRIPTION("Sensirion SCD30 carbon dioxide sensor serial driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_SCD30); +MODULE_IMPORT_NS("IIO_SCD30"); diff --git a/drivers/iio/chemical/sps30.c b/drivers/iio/chemical/sps30.c index 814ce0aad1cc..6f4f2ba2c09d 100644 --- a/drivers/iio/chemical/sps30.c +++ b/drivers/iio/chemical/sps30.c @@ -372,7 +372,7 @@ int sps30_probe(struct device *dev, const char *name, void *priv, const struct s  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(sps30_probe, IIO_SPS30); +EXPORT_SYMBOL_NS_GPL(sps30_probe, "IIO_SPS30");  MODULE_AUTHOR("Tomasz Duszynski <tduszyns@gmail.com>");  MODULE_DESCRIPTION("Sensirion SPS30 particulate matter sensor driver"); diff --git a/drivers/iio/chemical/sps30_i2c.c b/drivers/iio/chemical/sps30_i2c.c index 1b21b6bcd0e7..f692c089d17b 100644 --- a/drivers/iio/chemical/sps30_i2c.c +++ b/drivers/iio/chemical/sps30_i2c.c @@ -256,4 +256,4 @@ module_i2c_driver(sps30_i2c_driver);  MODULE_AUTHOR("Tomasz Duszynski <tomasz.duszynski@octakon.com>");  MODULE_DESCRIPTION("Sensirion SPS30 particulate matter sensor i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_SPS30); +MODULE_IMPORT_NS("IIO_SPS30"); diff --git a/drivers/iio/chemical/sps30_serial.c b/drivers/iio/chemical/sps30_serial.c index a6dfbe28c914..008bc88590f3 100644 --- a/drivers/iio/chemical/sps30_serial.c +++ b/drivers/iio/chemical/sps30_serial.c @@ -429,4 +429,4 @@ module_serdev_device_driver(sps30_serial_driver);  MODULE_AUTHOR("Tomasz Duszynski <tomasz.duszynski@octakon.com>");  MODULE_DESCRIPTION("Sensirion SPS30 particulate matter sensor serial driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_SPS30); +MODULE_IMPORT_NS("IIO_SPS30"); diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index 9b279937a24e..ad1882f608c0 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c @@ -169,7 +169,7 @@ s32 hid_sensor_read_poll_value(struct hid_sensor_common *st)  	return value;  } -EXPORT_SYMBOL_NS(hid_sensor_read_poll_value, IIO_HID_ATTRIBUTES); +EXPORT_SYMBOL_NS(hid_sensor_read_poll_value, "IIO_HID_ATTRIBUTES");  int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st,  				int *val1, int *val2) @@ -196,7 +196,7 @@ int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st,  	return IIO_VAL_INT_PLUS_MICRO;  } -EXPORT_SYMBOL_NS(hid_sensor_read_samp_freq_value, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_read_samp_freq_value, "IIO_HID");  int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,  				int val1, int val2) @@ -231,7 +231,7 @@ int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,  	return 0;  } -EXPORT_SYMBOL_NS(hid_sensor_write_samp_freq_value, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_write_samp_freq_value, "IIO_HID");  int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,  				int *val1, int *val2) @@ -254,7 +254,7 @@ int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,  	return IIO_VAL_INT_PLUS_MICRO;  } -EXPORT_SYMBOL_NS(hid_sensor_read_raw_hyst_value, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_read_raw_hyst_value, "IIO_HID");  int hid_sensor_read_raw_hyst_rel_value(struct hid_sensor_common *st, int *val1,  				       int *val2) @@ -276,7 +276,7 @@ int hid_sensor_read_raw_hyst_rel_value(struct hid_sensor_common *st, int *val1,  	return IIO_VAL_INT_PLUS_MICRO;  } -EXPORT_SYMBOL_NS(hid_sensor_read_raw_hyst_rel_value, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_read_raw_hyst_rel_value, "IIO_HID");  int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, @@ -308,7 +308,7 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,  	return 0;  } -EXPORT_SYMBOL_NS(hid_sensor_write_raw_hyst_value, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_write_raw_hyst_value, "IIO_HID");  int hid_sensor_write_raw_hyst_rel_value(struct hid_sensor_common *st,  					int val1, int val2) @@ -339,7 +339,7 @@ int hid_sensor_write_raw_hyst_rel_value(struct hid_sensor_common *st,  	return 0;  } -EXPORT_SYMBOL_NS(hid_sensor_write_raw_hyst_rel_value, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_write_raw_hyst_rel_value, "IIO_HID");  /*   * This fuction applies the unit exponent to the scale. @@ -423,14 +423,14 @@ int hid_sensor_format_scale(u32 usage_id,  	return IIO_VAL_INT_PLUS_NANO;  } -EXPORT_SYMBOL_NS(hid_sensor_format_scale, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_format_scale, "IIO_HID");  int64_t hid_sensor_convert_timestamp(struct hid_sensor_common *st,  				     int64_t raw_value)  {  	return st->timestamp_ns_scale * raw_value;  } -EXPORT_SYMBOL_NS(hid_sensor_convert_timestamp, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_convert_timestamp, "IIO_HID");  static  int hid_sensor_get_reporting_interval(struct hid_sensor_hub_device *hsdev, @@ -477,7 +477,7 @@ int hid_sensor_get_report_latency(struct hid_sensor_common *st)  	return value;  } -EXPORT_SYMBOL_NS(hid_sensor_get_report_latency, IIO_HID_ATTRIBUTES); +EXPORT_SYMBOL_NS(hid_sensor_get_report_latency, "IIO_HID_ATTRIBUTES");  int hid_sensor_set_report_latency(struct hid_sensor_common *st, int latency_ms)  { @@ -485,13 +485,13 @@ int hid_sensor_set_report_latency(struct hid_sensor_common *st, int latency_ms)  				      st->report_latency.index,  				      sizeof(latency_ms), &latency_ms);  } -EXPORT_SYMBOL_NS(hid_sensor_set_report_latency, IIO_HID_ATTRIBUTES); +EXPORT_SYMBOL_NS(hid_sensor_set_report_latency, "IIO_HID_ATTRIBUTES");  bool hid_sensor_batch_mode_supported(struct hid_sensor_common *st)  {  	return st->report_latency.index > 0 && st->report_latency.report_id > 0;  } -EXPORT_SYMBOL_NS(hid_sensor_batch_mode_supported, IIO_HID_ATTRIBUTES); +EXPORT_SYMBOL_NS(hid_sensor_batch_mode_supported, "IIO_HID_ATTRIBUTES");  int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,  					u32 usage_id, @@ -583,7 +583,7 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,  	return 0;  } -EXPORT_SYMBOL_NS(hid_sensor_parse_common_attributes, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_parse_common_attributes, "IIO_HID");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");  MODULE_DESCRIPTION("HID Sensor common attribute processing"); diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index abb09fefc792..48193937275b 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c @@ -147,7 +147,7 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)  	return 0;  } -EXPORT_SYMBOL_NS(hid_sensor_power_state, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_power_state, "IIO_HID");  int hid_sensor_power_state(struct hid_sensor_common *st, bool state)  { @@ -222,7 +222,7 @@ void hid_sensor_remove_trigger(struct iio_dev *indio_dev,  	iio_trigger_free(attrb->trigger);  	iio_triggered_buffer_cleanup(indio_dev);  } -EXPORT_SYMBOL_NS(hid_sensor_remove_trigger, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_remove_trigger, "IIO_HID");  static const struct iio_trigger_ops hid_sensor_trigger_ops = {  	.set_trigger_state = &hid_sensor_data_rdy_trigger_set_state, @@ -289,7 +289,7 @@ error_triggered_buffer_cleanup:  	iio_triggered_buffer_cleanup(indio_dev);  	return ret;  } -EXPORT_SYMBOL_NS(hid_sensor_setup_trigger, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_setup_trigger, "IIO_HID");  static int __maybe_unused hid_sensor_suspend(struct device *dev)  { @@ -319,9 +319,9 @@ const struct dev_pm_ops hid_sensor_pm_ops = {  	SET_RUNTIME_PM_OPS(hid_sensor_suspend,  			   hid_sensor_runtime_resume, NULL)  }; -EXPORT_SYMBOL_NS(hid_sensor_pm_ops, IIO_HID); +EXPORT_SYMBOL_NS(hid_sensor_pm_ops, "IIO_HID");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");  MODULE_DESCRIPTION("HID Sensor trigger processing");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID_ATTRIBUTES); +MODULE_IMPORT_NS("IIO_HID_ATTRIBUTES"); diff --git a/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c b/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c index 37d0bdaa8d82..c081b5caa475 100644 --- a/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c +++ b/drivers/iio/common/inv_sensors/inv_sensors_timestamp.c @@ -55,7 +55,7 @@ void inv_sensors_timestamp_init(struct inv_sensors_timestamp *ts,  	/* use theoretical value for chip period */  	inv_update_acc(&ts->chip_period, chip->clock_period);  } -EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_init, IIO_INV_SENSORS_TIMESTAMP); +EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_init, "IIO_INV_SENSORS_TIMESTAMP");  int inv_sensors_timestamp_update_odr(struct inv_sensors_timestamp *ts,  				     uint32_t period, bool fifo) @@ -76,7 +76,7 @@ int inv_sensors_timestamp_update_odr(struct inv_sensors_timestamp *ts,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_update_odr, IIO_INV_SENSORS_TIMESTAMP); +EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_update_odr, "IIO_INV_SENSORS_TIMESTAMP");  static bool inv_validate_period(struct inv_sensors_timestamp *ts, uint32_t period)  { @@ -166,7 +166,7 @@ void inv_sensors_timestamp_interrupt(struct inv_sensors_timestamp *ts,  	if (valid)  		inv_align_timestamp_it(ts);  } -EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_interrupt, IIO_INV_SENSORS_TIMESTAMP); +EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_interrupt, "IIO_INV_SENSORS_TIMESTAMP");  void inv_sensors_timestamp_apply_odr(struct inv_sensors_timestamp *ts,  				     uint32_t fifo_period, size_t fifo_nb, @@ -198,7 +198,7 @@ void inv_sensors_timestamp_apply_odr(struct inv_sensors_timestamp *ts,  		ts->timestamp = ts->it.up - interval;  	}  } -EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_apply_odr, IIO_INV_SENSORS_TIMESTAMP); +EXPORT_SYMBOL_NS_GPL(inv_sensors_timestamp_apply_odr, "IIO_INV_SENSORS_TIMESTAMP");  MODULE_AUTHOR("InvenSense, Inc.");  MODULE_DESCRIPTION("InvenSense sensors timestamp module"); diff --git a/drivers/iio/common/ms_sensors/ms_sensors_i2c.c b/drivers/iio/common/ms_sensors/ms_sensors_i2c.c index 9c9bc77003c7..588470863681 100644 --- a/drivers/iio/common/ms_sensors/ms_sensors_i2c.c +++ b/drivers/iio/common/ms_sensors/ms_sensors_i2c.c @@ -58,7 +58,7 @@ int ms_sensors_reset(void *cli, u8 cmd, unsigned int delay)  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_reset, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_reset, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_read_prom_word() - PROM word read function @@ -84,7 +84,7 @@ int ms_sensors_read_prom_word(void *cli, int cmd, u16 *word)  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_read_prom_word, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_read_prom_word, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_convert_and_read() - ADC conversion & read function @@ -130,7 +130,7 @@ err:  	dev_err(&client->dev, "Unable to make sensor adc conversion\n");  	return ret;  } -EXPORT_SYMBOL_NS(ms_sensors_convert_and_read, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_convert_and_read, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_crc_valid() - CRC check function @@ -248,7 +248,7 @@ int ms_sensors_read_serial(struct i2c_client *client, u64 *sn)  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_read_serial, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_read_serial, "IIO_MEAS_SPEC_SENSORS");  static int ms_sensors_read_config_reg(struct i2c_client *client,  				      u8 *config_reg) @@ -299,7 +299,7 @@ ssize_t ms_sensors_write_resolution(struct ms_ht_dev *dev_data,  					 MS_SENSORS_CONFIG_REG_WRITE,  					 config_reg);  } -EXPORT_SYMBOL_NS(ms_sensors_write_resolution, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_write_resolution, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_show_battery_low() - Show device battery low indicator @@ -326,7 +326,7 @@ ssize_t ms_sensors_show_battery_low(struct ms_ht_dev *dev_data,  	return sysfs_emit(buf, "%d\n", (config_reg & 0x40) >> 6);  } -EXPORT_SYMBOL_NS(ms_sensors_show_battery_low, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_show_battery_low, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_show_heater() - Show device heater @@ -353,7 +353,7 @@ ssize_t ms_sensors_show_heater(struct ms_ht_dev *dev_data,  	return sysfs_emit(buf, "%d\n", (config_reg & 0x4) >> 2);  } -EXPORT_SYMBOL_NS(ms_sensors_show_heater, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_show_heater, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_write_heater() - Write device heater @@ -401,7 +401,7 @@ ssize_t ms_sensors_write_heater(struct ms_ht_dev *dev_data,  	return len;  } -EXPORT_SYMBOL_NS(ms_sensors_write_heater, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_write_heater, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_ht_read_temperature() - Read temperature @@ -442,7 +442,7 @@ int ms_sensors_ht_read_temperature(struct ms_ht_dev *dev_data,  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_ht_read_temperature, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_ht_read_temperature, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_ht_read_humidity() - Read humidity @@ -485,7 +485,7 @@ int ms_sensors_ht_read_humidity(struct ms_ht_dev *dev_data,  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_ht_read_humidity, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_ht_read_humidity, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_tp_crc4() - Calculate PROM CRC for @@ -602,7 +602,7 @@ int ms_sensors_tp_read_prom(struct ms_tp_dev *dev_data)  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_tp_read_prom, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_tp_read_prom, "IIO_MEAS_SPEC_SENSORS");  /**   * ms_sensors_read_temp_and_pressure() - read temp and pressure @@ -688,7 +688,7 @@ int ms_sensors_read_temp_and_pressure(struct ms_tp_dev *dev_data,  	return 0;  } -EXPORT_SYMBOL_NS(ms_sensors_read_temp_and_pressure, IIO_MEAS_SPEC_SENSORS); +EXPORT_SYMBOL_NS(ms_sensors_read_temp_and_pressure, "IIO_MEAS_SPEC_SENSORS");  MODULE_DESCRIPTION("Measurement-Specialties common i2c driver");  MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>"); diff --git a/drivers/iio/common/ssp_sensors/ssp_dev.c b/drivers/iio/common/ssp_sensors/ssp_dev.c index e64d242145e0..65f8a2b13cfd 100644 --- a/drivers/iio/common/ssp_sensors/ssp_dev.c +++ b/drivers/iio/common/ssp_sensors/ssp_dev.c @@ -205,7 +205,7 @@ u32 ssp_get_sensor_delay(struct ssp_data *data, enum ssp_sensor_type type)  {  	return data->delay_buf[type];  } -EXPORT_SYMBOL_NS(ssp_get_sensor_delay, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_get_sensor_delay, "IIO_SSP_SENSORS");  /**   * ssp_enable_sensor() - enables data acquisition for sensor @@ -267,7 +267,7 @@ int ssp_enable_sensor(struct ssp_data *data, enum ssp_sensor_type type,  derror:  	return ret;  } -EXPORT_SYMBOL_NS(ssp_enable_sensor, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_enable_sensor, "IIO_SSP_SENSORS");  /**   * ssp_change_delay() - changes data acquisition for sensor @@ -298,7 +298,7 @@ int ssp_change_delay(struct ssp_data *data, enum ssp_sensor_type type,  	return 0;  } -EXPORT_SYMBOL_NS(ssp_change_delay, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_change_delay, "IIO_SSP_SENSORS");  /**   * ssp_disable_sensor() - disables sensor @@ -335,7 +335,7 @@ int ssp_disable_sensor(struct ssp_data *data, enum ssp_sensor_type type)  	return 0;  } -EXPORT_SYMBOL_NS(ssp_disable_sensor, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_disable_sensor, "IIO_SSP_SENSORS");  static irqreturn_t ssp_irq_thread_fn(int irq, void *dev_id)  { @@ -478,7 +478,7 @@ void ssp_register_consumer(struct iio_dev *indio_dev, enum ssp_sensor_type type)  	data->sensor_devs[type] = indio_dev;  } -EXPORT_SYMBOL_NS(ssp_register_consumer, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_register_consumer, "IIO_SSP_SENSORS");  static int ssp_probe(struct spi_device *spi)  { diff --git a/drivers/iio/common/ssp_sensors/ssp_iio.c b/drivers/iio/common/ssp_sensors/ssp_iio.c index 88b8b56bfa51..caa404edd9d0 100644 --- a/drivers/iio/common/ssp_sensors/ssp_iio.c +++ b/drivers/iio/common/ssp_sensors/ssp_iio.c @@ -32,7 +32,7 @@ int ssp_common_buffer_postenable(struct iio_dev *indio_dev)  	return ssp_enable_sensor(data, spd->type,  				 ssp_get_sensor_delay(data, spd->type));  } -EXPORT_SYMBOL_NS(ssp_common_buffer_postenable, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_common_buffer_postenable, "IIO_SSP_SENSORS");  /**   * ssp_common_buffer_postdisable() - generic postdisable callback for ssp buffer @@ -55,7 +55,7 @@ int ssp_common_buffer_postdisable(struct iio_dev *indio_dev)  	return ret;  } -EXPORT_SYMBOL_NS(ssp_common_buffer_postdisable, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_common_buffer_postdisable, "IIO_SSP_SENSORS");  /**   * ssp_common_process_data() - Common process data callback for ssp sensors @@ -91,9 +91,9 @@ int ssp_common_process_data(struct iio_dev *indio_dev, void *buf,  	return iio_push_to_buffers_with_timestamp(indio_dev, spd->buffer,  						  calculated_time);  } -EXPORT_SYMBOL_NS(ssp_common_process_data, IIO_SSP_SENSORS); +EXPORT_SYMBOL_NS(ssp_common_process_data, "IIO_SSP_SENSORS");  MODULE_AUTHOR("Karol Wrona <k.wrona@samsung.com>");  MODULE_DESCRIPTION("Samsung sensorhub commons");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_SSP_SENSORS); +MODULE_IMPORT_NS("IIO_SSP_SENSORS"); diff --git a/drivers/iio/common/st_sensors/st_sensors_buffer.c b/drivers/iio/common/st_sensors/st_sensors_buffer.c index e2f108ca949c..57f087c2216f 100644 --- a/drivers/iio/common/st_sensors/st_sensors_buffer.c +++ b/drivers/iio/common/st_sensors/st_sensors_buffer.c @@ -76,4 +76,4 @@ st_sensors_get_buffer_element_error:  	return IRQ_HANDLED;  } -EXPORT_SYMBOL_NS(st_sensors_trigger_handler, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_trigger_handler, "IIO_ST_SENSORS"); diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c index 1b4287991d00..e4f5a7ff7e74 100644 --- a/drivers/iio/common/st_sensors/st_sensors_core.c +++ b/drivers/iio/common/st_sensors/st_sensors_core.c @@ -46,7 +46,7 @@ int st_sensors_debugfs_reg_access(struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_debugfs_reg_access, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_debugfs_reg_access, "IIO_ST_SENSORS");  static int st_sensors_match_odr(struct st_sensor_settings *sensor_settings,  			unsigned int odr, struct st_sensor_odr_avl *odr_out) @@ -110,7 +110,7 @@ unlock_mutex:  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_set_odr, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_set_odr, "IIO_ST_SENSORS");  static int st_sensors_match_fs(struct st_sensor_settings *sensor_settings,  					unsigned int fs, int *index_fs_avl) @@ -203,7 +203,7 @@ int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable)  set_enable_error:  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_set_enable, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_set_enable, "IIO_ST_SENSORS");  int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)  { @@ -217,7 +217,7 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)  				axis_enable);  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_set_axis_enable, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_set_axis_enable, "IIO_ST_SENSORS");  int st_sensors_power_enable(struct iio_dev *indio_dev) @@ -236,7 +236,7 @@ int st_sensors_power_enable(struct iio_dev *indio_dev)  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_power_enable, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_power_enable, "IIO_ST_SENSORS");  static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,  					struct st_sensors_platform_data *pdata) @@ -331,7 +331,7 @@ void st_sensors_dev_name_probe(struct device *dev, char *name, int len)  	/* The name from the match takes precedence if present */  	strscpy(name, match, len);  } -EXPORT_SYMBOL_NS(st_sensors_dev_name_probe, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_dev_name_probe, "IIO_ST_SENSORS");  int st_sensors_init_sensor(struct iio_dev *indio_dev,  					struct st_sensors_platform_data *pdata) @@ -418,7 +418,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_init_sensor, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_init_sensor, "IIO_ST_SENSORS");  int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)  { @@ -467,7 +467,7 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)  st_accel_set_dataready_irq_error:  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_set_dataready_irq, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_set_dataready_irq, "IIO_ST_SENSORS");  int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale)  { @@ -490,7 +490,7 @@ int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale)  st_sensors_match_scale_error:  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_set_fullscale_by_gain, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_set_fullscale_by_gain, "IIO_ST_SENSORS");  static int st_sensors_read_axis_data(struct iio_dev *indio_dev,  				     struct iio_chan_spec const *ch, int *data) @@ -555,7 +555,7 @@ out:  	return err;  } -EXPORT_SYMBOL_NS(st_sensors_read_info_raw, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_read_info_raw, "IIO_ST_SENSORS");  /*   * st_sensors_get_settings_index() - get index of the sensor settings for a @@ -582,7 +582,7 @@ int st_sensors_get_settings_index(const char *name,  	return -ENODEV;  } -EXPORT_SYMBOL_NS(st_sensors_get_settings_index, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_get_settings_index, "IIO_ST_SENSORS");  /*   * st_sensors_verify_id() - verify sensor ID (WhoAmI) is matching with the @@ -614,7 +614,7 @@ int st_sensors_verify_id(struct iio_dev *indio_dev)  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_verify_id, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_verify_id, "IIO_ST_SENSORS");  ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -634,7 +634,7 @@ ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,  	return len;  } -EXPORT_SYMBOL_NS(st_sensors_sysfs_sampling_frequency_avail, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_sysfs_sampling_frequency_avail, "IIO_ST_SENSORS");  ssize_t st_sensors_sysfs_scale_avail(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -656,7 +656,7 @@ ssize_t st_sensors_sysfs_scale_avail(struct device *dev,  	return len;  } -EXPORT_SYMBOL_NS(st_sensors_sysfs_scale_avail, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_sysfs_scale_avail, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics ST-sensors core"); diff --git a/drivers/iio/common/st_sensors/st_sensors_i2c.c b/drivers/iio/common/st_sensors/st_sensors_i2c.c index ee95082c7410..7156302fe997 100644 --- a/drivers/iio/common/st_sensors/st_sensors_i2c.c +++ b/drivers/iio/common/st_sensors/st_sensors_i2c.c @@ -61,7 +61,7 @@ int st_sensors_i2c_configure(struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_i2c_configure, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_i2c_configure, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics ST-sensors i2c driver"); diff --git a/drivers/iio/common/st_sensors/st_sensors_spi.c b/drivers/iio/common/st_sensors/st_sensors_spi.c index 63e302c3fbaa..0da27013943d 100644 --- a/drivers/iio/common/st_sensors/st_sensors_spi.c +++ b/drivers/iio/common/st_sensors/st_sensors_spi.c @@ -113,7 +113,7 @@ int st_sensors_spi_configure(struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_spi_configure, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_spi_configure, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics ST-sensors spi driver"); diff --git a/drivers/iio/common/st_sensors/st_sensors_trigger.c b/drivers/iio/common/st_sensors/st_sensors_trigger.c index a55967208cdc..9d4bf822a15d 100644 --- a/drivers/iio/common/st_sensors/st_sensors_trigger.c +++ b/drivers/iio/common/st_sensors/st_sensors_trigger.c @@ -227,7 +227,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_allocate_trigger, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_allocate_trigger, "IIO_ST_SENSORS");  int st_sensors_validate_device(struct iio_trigger *trig,  			       struct iio_dev *indio_dev) @@ -239,4 +239,4 @@ int st_sensors_validate_device(struct iio_trigger *trig,  	return 0;  } -EXPORT_SYMBOL_NS(st_sensors_validate_device, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_sensors_validate_device, "IIO_ST_SENSORS"); diff --git a/drivers/iio/dac/ad3552r-common.c b/drivers/iio/dac/ad3552r-common.c index 2dfeca3656d2..0f495df2e5ce 100644 --- a/drivers/iio/dac/ad3552r-common.c +++ b/drivers/iio/dac/ad3552r-common.c @@ -18,7 +18,7 @@ const s32 ad3552r_ch_ranges[AD3552R_MAX_RANGES][2] = {  	[AD3552R_CH_OUTPUT_RANGE_NEG_5__5V]	= { -5000, 5000 },  	[AD3552R_CH_OUTPUT_RANGE_NEG_10__10V]	= { -10000, 10000 }  }; -EXPORT_SYMBOL_NS_GPL(ad3552r_ch_ranges, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_ch_ranges, "IIO_AD3552R");  const s32 ad3542r_ch_ranges[AD3542R_MAX_RANGES][2] = {  	[AD3542R_CH_OUTPUT_RANGE_0__2P5V]	= { 0, 2500 }, @@ -28,7 +28,7 @@ const s32 ad3542r_ch_ranges[AD3542R_MAX_RANGES][2] = {  	[AD3542R_CH_OUTPUT_RANGE_NEG_2P5__7P5V]	= { -2500, 7500 },  	[AD3542R_CH_OUTPUT_RANGE_NEG_5__5V]	= { -5000, 5000 }  }; -EXPORT_SYMBOL_NS_GPL(ad3542r_ch_ranges, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3542r_ch_ranges, "IIO_AD3552R");  /* Gain * AD3552R_GAIN_SCALE */  static const s32 gains_scaling_table[] = { @@ -46,7 +46,7 @@ u16 ad3552r_calc_custom_gain(u8 p, u8 n, s16 goffs)  	       FIELD_PREP(AD3552R_MASK_CH_OFFSET_BIT_8, abs(goffs)) |  	       FIELD_PREP(AD3552R_MASK_CH_OFFSET_POLARITY, goffs < 0);  } -EXPORT_SYMBOL_NS_GPL(ad3552r_calc_custom_gain, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_calc_custom_gain, "IIO_AD3552R");  static void ad3552r_get_custom_range(struct ad3552r_ch_data *ch_data,  				     s32 *v_min, s32 *v_max) @@ -108,7 +108,7 @@ void ad3552r_calc_gain_and_offset(struct ad3552r_ch_data *ch_data,  	tmp = (s64)rem * 1000000;  	ch_data->offset_dec = div_s64(tmp, span);  } -EXPORT_SYMBOL_NS_GPL(ad3552r_calc_gain_and_offset, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_calc_gain_and_offset, "IIO_AD3552R");  int ad3552r_get_ref_voltage(struct device *dev, u32 *val)  { @@ -138,7 +138,7 @@ int ad3552r_get_ref_voltage(struct device *dev, u32 *val)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad3552r_get_ref_voltage, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_get_ref_voltage, "IIO_AD3552R");  int ad3552r_get_drive_strength(struct device *dev, u32 *val)  { @@ -160,7 +160,7 @@ int ad3552r_get_drive_strength(struct device *dev, u32 *val)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad3552r_get_drive_strength, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_get_drive_strength, "IIO_AD3552R");  int ad3552r_get_custom_gain(struct device *dev, struct fwnode_handle *child,  			    u8 *gs_p, u8 *gs_n, u16 *rfb, s16 *goffs) @@ -201,7 +201,7 @@ int ad3552r_get_custom_gain(struct device *dev, struct fwnode_handle *child,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad3552r_get_custom_gain, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_get_custom_gain, "IIO_AD3552R");  static int ad3552r_find_range(const struct ad3552r_model_data *model_info,  			      s32 *vals) @@ -243,7 +243,7 @@ int ad3552r_get_output_range(struct device *dev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ad3552r_get_output_range, IIO_AD3552R); +EXPORT_SYMBOL_NS_GPL(ad3552r_get_output_range, "IIO_AD3552R");  MODULE_DESCRIPTION("ad3552r common functions");  MODULE_LICENSE("GPL"); diff --git a/drivers/iio/dac/ad3552r-hs.c b/drivers/iio/dac/ad3552r-hs.c index d5c704adf5bf..216c634f3eaf 100644 --- a/drivers/iio/dac/ad3552r-hs.c +++ b/drivers/iio/dac/ad3552r-hs.c @@ -525,5 +525,5 @@ MODULE_AUTHOR("Dragos Bogdan <dragos.bogdan@analog.com>");  MODULE_AUTHOR("Angelo Dureghello <adueghello@baylibre.com>");  MODULE_DESCRIPTION("AD3552R Driver - High Speed version");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BACKEND); -MODULE_IMPORT_NS(IIO_AD3552R); +MODULE_IMPORT_NS("IIO_BACKEND"); +MODULE_IMPORT_NS("IIO_AD3552R"); diff --git a/drivers/iio/dac/ad3552r.c b/drivers/iio/dac/ad3552r.c index 92688d958f4f..e7206af53af6 100644 --- a/drivers/iio/dac/ad3552r.c +++ b/drivers/iio/dac/ad3552r.c @@ -728,4 +728,4 @@ module_spi_driver(ad3552r_driver);  MODULE_AUTHOR("Mihail Chindris <mihail.chindris@analog.com>");  MODULE_DESCRIPTION("Analog Device AD3552R DAC");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD3552R); +MODULE_IMPORT_NS("IIO_AD3552R"); diff --git a/drivers/iio/dac/ad5592r-base.c b/drivers/iio/dac/ad5592r-base.c index 4763402dbcd6..50d19304bacb 100644 --- a/drivers/iio/dac/ad5592r-base.c +++ b/drivers/iio/dac/ad5592r-base.c @@ -665,7 +665,7 @@ error_disable_reg:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ad5592r_probe, IIO_AD5592R); +EXPORT_SYMBOL_NS_GPL(ad5592r_probe, "IIO_AD5592R");  void ad5592r_remove(struct device *dev)  { @@ -679,7 +679,7 @@ void ad5592r_remove(struct device *dev)  	if (st->reg)  		regulator_disable(st->reg);  } -EXPORT_SYMBOL_NS_GPL(ad5592r_remove, IIO_AD5592R); +EXPORT_SYMBOL_NS_GPL(ad5592r_remove, "IIO_AD5592R");  MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD5592R multi-channel converters"); diff --git a/drivers/iio/dac/ad5592r.c b/drivers/iio/dac/ad5592r.c index 32d950bbb1ca..fd82d8701322 100644 --- a/drivers/iio/dac/ad5592r.c +++ b/drivers/iio/dac/ad5592r.c @@ -168,4 +168,4 @@ module_spi_driver(ad5592r_spi_driver);  MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD5592R multi-channel converters");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD5592R); +MODULE_IMPORT_NS("IIO_AD5592R"); diff --git a/drivers/iio/dac/ad5593r.c b/drivers/iio/dac/ad5593r.c index 62e1fbb9e910..ddd13ad821a7 100644 --- a/drivers/iio/dac/ad5593r.c +++ b/drivers/iio/dac/ad5593r.c @@ -147,4 +147,4 @@ module_i2c_driver(ad5593r_driver);  MODULE_AUTHOR("Paul Cercueil <paul.cercueil@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD5593R multi-channel converters");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD5592R); +MODULE_IMPORT_NS("IIO_AD5592R"); diff --git a/drivers/iio/dac/ad5686-spi.c b/drivers/iio/dac/ad5686-spi.c index 8ba2ea70451a..39b5dad0d6a5 100644 --- a/drivers/iio/dac/ad5686-spi.c +++ b/drivers/iio/dac/ad5686-spi.c @@ -135,4 +135,4 @@ module_spi_driver(ad5686_spi_driver);  MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD5686 and similar multi-channel DACs");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD5686); +MODULE_IMPORT_NS("IIO_AD5686"); diff --git a/drivers/iio/dac/ad5686.c b/drivers/iio/dac/ad5686.c index 57cc0f0eedc6..8dc578b08784 100644 --- a/drivers/iio/dac/ad5686.c +++ b/drivers/iio/dac/ad5686.c @@ -543,7 +543,7 @@ error_disable_reg:  		regulator_disable(st->reg);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ad5686_probe, IIO_AD5686); +EXPORT_SYMBOL_NS_GPL(ad5686_probe, "IIO_AD5686");  void ad5686_remove(struct device *dev)  { @@ -554,7 +554,7 @@ void ad5686_remove(struct device *dev)  	if (!IS_ERR(st->reg))  		regulator_disable(st->reg);  } -EXPORT_SYMBOL_NS_GPL(ad5686_remove, IIO_AD5686); +EXPORT_SYMBOL_NS_GPL(ad5686_remove, "IIO_AD5686");  MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC"); diff --git a/drivers/iio/dac/ad5696-i2c.c b/drivers/iio/dac/ad5696-i2c.c index 81541f755a3e..bbcda246c547 100644 --- a/drivers/iio/dac/ad5696-i2c.c +++ b/drivers/iio/dac/ad5696-i2c.c @@ -125,4 +125,4 @@ module_i2c_driver(ad5686_i2c_driver);  MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD5686 and similar multi-channel DACs");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_AD5686); +MODULE_IMPORT_NS("IIO_AD5686"); diff --git a/drivers/iio/dac/ad8460.c b/drivers/iio/dac/ad8460.c index f235394589df..535ee3105af6 100644 --- a/drivers/iio/dac/ad8460.c +++ b/drivers/iio/dac/ad8460.c @@ -948,4 +948,4 @@ module_spi_driver(ad8460_driver);  MODULE_AUTHOR("Mariel Tinaco <mariel.tinaco@analog.com");  MODULE_DESCRIPTION("AD8460 DAC driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); +MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER"); diff --git a/drivers/iio/dac/ad9739a.c b/drivers/iio/dac/ad9739a.c index 615d1a196db3..b6a65359b0b4 100644 --- a/drivers/iio/dac/ad9739a.c +++ b/drivers/iio/dac/ad9739a.c @@ -466,4 +466,4 @@ MODULE_AUTHOR("Dragos Bogdan <dragos.bogdan@analog.com>");  MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");  MODULE_DESCRIPTION("Analog Devices AD9739 DAC");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/dac/adi-axi-dac.c b/drivers/iio/dac/adi-axi-dac.c index dd1919441b6d..b143f7ed6847 100644 --- a/drivers/iio/dac/adi-axi-dac.c +++ b/drivers/iio/dac/adi-axi-dac.c @@ -946,5 +946,5 @@ module_platform_driver(axi_dac_driver);  MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");  MODULE_DESCRIPTION("Analog Devices Generic AXI DAC IP core driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_DMAENGINE_BUFFER); -MODULE_IMPORT_NS(IIO_BACKEND); +MODULE_IMPORT_NS("IIO_DMAENGINE_BUFFER"); +MODULE_IMPORT_NS("IIO_BACKEND"); diff --git a/drivers/iio/dummy/iio_simple_dummy_buffer.c b/drivers/iio/dummy/iio_simple_dummy_buffer.c index 4ca3f1aaff99..288880346707 100644 --- a/drivers/iio/dummy/iio_simple_dummy_buffer.c +++ b/drivers/iio/dummy/iio_simple_dummy_buffer.c @@ -48,7 +48,7 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)  	int i = 0, j;  	u16 *data; -	data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); +	data = kzalloc(indio_dev->scan_bytes, GFP_KERNEL);  	if (!data)  		goto done; diff --git a/drivers/iio/gyro/adis16136.c b/drivers/iio/gyro/adis16136.c index da83adc684d0..369c7428e1ef 100644 --- a/drivers/iio/gyro/adis16136.c +++ b/drivers/iio/gyro/adis16136.c @@ -583,4 +583,4 @@ module_spi_driver(adis16136_driver);  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("Analog Devices ADIS16133/ADIS16135/ADIS16136 gyroscope driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/gyro/adis16260.c b/drivers/iio/gyro/adis16260.c index 495b64a27061..c151fbb59ffe 100644 --- a/drivers/iio/gyro/adis16260.c +++ b/drivers/iio/gyro/adis16260.c @@ -430,4 +430,4 @@ module_spi_driver(adis16260_driver);  MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16260/5 Digital Gyroscope Sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/gyro/fxas21002c_core.c b/drivers/iio/gyro/fxas21002c_core.c index 688966129f70..754c8a564ba4 100644 --- a/drivers/iio/gyro/fxas21002c_core.c +++ b/drivers/iio/gyro/fxas21002c_core.c @@ -730,14 +730,21 @@ static irqreturn_t fxas21002c_trigger_handler(int irq, void *p)  	int ret;  	mutex_lock(&data->lock); +	ret = fxas21002c_pm_get(data); +	if (ret < 0) +		goto out_unlock; +  	ret = regmap_bulk_read(data->regmap, FXAS21002C_REG_OUT_X_MSB,  			       data->buffer, CHANNEL_SCAN_MAX * sizeof(s16));  	if (ret < 0) -		goto out_unlock; +		goto out_pm_put;  	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,  					   data->timestamp); +out_pm_put: +	fxas21002c_pm_put(data); +  out_unlock:  	mutex_unlock(&data->lock); @@ -997,7 +1004,7 @@ pm_disable:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(fxas21002c_core_probe, IIO_FXAS21002C); +EXPORT_SYMBOL_NS_GPL(fxas21002c_core_probe, "IIO_FXAS21002C");  void fxas21002c_core_remove(struct device *dev)  { @@ -1008,7 +1015,7 @@ void fxas21002c_core_remove(struct device *dev)  	pm_runtime_disable(dev);  	pm_runtime_set_suspended(dev);  } -EXPORT_SYMBOL_NS_GPL(fxas21002c_core_remove, IIO_FXAS21002C); +EXPORT_SYMBOL_NS_GPL(fxas21002c_core_remove, "IIO_FXAS21002C");  static int fxas21002c_suspend(struct device *dev)  { diff --git a/drivers/iio/gyro/fxas21002c_i2c.c b/drivers/iio/gyro/fxas21002c_i2c.c index b1318a1ea41b..43c6b3079487 100644 --- a/drivers/iio/gyro/fxas21002c_i2c.c +++ b/drivers/iio/gyro/fxas21002c_i2c.c @@ -65,4 +65,4 @@ module_i2c_driver(fxas21002c_i2c_driver);  MODULE_AUTHOR("Rui Miguel Silva <rui.silva@linaro.org>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("FXAS21002C I2C Gyro driver"); -MODULE_IMPORT_NS(IIO_FXAS21002C); +MODULE_IMPORT_NS("IIO_FXAS21002C"); diff --git a/drivers/iio/gyro/fxas21002c_spi.c b/drivers/iio/gyro/fxas21002c_spi.c index 4f633826547c..d62efe50b697 100644 --- a/drivers/iio/gyro/fxas21002c_spi.c +++ b/drivers/iio/gyro/fxas21002c_spi.c @@ -66,4 +66,4 @@ module_spi_driver(fxas21002c_spi_driver);  MODULE_AUTHOR("Rui Miguel Silva <rui.silva@linaro.org>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("FXAS21002C SPI Gyro driver"); -MODULE_IMPORT_NS(IIO_FXAS21002C); +MODULE_IMPORT_NS("IIO_FXAS21002C"); diff --git a/drivers/iio/gyro/hid-sensor-gyro-3d.c b/drivers/iio/gyro/hid-sensor-gyro-3d.c index 0598f1d3fbb3..54b6f6fbdcaa 100644 --- a/drivers/iio/gyro/hid-sensor-gyro-3d.c +++ b/drivers/iio/gyro/hid-sensor-gyro-3d.c @@ -393,4 +393,4 @@ module_platform_driver(hid_gyro_3d_platform_driver);  MODULE_DESCRIPTION("HID Sensor Gyroscope 3D");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/gyro/ssp_gyro_sensor.c b/drivers/iio/gyro/ssp_gyro_sensor.c index d332474bc484..d9b41cf8d799 100644 --- a/drivers/iio/gyro/ssp_gyro_sensor.c +++ b/drivers/iio/gyro/ssp_gyro_sensor.c @@ -141,4 +141,4 @@ module_platform_driver(ssp_gyro_driver);  MODULE_AUTHOR("Karol Wrona <k.wrona@samsung.com>");  MODULE_DESCRIPTION("Samsung sensorhub gyroscopes driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_SSP_SENSORS); +MODULE_IMPORT_NS("IIO_SSP_SENSORS"); diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c index eaa35da42b33..7fd82cd707c7 100644 --- a/drivers/iio/gyro/st_gyro_core.c +++ b/drivers/iio/gyro/st_gyro_core.c @@ -465,7 +465,7 @@ const struct st_sensor_settings *st_gyro_get_settings(const char *name)  	return &st_gyro_sensors_settings[index];  } -EXPORT_SYMBOL_NS(st_gyro_get_settings, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_gyro_get_settings, "IIO_ST_SENSORS");  int st_gyro_common_probe(struct iio_dev *indio_dev)  { @@ -511,9 +511,9 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)  	return devm_iio_device_register(parent, indio_dev);  } -EXPORT_SYMBOL_NS(st_gyro_common_probe, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_gyro_common_probe, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics gyroscopes driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/gyro/st_gyro_i2c.c b/drivers/iio/gyro/st_gyro_i2c.c index 5a10a3556ab0..d4b11bdba666 100644 --- a/drivers/iio/gyro/st_gyro_i2c.c +++ b/drivers/iio/gyro/st_gyro_i2c.c @@ -119,4 +119,4 @@ module_i2c_driver(st_gyro_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics gyroscopes i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/gyro/st_gyro_spi.c b/drivers/iio/gyro/st_gyro_spi.c index 22aaabe48e4a..811f712711f5 100644 --- a/drivers/iio/gyro/st_gyro_spi.c +++ b/drivers/iio/gyro/st_gyro_spi.c @@ -124,4 +124,4 @@ module_spi_driver(st_gyro_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics gyroscopes spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/humidity/hid-sensor-humidity.c b/drivers/iio/humidity/hid-sensor-humidity.c index f2fa0e1631ff..a40e1eb6e98c 100644 --- a/drivers/iio/humidity/hid-sensor-humidity.c +++ b/drivers/iio/humidity/hid-sensor-humidity.c @@ -294,4 +294,4 @@ module_platform_driver(hid_humidity_platform_driver);  MODULE_DESCRIPTION("HID Environmental humidity sensor");  MODULE_AUTHOR("Song Hongyan <hongyan.song@intel.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/humidity/hts221_core.c b/drivers/iio/humidity/hts221_core.c index 87627d116eff..0be11470730c 100644 --- a/drivers/iio/humidity/hts221_core.c +++ b/drivers/iio/humidity/hts221_core.c @@ -649,7 +649,7 @@ int hts221_probe(struct device *dev, int irq, const char *name,  	return devm_iio_device_register(hw->dev, iio_dev);  } -EXPORT_SYMBOL_NS(hts221_probe, IIO_HTS221); +EXPORT_SYMBOL_NS(hts221_probe, "IIO_HTS221");  static int hts221_suspend(struct device *dev)  { diff --git a/drivers/iio/humidity/hts221_i2c.c b/drivers/iio/humidity/hts221_i2c.c index 5cb263e0ef5a..87a8e3c8d277 100644 --- a/drivers/iio/humidity/hts221_i2c.c +++ b/drivers/iio/humidity/hts221_i2c.c @@ -73,4 +73,4 @@ module_i2c_driver(hts221_driver);  MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");  MODULE_DESCRIPTION("STMicroelectronics hts221 i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_HTS221); +MODULE_IMPORT_NS("IIO_HTS221"); diff --git a/drivers/iio/humidity/hts221_spi.c b/drivers/iio/humidity/hts221_spi.c index fc4adb68faf6..00154b9d66b5 100644 --- a/drivers/iio/humidity/hts221_spi.c +++ b/drivers/iio/humidity/hts221_spi.c @@ -66,4 +66,4 @@ module_spi_driver(hts221_driver);  MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");  MODULE_DESCRIPTION("STMicroelectronics hts221 spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_HTS221); +MODULE_IMPORT_NS("IIO_HTS221"); diff --git a/drivers/iio/humidity/htu21.c b/drivers/iio/humidity/htu21.c index 39e886075299..6402e393edb8 100644 --- a/drivers/iio/humidity/htu21.c +++ b/drivers/iio/humidity/htu21.c @@ -258,4 +258,4 @@ MODULE_DESCRIPTION("Measurement-Specialties htu21 temperature and humidity drive  MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>");  MODULE_AUTHOR("Ludovic Tancerel <ludovic.tancerel@maplehightech.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MEAS_SPEC_SENSORS); +MODULE_IMPORT_NS("IIO_MEAS_SPEC_SENSORS"); diff --git a/drivers/iio/imu/adis.c b/drivers/iio/imu/adis.c index 99410733c1ca..494171844812 100644 --- a/drivers/iio/imu/adis.c +++ b/drivers/iio/imu/adis.c @@ -115,7 +115,7 @@ int __adis_write_reg(struct adis *adis, unsigned int reg, unsigned int value,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(__adis_write_reg, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(__adis_write_reg, "IIO_ADISLIB");  /**   * __adis_read_reg() - read N bytes from register (unlocked version) @@ -206,7 +206,7 @@ int __adis_read_reg(struct adis *adis, unsigned int reg, unsigned int *val,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(__adis_read_reg, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(__adis_read_reg, "IIO_ADISLIB");  /**   * __adis_update_bits_base() - ADIS Update bits function - Unlocked version   * @adis: The adis device @@ -231,7 +231,7 @@ int __adis_update_bits_base(struct adis *adis, unsigned int reg, const u32 mask,  	return __adis_write_reg(adis, reg, __val, size);  } -EXPORT_SYMBOL_NS_GPL(__adis_update_bits_base, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(__adis_update_bits_base, "IIO_ADISLIB");  #ifdef CONFIG_DEBUG_FS @@ -253,7 +253,7 @@ int adis_debugfs_reg_access(struct iio_dev *indio_dev, unsigned int reg,  	return adis_write_reg_16(adis, reg, writeval);  } -EXPORT_SYMBOL_NS(adis_debugfs_reg_access, IIO_ADISLIB); +EXPORT_SYMBOL_NS(adis_debugfs_reg_access, "IIO_ADISLIB");  #endif @@ -294,7 +294,7 @@ int __adis_enable_irq(struct adis *adis, bool enable)  	return __adis_write_reg_16(adis, adis->data->msc_ctrl_reg, msc);  } -EXPORT_SYMBOL_NS(__adis_enable_irq, IIO_ADISLIB); +EXPORT_SYMBOL_NS(__adis_enable_irq, "IIO_ADISLIB");  /**   * __adis_check_status() - Check the device for error conditions (unlocked) @@ -326,7 +326,7 @@ int __adis_check_status(struct adis *adis)  	return -EIO;  } -EXPORT_SYMBOL_NS_GPL(__adis_check_status, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(__adis_check_status, "IIO_ADISLIB");  /**   * __adis_reset() - Reset the device (unlocked version) @@ -350,7 +350,7 @@ int __adis_reset(struct adis *adis)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(__adis_reset, IIO_ADIS_LIB); +EXPORT_SYMBOL_NS_GPL(__adis_reset, "IIO_ADIS_LIB");  static int adis_self_test(struct adis *adis)  { @@ -441,7 +441,7 @@ int __adis_initial_startup(struct adis *adis)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(__adis_initial_startup, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(__adis_initial_startup, "IIO_ADISLIB");  /**   * adis_single_conversion() - Performs a single sample conversion @@ -486,7 +486,7 @@ int adis_single_conversion(struct iio_dev *indio_dev,  	return IIO_VAL_INT;  } -EXPORT_SYMBOL_NS_GPL(adis_single_conversion, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(adis_single_conversion, "IIO_ADISLIB");  /**   * adis_init() - Initialize adis device structure @@ -529,7 +529,7 @@ int adis_init(struct adis *adis, struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(adis_init, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(adis_init, "IIO_ADISLIB");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); diff --git a/drivers/iio/imu/adis16400.c b/drivers/iio/imu/adis16400.c index 6484ab8aff55..3086dd536203 100644 --- a/drivers/iio/imu/adis16400.c +++ b/drivers/iio/imu/adis16400.c @@ -1228,4 +1228,4 @@ module_spi_driver(adis16400_driver);  MODULE_AUTHOR("Manuel Stahl <manuel.stahl@iis.fraunhofer.de>");  MODULE_DESCRIPTION("Analog Devices ADIS16400/5 IMU SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/imu/adis16460.c b/drivers/iio/imu/adis16460.c index eaa38dd6201f..ecf74046fde1 100644 --- a/drivers/iio/imu/adis16460.c +++ b/drivers/iio/imu/adis16460.c @@ -418,4 +418,4 @@ module_spi_driver(adis16460_driver);  MODULE_AUTHOR("Dragos Bogdan <dragos.bogdan@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16460 IMU driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c index 88efe728b61b..df8c6cd91169 100644 --- a/drivers/iio/imu/adis16475.c +++ b/drivers/iio/imu/adis16475.c @@ -2107,4 +2107,4 @@ module_spi_driver(adis16475_driver);  MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16475 IMU driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c index 294181f2fcb3..0a5d13d2240e 100644 --- a/drivers/iio/imu/adis16480.c +++ b/drivers/iio/imu/adis16480.c @@ -1794,4 +1794,4 @@ module_spi_driver(adis16480_driver);  MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");  MODULE_DESCRIPTION("Analog Devices ADIS16480 IMU driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/iio/imu/adis_buffer.c b/drivers/iio/imu/adis_buffer.c index b7c1cc04492a..fdfc0538734c 100644 --- a/drivers/iio/imu/adis_buffer.c +++ b/drivers/iio/imu/adis_buffer.c @@ -124,7 +124,7 @@ int adis_update_scan_mode(struct iio_dev *indio_dev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(adis_update_scan_mode, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(adis_update_scan_mode, "IIO_ADISLIB");  static int adis_paging_trigger_handler(struct adis *adis)  { @@ -222,4 +222,4 @@ devm_adis_setup_buffer_and_trigger_with_attrs(struct adis *adis, struct iio_dev  	return devm_add_action_or_reset(&adis->spi->dev, adis_buffer_cleanup,  					adis);  } -EXPORT_SYMBOL_NS_GPL(devm_adis_setup_buffer_and_trigger_with_attrs, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(devm_adis_setup_buffer_and_trigger_with_attrs, "IIO_ADISLIB"); diff --git a/drivers/iio/imu/adis_trigger.c b/drivers/iio/imu/adis_trigger.c index a8740b043cfe..d76e13cbac68 100644 --- a/drivers/iio/imu/adis_trigger.c +++ b/drivers/iio/imu/adis_trigger.c @@ -102,5 +102,5 @@ int devm_adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)  	return devm_iio_trigger_register(&adis->spi->dev, adis->trig);  } -EXPORT_SYMBOL_NS_GPL(devm_adis_probe_trigger, IIO_ADISLIB); +EXPORT_SYMBOL_NS_GPL(devm_adis_probe_trigger, "IIO_ADISLIB"); diff --git a/drivers/iio/imu/bmi160/bmi160_core.c b/drivers/iio/imu/bmi160/bmi160_core.c index 807c1a1476c2..0423ef6f9571 100644 --- a/drivers/iio/imu/bmi160/bmi160_core.c +++ b/drivers/iio/imu/bmi160/bmi160_core.c @@ -149,7 +149,7 @@ const struct regmap_config bmi160_regmap_config = {  	.reg_bits = 8,  	.val_bits = 8,  }; -EXPORT_SYMBOL_NS(bmi160_regmap_config, IIO_BMI160); +EXPORT_SYMBOL_NS(bmi160_regmap_config, "IIO_BMI160");  struct bmi160_regs {  	u8 data; /* LSB byte register for X-axis */ @@ -638,7 +638,7 @@ int bmi160_enable_irq(struct regmap *regmap, bool enable)  				     BMI160_DRDY_INT_EN, enable_bit,  				     BMI160_NORMAL_WRITE_USLEEP);  } -EXPORT_SYMBOL_NS(bmi160_enable_irq, IIO_BMI160); +EXPORT_SYMBOL_NS(bmi160_enable_irq, "IIO_BMI160");  static int bmi160_get_irq(struct fwnode_handle *fwnode, enum bmi160_int_pin *pin)  { @@ -888,7 +888,7 @@ int bmi160_core_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(bmi160_core_probe, IIO_BMI160); +EXPORT_SYMBOL_NS_GPL(bmi160_core_probe, "IIO_BMI160");  MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");  MODULE_DESCRIPTION("Bosch BMI160 driver"); diff --git a/drivers/iio/imu/bmi160/bmi160_i2c.c b/drivers/iio/imu/bmi160/bmi160_i2c.c index 3aa5d748f9b6..214503fa4af5 100644 --- a/drivers/iio/imu/bmi160/bmi160_i2c.c +++ b/drivers/iio/imu/bmi160/bmi160_i2c.c @@ -80,4 +80,4 @@ module_i2c_driver(bmi160_i2c_driver);  MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");  MODULE_DESCRIPTION("BMI160 I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BMI160); +MODULE_IMPORT_NS("IIO_BMI160"); diff --git a/drivers/iio/imu/bmi160/bmi160_spi.c b/drivers/iio/imu/bmi160/bmi160_spi.c index 9f40500132f7..8fbaab22db81 100644 --- a/drivers/iio/imu/bmi160/bmi160_spi.c +++ b/drivers/iio/imu/bmi160/bmi160_spi.c @@ -68,4 +68,4 @@ module_spi_driver(bmi160_spi_driver);  MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com");  MODULE_DESCRIPTION("Bosch BMI160 SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BMI160); +MODULE_IMPORT_NS("IIO_BMI160"); diff --git a/drivers/iio/imu/bmi270/bmi270_core.c b/drivers/iio/imu/bmi270/bmi270_core.c index 70db83a20239..7fec52e0b486 100644 --- a/drivers/iio/imu/bmi270/bmi270_core.c +++ b/drivers/iio/imu/bmi270/bmi270_core.c @@ -97,14 +97,14 @@ const struct bmi270_chip_info bmi260_chip_info = {  	.chip_id = BMI260_CHIP_ID_VAL,  	.fw_name = BMI260_INIT_DATA_FILE,  }; -EXPORT_SYMBOL_NS_GPL(bmi260_chip_info, IIO_BMI270); +EXPORT_SYMBOL_NS_GPL(bmi260_chip_info, "IIO_BMI270");  const struct bmi270_chip_info bmi270_chip_info = {  	.name = "bmi270",  	.chip_id = BMI270_CHIP_ID_VAL,  	.fw_name = BMI270_INIT_DATA_FILE,  }; -EXPORT_SYMBOL_NS_GPL(bmi270_chip_info, IIO_BMI270); +EXPORT_SYMBOL_NS_GPL(bmi270_chip_info, "IIO_BMI270");  enum bmi270_sensor_type {  	BMI270_ACCEL	= 0, @@ -727,7 +727,7 @@ int bmi270_core_probe(struct device *dev, struct regmap *regmap,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(bmi270_core_probe, IIO_BMI270); +EXPORT_SYMBOL_NS_GPL(bmi270_core_probe, "IIO_BMI270");  MODULE_AUTHOR("Alex Lanzano");  MODULE_DESCRIPTION("BMI270 driver"); diff --git a/drivers/iio/imu/bmi270/bmi270_i2c.c b/drivers/iio/imu/bmi270/bmi270_i2c.c index 6bd82e4362ab..44699ab58909 100644 --- a/drivers/iio/imu/bmi270/bmi270_i2c.c +++ b/drivers/iio/imu/bmi270/bmi270_i2c.c @@ -63,4 +63,4 @@ module_i2c_driver(bmi270_i2c_driver);  MODULE_AUTHOR("Alex Lanzano");  MODULE_DESCRIPTION("BMI270 driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMI270); +MODULE_IMPORT_NS("IIO_BMI270"); diff --git a/drivers/iio/imu/bmi270/bmi270_spi.c b/drivers/iio/imu/bmi270/bmi270_spi.c index 30b6d13a329c..88a77aba5e4f 100644 --- a/drivers/iio/imu/bmi270/bmi270_spi.c +++ b/drivers/iio/imu/bmi270/bmi270_spi.c @@ -89,4 +89,4 @@ module_spi_driver(bmi270_spi_driver);  MODULE_AUTHOR("Alex Lanzano");  MODULE_DESCRIPTION("BMI270 driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMI270); +MODULE_IMPORT_NS("IIO_BMI270"); diff --git a/drivers/iio/imu/bmi323/bmi323_core.c b/drivers/iio/imu/bmi323/bmi323_core.c index 161bb1d2e761..f7d7f4442e65 100644 --- a/drivers/iio/imu/bmi323/bmi323_core.c +++ b/drivers/iio/imu/bmi323/bmi323_core.c @@ -2164,7 +2164,7 @@ int bmi323_core_probe(struct device *dev)  	return bmi323_fifo_disable(data);  } -EXPORT_SYMBOL_NS_GPL(bmi323_core_probe, IIO_BMI323); +EXPORT_SYMBOL_NS_GPL(bmi323_core_probe, "IIO_BMI323");  static int bmi323_core_runtime_suspend(struct device *dev)  { @@ -2292,7 +2292,7 @@ const struct dev_pm_ops bmi323_core_pm_ops = {  	RUNTIME_PM_OPS(bmi323_core_runtime_suspend,  		       bmi323_core_runtime_resume, NULL)  }; -EXPORT_SYMBOL_NS_GPL(bmi323_core_pm_ops, IIO_BMI323); +EXPORT_SYMBOL_NS_GPL(bmi323_core_pm_ops, "IIO_BMI323");  MODULE_DESCRIPTION("Bosch BMI323 IMU driver");  MODULE_AUTHOR("Jagath Jog J <jagathjog1996@gmail.com>"); diff --git a/drivers/iio/imu/bmi323/bmi323_i2c.c b/drivers/iio/imu/bmi323/bmi323_i2c.c index 0ba5d69d8329..8457fe304db8 100644 --- a/drivers/iio/imu/bmi323/bmi323_i2c.c +++ b/drivers/iio/imu/bmi323/bmi323_i2c.c @@ -140,4 +140,4 @@ module_i2c_driver(bmi323_i2c_driver);  MODULE_DESCRIPTION("Bosch BMI323 IMU driver");  MODULE_AUTHOR("Jagath Jog J <jagathjog1996@gmail.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMI323); +MODULE_IMPORT_NS("IIO_BMI323"); diff --git a/drivers/iio/imu/bmi323/bmi323_spi.c b/drivers/iio/imu/bmi323/bmi323_spi.c index 9de3ade78d71..fd56ab620750 100644 --- a/drivers/iio/imu/bmi323/bmi323_spi.c +++ b/drivers/iio/imu/bmi323/bmi323_spi.c @@ -90,4 +90,4 @@ module_spi_driver(bmi323_spi_driver);  MODULE_DESCRIPTION("Bosch BMI323 IMU driver");  MODULE_AUTHOR("Jagath Jog J <jagathjog1996@gmail.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMI323); +MODULE_IMPORT_NS("IIO_BMI323"); diff --git a/drivers/iio/imu/bno055/bno055.c b/drivers/iio/imu/bno055/bno055.c index ea6519b22b2f..0728d38260a1 100644 --- a/drivers/iio/imu/bno055/bno055.c +++ b/drivers/iio/imu/bno055/bno055.c @@ -292,7 +292,7 @@ const struct regmap_config bno055_regmap_config = {  	.readable_reg = bno055_regmap_readable,  	.cache_type = REGCACHE_RBTREE,  }; -EXPORT_SYMBOL_NS_GPL(bno055_regmap_config, IIO_BNO055); +EXPORT_SYMBOL_NS_GPL(bno055_regmap_config, "IIO_BNO055");  /* must be called in configuration mode */  static int bno055_calibration_load(struct bno055_priv *priv, const u8 *data, int len) @@ -1678,7 +1678,7 @@ int bno055_probe(struct device *dev, struct regmap *regmap,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(bno055_probe, IIO_BNO055); +EXPORT_SYMBOL_NS_GPL(bno055_probe, "IIO_BNO055");  MODULE_AUTHOR("Andrea Merello <andrea.merello@iit.it>");  MODULE_DESCRIPTION("Bosch BNO055 driver"); diff --git a/drivers/iio/imu/bno055/bno055_i2c.c b/drivers/iio/imu/bno055/bno055_i2c.c index cf3dd62a83ba..f49d0905ee33 100644 --- a/drivers/iio/imu/bno055/bno055_i2c.c +++ b/drivers/iio/imu/bno055/bno055_i2c.c @@ -53,5 +53,5 @@ module_i2c_driver(bno055_driver);  MODULE_AUTHOR("Andrea Merello");  MODULE_DESCRIPTION("Bosch BNO055 I2C interface"); -MODULE_IMPORT_NS(IIO_BNO055); +MODULE_IMPORT_NS("IIO_BNO055");  MODULE_LICENSE("GPL"); diff --git a/drivers/iio/imu/bno055/bno055_ser_core.c b/drivers/iio/imu/bno055/bno055_ser_core.c index da7873bfd348..48669dabb37b 100644 --- a/drivers/iio/imu/bno055/bno055_ser_core.c +++ b/drivers/iio/imu/bno055/bno055_ser_core.c @@ -556,5 +556,5 @@ module_serdev_device_driver(bno055_ser_driver);  MODULE_AUTHOR("Andrea Merello <andrea.merello@iit.it>");  MODULE_DESCRIPTION("Bosch BNO055 serdev interface"); -MODULE_IMPORT_NS(IIO_BNO055); +MODULE_IMPORT_NS("IIO_BNO055");  MODULE_LICENSE("GPL"); diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600.h b/drivers/iio/imu/inv_icm42600/inv_icm42600.h index 3a07e43e4cf1..18787a43477b 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600.h +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600.h @@ -403,6 +403,7 @@ struct inv_icm42600_sensor_state {  typedef int (*inv_icm42600_bus_setup)(struct inv_icm42600_state *);  extern const struct regmap_config inv_icm42600_regmap_config; +extern const struct regmap_config inv_icm42600_spi_regmap_config;  extern const struct dev_pm_ops inv_icm42600_pm_ops;  const struct iio_mount_matrix * diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c index 93b5d7a3339c..ef9875d3b79d 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_core.c @@ -85,7 +85,22 @@ const struct regmap_config inv_icm42600_regmap_config = {  	.rd_noinc_table = inv_icm42600_regmap_rd_noinc_accesses,  	.cache_type = REGCACHE_RBTREE,  }; -EXPORT_SYMBOL_NS_GPL(inv_icm42600_regmap_config, IIO_ICM42600); +EXPORT_SYMBOL_NS_GPL(inv_icm42600_regmap_config, "IIO_ICM42600"); + +/* define specific regmap for SPI not supporting burst write */ +const struct regmap_config inv_icm42600_spi_regmap_config = { +	.name = "inv_icm42600", +	.reg_bits = 8, +	.val_bits = 8, +	.max_register = 0x4FFF, +	.ranges = inv_icm42600_regmap_ranges, +	.num_ranges = ARRAY_SIZE(inv_icm42600_regmap_ranges), +	.volatile_table = inv_icm42600_regmap_volatile_accesses, +	.rd_noinc_table = inv_icm42600_regmap_rd_noinc_accesses, +	.cache_type = REGCACHE_RBTREE, +	.use_single_write = true, +}; +EXPORT_SYMBOL_NS_GPL(inv_icm42600_spi_regmap_config, "IIO_ICM42600");  struct inv_icm42600_hw {  	uint8_t whoami; @@ -765,7 +780,7 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,  	return devm_add_action_or_reset(dev, inv_icm42600_disable_pm, dev);  } -EXPORT_SYMBOL_NS_GPL(inv_icm42600_core_probe, IIO_ICM42600); +EXPORT_SYMBOL_NS_GPL(inv_icm42600_core_probe, "IIO_ICM42600");  /*   * Suspend saves sensors state and turns everything off. @@ -814,6 +829,8 @@ out_unlock:  static int inv_icm42600_resume(struct device *dev)  {  	struct inv_icm42600_state *st = dev_get_drvdata(dev); +	struct inv_icm42600_sensor_state *gyro_st = iio_priv(st->indio_gyro); +	struct inv_icm42600_sensor_state *accel_st = iio_priv(st->indio_accel);  	int ret;  	mutex_lock(&st->lock); @@ -834,9 +851,12 @@ static int inv_icm42600_resume(struct device *dev)  		goto out_unlock;  	/* restore FIFO data streaming */ -	if (st->fifo.on) +	if (st->fifo.on) { +		inv_sensors_timestamp_reset(&gyro_st->ts); +		inv_sensors_timestamp_reset(&accel_st->ts);  		ret = regmap_write(st->map, INV_ICM42600_REG_FIFO_CONFIG,  				   INV_ICM42600_FIFO_CONFIG_STREAM); +	}  out_unlock:  	mutex_unlock(&st->lock); @@ -888,4 +908,4 @@ EXPORT_NS_GPL_DEV_PM_OPS(inv_icm42600_pm_ops, IIO_ICM42600) = {  MODULE_AUTHOR("InvenSense, Inc.");  MODULE_DESCRIPTION("InvenSense ICM-426xx device driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_INV_SENSORS_TIMESTAMP); +MODULE_IMPORT_NS("IIO_INV_SENSORS_TIMESTAMP"); diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c index 19563c58b4b1..04e440fe023a 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c @@ -128,4 +128,4 @@ module_i2c_driver(inv_icm42600_driver);  MODULE_AUTHOR("InvenSense, Inc.");  MODULE_DESCRIPTION("InvenSense ICM-426xx I2C driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ICM42600); +MODULE_IMPORT_NS("IIO_ICM42600"); diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c index 3b6d05fce65d..2bd2c4c8e50c 100644 --- a/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c +++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c @@ -59,7 +59,8 @@ static int inv_icm42600_probe(struct spi_device *spi)  		return -EINVAL;  	chip = (uintptr_t)match; -	regmap = devm_regmap_init_spi(spi, &inv_icm42600_regmap_config); +	/* use SPI specific regmap */ +	regmap = devm_regmap_init_spi(spi, &inv_icm42600_spi_regmap_config);  	if (IS_ERR(regmap))  		return PTR_ERR(regmap); @@ -124,4 +125,4 @@ module_spi_driver(inv_icm42600_driver);  MODULE_AUTHOR("InvenSense, Inc.");  MODULE_DESCRIPTION("InvenSense ICM-426xx SPI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_ICM42600); +MODULE_IMPORT_NS("IIO_ICM42600"); diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 40271352b02c..844b611b825a 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c @@ -2092,7 +2092,7 @@ error_power_off:  	inv_mpu6050_set_power_itg(st, false);  	return result;  } -EXPORT_SYMBOL_NS_GPL(inv_mpu_core_probe, IIO_MPU6050); +EXPORT_SYMBOL_NS_GPL(inv_mpu_core_probe, "IIO_MPU6050");  static int inv_mpu_resume(struct device *dev)  { @@ -2243,4 +2243,4 @@ EXPORT_NS_GPL_DEV_PM_OPS(inv_mpu_pmops, IIO_MPU6050) = {  MODULE_AUTHOR("Invensense Corporation");  MODULE_DESCRIPTION("Invensense device MPU6050 driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_INV_SENSORS_TIMESTAMP); +MODULE_IMPORT_NS("IIO_INV_SENSORS_TIMESTAMP"); diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c index 7a5926ba6b97..307a06f4df2e 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_i2c.c @@ -291,4 +291,4 @@ module_i2c_driver(inv_mpu_driver);  MODULE_AUTHOR("Invensense Corporation");  MODULE_DESCRIPTION("Invensense device MPU6050 driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_MPU6050); +MODULE_IMPORT_NS("IIO_MPU6050"); diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c index e6a291fcda95..ab415874d699 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_spi.c @@ -178,4 +178,4 @@ module_spi_driver(inv_mpu_driver);  MODULE_AUTHOR("Adriana Reus <adriana.reus@intel.com>");  MODULE_DESCRIPTION("Invensense device MPU6000 driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_MPU6050); +MODULE_IMPORT_NS("IIO_MPU6050"); diff --git a/drivers/iio/imu/kmx61.c b/drivers/iio/imu/kmx61.c index 324c38764656..e19c5d3137c6 100644 --- a/drivers/iio/imu/kmx61.c +++ b/drivers/iio/imu/kmx61.c @@ -1193,7 +1193,7 @@ static irqreturn_t kmx61_trigger_handler(int irq, void *p)  	struct kmx61_data *data = kmx61_get_data(indio_dev);  	int bit, ret, i = 0;  	u8 base; -	s16 buffer[8]; +	s16 buffer[8] = { };  	if (indio_dev == data->acc_indio_dev)  		base = KMX61_ACC_XOUT_L; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c index 509e0169dcd5..4fdcc2acc94e 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -2724,7 +2724,7 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,  	return 0;  } -EXPORT_SYMBOL_NS(st_lsm6dsx_probe, IIO_LSM6DSX); +EXPORT_SYMBOL_NS(st_lsm6dsx_probe, "IIO_LSM6DSX");  static int st_lsm6dsx_suspend(struct device *dev)  { diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c index cddf41cc0ca9..25e1de89b6e4 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i2c.c @@ -193,4 +193,4 @@ MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics st_lsm6dsx i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_LSM6DSX); +MODULE_IMPORT_NS("IIO_LSM6DSX"); diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i3c.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i3c.c index 3b0c8b19c448..6952d901316f 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i3c.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_i3c.c @@ -54,4 +54,4 @@ module_i3c_driver(st_lsm6dsx_driver);  MODULE_AUTHOR("Vitor Soares <vitor.soares@synopsys.com>");  MODULE_DESCRIPTION("STMicroelectronics st_lsm6dsx i3c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_LSM6DSX); +MODULE_IMPORT_NS("IIO_LSM6DSX"); diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c index c122c8831365..4b4b6d45524f 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_spi.c @@ -181,4 +181,4 @@ MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics st_lsm6dsx spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_LSM6DSX); +MODULE_IMPORT_NS("IIO_LSM6DSX"); diff --git a/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_core.c b/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_core.c index 10c1b2ba7a3d..8f4a67edb335 100644 --- a/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_core.c +++ b/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_core.c @@ -88,9 +88,9 @@ int st_lsm9ds0_probe(struct st_lsm9ds0 *lsm9ds0, struct regmap *regmap)  	/* Setup magnetometer device */  	return st_lsm9ds0_probe_magn(lsm9ds0, regmap);  } -EXPORT_SYMBOL_NS_GPL(st_lsm9ds0_probe, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS_GPL(st_lsm9ds0_probe, "IIO_ST_SENSORS");  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("STMicroelectronics LSM9DS0 IMU core driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_i2c.c b/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_i2c.c index d03cec3b24fe..0732cfa258c4 100644 --- a/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_i2c.c +++ b/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_i2c.c @@ -91,4 +91,4 @@ module_i2c_driver(st_lsm9ds0_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("STMicroelectronics LSM9DS0 IMU I2C driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_spi.c b/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_spi.c index 69e9135795a3..43ec57c1e604 100644 --- a/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_spi.c +++ b/drivers/iio/imu/st_lsm9ds0/st_lsm9ds0_spi.c @@ -83,4 +83,4 @@ module_spi_driver(st_lsm9ds0_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("STMicroelectronics LSM9DS0 IMU SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-backend.c index 529b1087d3fb..363281272035 100644 --- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c @@ -230,7 +230,7 @@ void iio_backend_debugfs_add(struct iio_backend *back,  		debugfs_create_file("name", 0400, back_d, back,  				    &iio_backend_debugfs_name_fops);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_debugfs_add, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_debugfs_add, "IIO_BACKEND");  /**   * iio_backend_debugfs_print_chan_status - Print channel status @@ -256,7 +256,7 @@ ssize_t iio_backend_debugfs_print_chan_status(struct iio_backend *back,  	return iio_backend_op_call(back, debugfs_print_chan_status, chan, buf,  				   len);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_debugfs_print_chan_status, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_debugfs_print_chan_status, "IIO_BACKEND");  /**   * iio_backend_chan_enable - Enable a backend channel @@ -270,7 +270,7 @@ int iio_backend_chan_enable(struct iio_backend *back, unsigned int chan)  {  	return iio_backend_op_call(back, chan_enable, chan);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_chan_enable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_chan_enable, "IIO_BACKEND");  /**   * iio_backend_chan_disable - Disable a backend channel @@ -284,7 +284,7 @@ int iio_backend_chan_disable(struct iio_backend *back, unsigned int chan)  {  	return iio_backend_op_call(back, chan_disable, chan);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_chan_disable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_chan_disable, "IIO_BACKEND");  static void __iio_backend_disable(void *back)  { @@ -299,7 +299,7 @@ void iio_backend_disable(struct iio_backend *back)  {  	__iio_backend_disable(back);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_disable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_disable, "IIO_BACKEND");  /**   * iio_backend_enable - Backend enable @@ -312,7 +312,7 @@ int iio_backend_enable(struct iio_backend *back)  {  	return iio_backend_op_call(back, enable);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_enable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_enable, "IIO_BACKEND");  /**   * devm_iio_backend_enable - Device managed backend enable @@ -332,7 +332,7 @@ int devm_iio_backend_enable(struct device *dev, struct iio_backend *back)  	return devm_add_action_or_reset(dev, __iio_backend_disable, back);  } -EXPORT_SYMBOL_NS_GPL(devm_iio_backend_enable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(devm_iio_backend_enable, "IIO_BACKEND");  /**   * iio_backend_data_format_set - Configure the channel data format @@ -354,7 +354,7 @@ int iio_backend_data_format_set(struct iio_backend *back, unsigned int chan,  	return iio_backend_op_call(back, data_format_set, chan, data);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_data_format_set, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_data_format_set, "IIO_BACKEND");  /**   * iio_backend_data_source_set - Select data source @@ -376,7 +376,7 @@ int iio_backend_data_source_set(struct iio_backend *back, unsigned int chan,  	return iio_backend_op_call(back, data_source_set, chan, data);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_data_source_set, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_data_source_set, "IIO_BACKEND");  /**   * iio_backend_set_sampling_freq - Set channel sampling rate @@ -392,7 +392,7 @@ int iio_backend_set_sampling_freq(struct iio_backend *back, unsigned int chan,  {  	return iio_backend_op_call(back, set_sample_rate, chan, sample_rate_hz);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_set_sampling_freq, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_set_sampling_freq, "IIO_BACKEND");  /**   * iio_backend_test_pattern_set - Configure a test pattern @@ -415,7 +415,7 @@ int iio_backend_test_pattern_set(struct iio_backend *back,  	return iio_backend_op_call(back, test_pattern_set, chan, pattern);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_test_pattern_set, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_test_pattern_set, "IIO_BACKEND");  /**   * iio_backend_chan_status - Get the channel status @@ -434,7 +434,7 @@ int iio_backend_chan_status(struct iio_backend *back, unsigned int chan,  {  	return iio_backend_op_call(back, chan_status, chan, error);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_chan_status, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_chan_status, "IIO_BACKEND");  /**   * iio_backend_iodelay_set - Set digital I/O delay @@ -457,7 +457,7 @@ int iio_backend_iodelay_set(struct iio_backend *back, unsigned int lane,  {  	return iio_backend_op_call(back, iodelay_set, lane, taps);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_iodelay_set, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_iodelay_set, "IIO_BACKEND");  /**   * iio_backend_data_sample_trigger - Control when to sample data @@ -478,7 +478,7 @@ int iio_backend_data_sample_trigger(struct iio_backend *back,  	return iio_backend_op_call(back, data_sample_trigger, trigger);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_data_sample_trigger, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_data_sample_trigger, "IIO_BACKEND");  static void iio_backend_free_buffer(void *arg)  { @@ -523,7 +523,7 @@ int devm_iio_backend_request_buffer(struct device *dev,  	return devm_add_action_or_reset(dev, iio_backend_free_buffer, pair);  } -EXPORT_SYMBOL_NS_GPL(devm_iio_backend_request_buffer, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(devm_iio_backend_request_buffer, "IIO_BACKEND");  /**   * iio_backend_read_raw - Read a channel attribute from a backend device. @@ -542,7 +542,7 @@ int iio_backend_read_raw(struct iio_backend *back,  {  	return iio_backend_op_call(back, read_raw, chan, val, val2, mask);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_read_raw, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_read_raw, "IIO_BACKEND");  static struct iio_backend *iio_backend_from_indio_dev_parent(const struct device *dev)  { @@ -604,7 +604,7 @@ ssize_t iio_backend_ext_info_get(struct iio_dev *indio_dev, uintptr_t private,  	return iio_backend_op_call(back, ext_info_get, private, chan, buf);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_ext_info_get, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_ext_info_get, "IIO_BACKEND");  /**   * iio_backend_ext_info_set - IIO ext_info write callback @@ -634,7 +634,7 @@ ssize_t iio_backend_ext_info_set(struct iio_dev *indio_dev, uintptr_t private,  	return iio_backend_op_call(back, ext_info_set, private, chan, buf, len);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_ext_info_set, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_ext_info_set, "IIO_BACKEND");  /**   * iio_backend_extend_chan_spec - Extend an IIO channel @@ -677,7 +677,7 @@ int iio_backend_extend_chan_spec(struct iio_backend *back,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_backend_extend_chan_spec, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_extend_chan_spec, "IIO_BACKEND");  static void iio_backend_release(void *arg)  { @@ -732,7 +732,7 @@ int iio_backend_ddr_enable(struct iio_backend *back)  {  	return iio_backend_op_call(back, ddr_enable);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, "IIO_BACKEND");  /**   * iio_backend_ddr_disable - Disable interface DDR (Double Data Rate) mode @@ -747,7 +747,7 @@ int iio_backend_ddr_disable(struct iio_backend *back)  {  	return iio_backend_op_call(back, ddr_disable);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, "IIO_BACKEND");  /**   * iio_backend_data_stream_enable - Enable data stream @@ -762,7 +762,7 @@ int iio_backend_data_stream_enable(struct iio_backend *back)  {  	return iio_backend_op_call(back, data_stream_enable);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_data_stream_enable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_data_stream_enable, "IIO_BACKEND");  /**   * iio_backend_data_stream_disable - Disable data stream @@ -777,7 +777,7 @@ int iio_backend_data_stream_disable(struct iio_backend *back)  {  	return iio_backend_op_call(back, data_stream_disable);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_data_stream_disable, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_data_stream_disable, "IIO_BACKEND");  /**   * iio_backend_data_transfer_addr - Set data address. @@ -794,7 +794,7 @@ int iio_backend_data_transfer_addr(struct iio_backend *back, u32 address)  {  	return iio_backend_op_call(back, data_transfer_addr, address);  } -EXPORT_SYMBOL_NS_GPL(iio_backend_data_transfer_addr, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_data_transfer_addr, "IIO_BACKEND");  static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, const char *name,  							 struct fwnode_handle *fwnode) @@ -853,7 +853,7 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)  {  	return __devm_iio_backend_fwnode_get(dev, name, dev_fwnode(dev));  } -EXPORT_SYMBOL_NS_GPL(devm_iio_backend_get, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(devm_iio_backend_get, "IIO_BACKEND");  /**   * devm_iio_backend_fwnode_get - Device managed backend firmware node get @@ -872,7 +872,7 @@ struct iio_backend *devm_iio_backend_fwnode_get(struct device *dev,  {  	return __devm_iio_backend_fwnode_get(dev, name, fwnode);  } -EXPORT_SYMBOL_NS_GPL(devm_iio_backend_fwnode_get, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(devm_iio_backend_fwnode_get, "IIO_BACKEND");  /**   * __devm_iio_backend_get_from_fwnode_lookup - Device managed fwnode backend device get @@ -907,7 +907,7 @@ __devm_iio_backend_get_from_fwnode_lookup(struct device *dev,  	return ERR_PTR(-EPROBE_DEFER);  } -EXPORT_SYMBOL_NS_GPL(__devm_iio_backend_get_from_fwnode_lookup, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(__devm_iio_backend_get_from_fwnode_lookup, "IIO_BACKEND");  /**   * iio_backend_get_priv - Get driver private data @@ -917,7 +917,7 @@ void *iio_backend_get_priv(const struct iio_backend *back)  {  	return back->priv;  } -EXPORT_SYMBOL_NS_GPL(iio_backend_get_priv, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(iio_backend_get_priv, "IIO_BACKEND");  static void iio_backend_unregister(void *arg)  { @@ -966,7 +966,7 @@ int devm_iio_backend_register(struct device *dev,  	return devm_add_action_or_reset(dev, iio_backend_unregister, back);  } -EXPORT_SYMBOL_NS_GPL(devm_iio_backend_register, IIO_BACKEND); +EXPORT_SYMBOL_NS_GPL(devm_iio_backend_register, "IIO_BACKEND");  MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");  MODULE_DESCRIPTION("Framework to handle complex IIO aggregate devices"); diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 8104696cd475..2708f87df719 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c @@ -36,7 +36,7 @@  #define DMABUF_ENQUEUE_TIMEOUT_MS 5000 -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  struct iio_dmabuf_priv {  	struct list_head entry; diff --git a/drivers/iio/industrialio-gts-helper.c b/drivers/iio/industrialio-gts-helper.c index 291c0fc332c9..3b5a99815062 100644 --- a/drivers/iio/industrialio-gts-helper.c +++ b/drivers/iio/industrialio-gts-helper.c @@ -134,7 +134,7 @@ int iio_gts_total_gain_to_scale(struct iio_gts *gts, int total_gain,  	return iio_gts_delinearize(tmp, NANO, scale_int, scale_nano);  } -EXPORT_SYMBOL_NS_GPL(iio_gts_total_gain_to_scale, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_total_gain_to_scale, "IIO_GTS_HELPER");  /**   * iio_gts_purge_avail_scale_table - free-up the available scale tables @@ -622,7 +622,7 @@ int devm_iio_init_iio_gts(struct device *dev, int max_scale_int, int max_scale_n  	return devm_iio_gts_build_avail_tables(dev, gts);  } -EXPORT_SYMBOL_NS_GPL(devm_iio_init_iio_gts, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(devm_iio_init_iio_gts, "IIO_GTS_HELPER");  /**   * iio_gts_all_avail_scales - helper for listing all available scales @@ -645,7 +645,7 @@ int iio_gts_all_avail_scales(struct iio_gts *gts, const int **vals, int *type,  	return IIO_AVAIL_LIST;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_all_avail_scales, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_all_avail_scales, "IIO_GTS_HELPER");  /**   * iio_gts_avail_scales_for_time - list scales for integration time @@ -679,7 +679,7 @@ int iio_gts_avail_scales_for_time(struct iio_gts *gts, int time,  	return IIO_AVAIL_LIST;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_avail_scales_for_time, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_avail_scales_for_time, "IIO_GTS_HELPER");  /**   * iio_gts_avail_times - helper for listing available integration times @@ -702,7 +702,7 @@ int iio_gts_avail_times(struct iio_gts *gts,  const int **vals, int *type,  	return IIO_AVAIL_LIST;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_avail_times, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_avail_times, "IIO_GTS_HELPER");  /**   * iio_gts_find_sel_by_gain - find selector corresponding to a HW-gain @@ -722,7 +722,7 @@ int iio_gts_find_sel_by_gain(struct iio_gts *gts, int gain)  	return -EINVAL;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_find_sel_by_gain, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_find_sel_by_gain, "IIO_GTS_HELPER");  /**   * iio_gts_find_gain_by_sel - find HW-gain corresponding to a selector @@ -742,7 +742,7 @@ int iio_gts_find_gain_by_sel(struct iio_gts *gts, int sel)  	return -EINVAL;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_find_gain_by_sel, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_find_gain_by_sel, "IIO_GTS_HELPER");  /**   * iio_gts_get_min_gain - find smallest valid HW-gain @@ -765,7 +765,7 @@ int iio_gts_get_min_gain(struct iio_gts *gts)  	return min;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_get_min_gain, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_get_min_gain, "IIO_GTS_HELPER");  /**   * iio_find_closest_gain_low - Find the closest lower matching gain @@ -826,7 +826,7 @@ int iio_find_closest_gain_low(struct iio_gts *gts, int gain, bool *in_range)  	return gts->hwgain_table[best].gain;  } -EXPORT_SYMBOL_NS_GPL(iio_find_closest_gain_low, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_find_closest_gain_low, "IIO_GTS_HELPER");  static int iio_gts_get_int_time_gain_multiplier_by_sel(struct iio_gts *gts,  						       int sel) @@ -913,7 +913,7 @@ int iio_gts_find_gain_sel_for_scale_using_time(struct iio_gts *gts, int time_sel  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_find_gain_sel_for_scale_using_time, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_find_gain_sel_for_scale_using_time, "IIO_GTS_HELPER");  static int iio_gts_get_total_gain(struct iio_gts *gts, int gain, int time)  { @@ -975,7 +975,7 @@ int iio_gts_get_scale(struct iio_gts *gts, int gain, int time, int *scale_int,  	return iio_gts_delinearize(lin_scale, NANO, scale_int, scale_nano);  } -EXPORT_SYMBOL_NS_GPL(iio_gts_get_scale, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_get_scale, "IIO_GTS_HELPER");  /**   * iio_gts_find_new_gain_sel_by_old_gain_time - compensate for time change @@ -1032,7 +1032,7 @@ int iio_gts_find_new_gain_sel_by_old_gain_time(struct iio_gts *gts,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_find_new_gain_sel_by_old_gain_time, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_find_new_gain_sel_by_old_gain_time, "IIO_GTS_HELPER");  /**   * iio_gts_find_new_gain_by_old_gain_time - compensate for time change @@ -1084,7 +1084,7 @@ int iio_gts_find_new_gain_by_old_gain_time(struct iio_gts *gts, int old_gain,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iio_gts_find_new_gain_by_old_gain_time, IIO_GTS_HELPER); +EXPORT_SYMBOL_NS_GPL(iio_gts_find_new_gain_by_old_gain_time, "IIO_GTS_HELPER");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Matti Vaittinen <mazziesaccount@gmail.com>"); diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 136b225b6bc8..9050a59129e6 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -500,7 +500,7 @@ struct iio_channel *iio_channel_get_all(struct device *dev)  	return_ptr(chans);  error_free_chans: -	for (i = 0; i < nummaps; i++) +	for (i = 0; i < mapind; i++)  		iio_device_put(chans[i].indio_dev);  	return ERR_PTR(ret);  } diff --git a/drivers/iio/light/apds9306.c b/drivers/iio/light/apds9306.c index 9c08e7c3ad0c..69a0d609cffc 100644 --- a/drivers/iio/light/apds9306.c +++ b/drivers/iio/light/apds9306.c @@ -1355,4 +1355,4 @@ module_i2c_driver(apds9306_driver);  MODULE_AUTHOR("Subhajit Ghosh <subhajit.ghosh@tweaklogic.com>");  MODULE_DESCRIPTION("APDS9306 Ambient Light Sensor driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_GTS_HELPER); +MODULE_IMPORT_NS("IIO_GTS_HELPER"); diff --git a/drivers/iio/light/bh1745.c b/drivers/iio/light/bh1745.c index 23e9f16090cc..63bf729df517 100644 --- a/drivers/iio/light/bh1745.c +++ b/drivers/iio/light/bh1745.c @@ -746,6 +746,8 @@ static irqreturn_t bh1745_trigger_handler(int interrupt, void *p)  	int i;  	int j = 0; +	memset(&scan, 0, sizeof(scan)); +  	iio_for_each_active_channel(indio_dev, i) {  		ret = regmap_bulk_read(data->regmap, BH1745_RED_LSB + 2 * i,  				       &value, 2); @@ -899,4 +901,4 @@ module_i2c_driver(bh1745_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Mudit Sharma <muditsharma.info@gmail.com>");  MODULE_DESCRIPTION("BH1745 colour sensor driver"); -MODULE_IMPORT_NS(IIO_GTS_HELPER); +MODULE_IMPORT_NS("IIO_GTS_HELPER"); diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c index 4eb692322432..aa4c72d4849e 100644 --- a/drivers/iio/light/hid-sensor-als.c +++ b/drivers/iio/light/hid-sensor-als.c @@ -474,4 +474,4 @@ module_platform_driver(hid_als_platform_driver);  MODULE_DESCRIPTION("HID Sensor ALS");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c index e8e7b2999b4c..c83acbd78275 100644 --- a/drivers/iio/light/hid-sensor-prox.c +++ b/drivers/iio/light/hid-sensor-prox.c @@ -372,4 +372,4 @@ module_platform_driver(hid_prox_platform_driver);  MODULE_DESCRIPTION("HID Sensor Proximity");  MODULE_AUTHOR("Archana Patni <archana.patni@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/light/rohm-bu27008.c b/drivers/iio/light/rohm-bu27008.c index 0f010eff1981..fa35dd32700c 100644 --- a/drivers/iio/light/rohm-bu27008.c +++ b/drivers/iio/light/rohm-bu27008.c @@ -1632,4 +1632,4 @@ module_i2c_driver(bu27008_i2c_driver);  MODULE_DESCRIPTION("ROHM BU27008 and BU27010 colour sensor driver");  MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_GTS_HELPER); +MODULE_IMPORT_NS("IIO_GTS_HELPER"); diff --git a/drivers/iio/light/rohm-bu27034.c b/drivers/iio/light/rohm-bu27034.c index 76711c3cdf7c..4f591c2278f2 100644 --- a/drivers/iio/light/rohm-bu27034.c +++ b/drivers/iio/light/rohm-bu27034.c @@ -1350,4 +1350,4 @@ module_i2c_driver(bu27034_i2c_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");  MODULE_DESCRIPTION("ROHM BU27034 ambient light sensor driver"); -MODULE_IMPORT_NS(IIO_GTS_HELPER); +MODULE_IMPORT_NS("IIO_GTS_HELPER"); diff --git a/drivers/iio/light/st_uvis25_core.c b/drivers/iio/light/st_uvis25_core.c index f1fc8cb6f69a..40a810000df0 100644 --- a/drivers/iio/light/st_uvis25_core.c +++ b/drivers/iio/light/st_uvis25_core.c @@ -322,7 +322,7 @@ int st_uvis25_probe(struct device *dev, int irq, struct regmap *regmap)  	return devm_iio_device_register(dev, iio_dev);  } -EXPORT_SYMBOL_NS(st_uvis25_probe, IIO_UVIS25); +EXPORT_SYMBOL_NS(st_uvis25_probe, "IIO_UVIS25");  static int st_uvis25_suspend(struct device *dev)  { diff --git a/drivers/iio/light/st_uvis25_i2c.c b/drivers/iio/light/st_uvis25_i2c.c index 6bc2ddfb77ca..f54282476d11 100644 --- a/drivers/iio/light/st_uvis25_i2c.c +++ b/drivers/iio/light/st_uvis25_i2c.c @@ -65,4 +65,4 @@ module_i2c_driver(st_uvis25_driver);  MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");  MODULE_DESCRIPTION("STMicroelectronics uvis25 i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_UVIS25); +MODULE_IMPORT_NS("IIO_UVIS25"); diff --git a/drivers/iio/light/st_uvis25_spi.c b/drivers/iio/light/st_uvis25_spi.c index 86a232320d7d..18edc6a5a4a4 100644 --- a/drivers/iio/light/st_uvis25_spi.c +++ b/drivers/iio/light/st_uvis25_spi.c @@ -66,4 +66,4 @@ module_spi_driver(st_uvis25_driver);  MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");  MODULE_DESCRIPTION("STMicroelectronics uvis25 spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_UVIS25); +MODULE_IMPORT_NS("IIO_UVIS25"); diff --git a/drivers/iio/light/vcnl4035.c b/drivers/iio/light/vcnl4035.c index 337a1332c2c6..67c94be02018 100644 --- a/drivers/iio/light/vcnl4035.c +++ b/drivers/iio/light/vcnl4035.c @@ -105,7 +105,7 @@ static irqreturn_t vcnl4035_trigger_consumer_handler(int irq, void *p)  	struct iio_dev *indio_dev = pf->indio_dev;  	struct vcnl4035_data *data = iio_priv(indio_dev);  	/* Ensure naturally aligned timestamp */ -	u8 buffer[ALIGN(sizeof(u16), sizeof(s64)) + sizeof(s64)]  __aligned(8); +	u8 buffer[ALIGN(sizeof(u16), sizeof(s64)) + sizeof(s64)]  __aligned(8) = { };  	int ret;  	ret = regmap_read(data->regmap, VCNL4035_ALS_DATA, (int *)buffer); diff --git a/drivers/iio/magnetometer/bmc150_magn.c b/drivers/iio/magnetometer/bmc150_magn.c index 7de18c4a0ccb..7f545740178e 100644 --- a/drivers/iio/magnetometer/bmc150_magn.c +++ b/drivers/iio/magnetometer/bmc150_magn.c @@ -225,7 +225,7 @@ const struct regmap_config bmc150_magn_regmap_config = {  	.writeable_reg = bmc150_magn_is_writeable_reg,  	.volatile_reg = bmc150_magn_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bmc150_magn_regmap_config, IIO_BMC150_MAGN); +EXPORT_SYMBOL_NS(bmc150_magn_regmap_config, "IIO_BMC150_MAGN");  static int bmc150_magn_set_power_mode(struct bmc150_magn_data *data,  				      enum bmc150_magn_power_modes mode, @@ -968,7 +968,7 @@ err_poweroff:  	bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND, true);  	return ret;  } -EXPORT_SYMBOL_NS(bmc150_magn_probe, IIO_BMC150_MAGN); +EXPORT_SYMBOL_NS(bmc150_magn_probe, "IIO_BMC150_MAGN");  void bmc150_magn_remove(struct device *dev)  { @@ -994,7 +994,7 @@ void bmc150_magn_remove(struct device *dev)  	regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators);  } -EXPORT_SYMBOL_NS(bmc150_magn_remove, IIO_BMC150_MAGN); +EXPORT_SYMBOL_NS(bmc150_magn_remove, "IIO_BMC150_MAGN");  #ifdef CONFIG_PM  static int bmc150_magn_runtime_suspend(struct device *dev) @@ -1062,7 +1062,7 @@ const struct dev_pm_ops bmc150_magn_pm_ops = {  	SET_RUNTIME_PM_OPS(bmc150_magn_runtime_suspend,  			   bmc150_magn_runtime_resume, NULL)  }; -EXPORT_SYMBOL_NS(bmc150_magn_pm_ops, IIO_BMC150_MAGN); +EXPORT_SYMBOL_NS(bmc150_magn_pm_ops, "IIO_BMC150_MAGN");  MODULE_AUTHOR("Irina Tirdea <irina.tirdea@intel.com>");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/iio/magnetometer/bmc150_magn_i2c.c b/drivers/iio/magnetometer/bmc150_magn_i2c.c index 17e10a462ac8..8cbeda924bda 100644 --- a/drivers/iio/magnetometer/bmc150_magn_i2c.c +++ b/drivers/iio/magnetometer/bmc150_magn_i2c.c @@ -70,4 +70,4 @@ module_i2c_driver(bmc150_magn_driver);  MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("BMC150 I2C magnetometer driver"); -MODULE_IMPORT_NS(IIO_BMC150_MAGN); +MODULE_IMPORT_NS("IIO_BMC150_MAGN"); diff --git a/drivers/iio/magnetometer/bmc150_magn_spi.c b/drivers/iio/magnetometer/bmc150_magn_spi.c index c850de1bc79b..2d4b8cba32f1 100644 --- a/drivers/iio/magnetometer/bmc150_magn_spi.c +++ b/drivers/iio/magnetometer/bmc150_magn_spi.c @@ -54,4 +54,4 @@ module_spi_driver(bmc150_magn_spi_driver);  MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com");  MODULE_DESCRIPTION("BMC150 magnetometer SPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BMC150_MAGN); +MODULE_IMPORT_NS("IIO_BMC150_MAGN"); diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c index 1d6fcbbae1c5..97ddaa2a03f6 100644 --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c @@ -581,4 +581,4 @@ module_platform_driver(hid_magn_3d_platform_driver);  MODULE_DESCRIPTION("HID Sensor Magnetometer 3D");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/magnetometer/hmc5843_core.c b/drivers/iio/magnetometer/hmc5843_core.c index c5521d61da29..2fc84310e2cc 100644 --- a/drivers/iio/magnetometer/hmc5843_core.c +++ b/drivers/iio/magnetometer/hmc5843_core.c @@ -669,7 +669,7 @@ buffer_setup_err:  	hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP);  	return ret;  } -EXPORT_SYMBOL_NS(hmc5843_common_probe, IIO_HMC5843); +EXPORT_SYMBOL_NS(hmc5843_common_probe, "IIO_HMC5843");  void hmc5843_common_remove(struct device *dev)  { @@ -681,7 +681,7 @@ void hmc5843_common_remove(struct device *dev)  	/*  sleep mode to save power */  	hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP);  } -EXPORT_SYMBOL_NS(hmc5843_common_remove, IIO_HMC5843); +EXPORT_SYMBOL_NS(hmc5843_common_remove, "IIO_HMC5843");  MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>");  MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 core driver"); diff --git a/drivers/iio/magnetometer/hmc5843_i2c.c b/drivers/iio/magnetometer/hmc5843_i2c.c index bdd2784a9f86..657a309e2bd5 100644 --- a/drivers/iio/magnetometer/hmc5843_i2c.c +++ b/drivers/iio/magnetometer/hmc5843_i2c.c @@ -103,4 +103,4 @@ module_i2c_driver(hmc5843_driver);  MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>");  MODULE_DESCRIPTION("HMC5843/5883/5883L/5983 i2c driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HMC5843); +MODULE_IMPORT_NS("IIO_HMC5843"); diff --git a/drivers/iio/magnetometer/hmc5843_spi.c b/drivers/iio/magnetometer/hmc5843_spi.c index c42d2e2a6a6c..b7fde331069d 100644 --- a/drivers/iio/magnetometer/hmc5843_spi.c +++ b/drivers/iio/magnetometer/hmc5843_spi.c @@ -100,4 +100,4 @@ module_spi_driver(hmc5843_driver);  MODULE_AUTHOR("Josef Gajdusek <atx@atx.name>");  MODULE_DESCRIPTION("HMC5983 SPI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HMC5843); +MODULE_IMPORT_NS("IIO_HMC5843"); diff --git a/drivers/iio/magnetometer/rm3100-core.c b/drivers/iio/magnetometer/rm3100-core.c index baab918b3825..c99694a77a14 100644 --- a/drivers/iio/magnetometer/rm3100-core.c +++ b/drivers/iio/magnetometer/rm3100-core.c @@ -100,7 +100,7 @@ const struct regmap_access_table rm3100_readable_table = {  	.yes_ranges = rm3100_readable_ranges,  	.n_yes_ranges = ARRAY_SIZE(rm3100_readable_ranges),  }; -EXPORT_SYMBOL_NS_GPL(rm3100_readable_table, IIO_RM3100); +EXPORT_SYMBOL_NS_GPL(rm3100_readable_table, "IIO_RM3100");  static const struct regmap_range rm3100_writable_ranges[] = {  	regmap_reg_range(RM3100_W_REG_START, RM3100_W_REG_END), @@ -110,7 +110,7 @@ const struct regmap_access_table rm3100_writable_table = {  	.yes_ranges = rm3100_writable_ranges,  	.n_yes_ranges = ARRAY_SIZE(rm3100_writable_ranges),  }; -EXPORT_SYMBOL_NS_GPL(rm3100_writable_table, IIO_RM3100); +EXPORT_SYMBOL_NS_GPL(rm3100_writable_table, "IIO_RM3100");  static const struct regmap_range rm3100_volatile_ranges[] = {  	regmap_reg_range(RM3100_V_REG_START, RM3100_V_REG_END), @@ -120,7 +120,7 @@ const struct regmap_access_table rm3100_volatile_table = {  	.yes_ranges = rm3100_volatile_ranges,  	.n_yes_ranges = ARRAY_SIZE(rm3100_volatile_ranges),  }; -EXPORT_SYMBOL_NS_GPL(rm3100_volatile_table, IIO_RM3100); +EXPORT_SYMBOL_NS_GPL(rm3100_volatile_table, "IIO_RM3100");  static irqreturn_t rm3100_thread_fn(int irq, void *d)  { @@ -604,7 +604,7 @@ int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq)  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(rm3100_common_probe, IIO_RM3100); +EXPORT_SYMBOL_NS_GPL(rm3100_common_probe, "IIO_RM3100");  MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>");  MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer i2c driver"); diff --git a/drivers/iio/magnetometer/rm3100-i2c.c b/drivers/iio/magnetometer/rm3100-i2c.c index ac7276b3798c..a09a271b62c5 100644 --- a/drivers/iio/magnetometer/rm3100-i2c.c +++ b/drivers/iio/magnetometer/rm3100-i2c.c @@ -52,4 +52,4 @@ module_i2c_driver(rm3100_driver);  MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>");  MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_RM3100); +MODULE_IMPORT_NS("IIO_RM3100"); diff --git a/drivers/iio/magnetometer/rm3100-spi.c b/drivers/iio/magnetometer/rm3100-spi.c index 76dc9b66cd3c..dd6d48043740 100644 --- a/drivers/iio/magnetometer/rm3100-spi.c +++ b/drivers/iio/magnetometer/rm3100-spi.c @@ -62,4 +62,4 @@ module_spi_driver(rm3100_driver);  MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>");  MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_RM3100); +MODULE_IMPORT_NS("IIO_RM3100"); diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c index 6cc0dfd31821..ef348d316c00 100644 --- a/drivers/iio/magnetometer/st_magn_core.c +++ b/drivers/iio/magnetometer/st_magn_core.c @@ -601,7 +601,7 @@ const struct st_sensor_settings *st_magn_get_settings(const char *name)  	return &st_magn_sensors_settings[index];  } -EXPORT_SYMBOL_NS(st_magn_get_settings, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_magn_get_settings, "IIO_ST_SENSORS");  int st_magn_common_probe(struct iio_dev *indio_dev)  { @@ -648,9 +648,9 @@ int st_magn_common_probe(struct iio_dev *indio_dev)  	return devm_iio_device_register(parent, indio_dev);  } -EXPORT_SYMBOL_NS(st_magn_common_probe, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_magn_common_probe, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics magnetometers driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/magnetometer/st_magn_i2c.c b/drivers/iio/magnetometer/st_magn_i2c.c index 950826dd20bf..1672b274768d 100644 --- a/drivers/iio/magnetometer/st_magn_i2c.c +++ b/drivers/iio/magnetometer/st_magn_i2c.c @@ -119,4 +119,4 @@ module_i2c_driver(st_magn_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics magnetometers i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/magnetometer/st_magn_spi.c b/drivers/iio/magnetometer/st_magn_spi.c index f203e1f87eec..fe4d0e63133c 100644 --- a/drivers/iio/magnetometer/st_magn_spi.c +++ b/drivers/iio/magnetometer/st_magn_spi.c @@ -111,4 +111,4 @@ module_spi_driver(st_magn_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics magnetometers spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/magnetometer/yamaha-yas530.c b/drivers/iio/magnetometer/yamaha-yas530.c index 65011a8598d3..c55a38650c0d 100644 --- a/drivers/iio/magnetometer/yamaha-yas530.c +++ b/drivers/iio/magnetometer/yamaha-yas530.c @@ -372,6 +372,7 @@ static int yas537_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y  	u8 data[8];  	u16 xy1y2[3];  	s32 h[3], s[3]; +	int half_range = BIT(13);  	int i, ret;  	mutex_lock(&yas5xx->lock); @@ -406,13 +407,13 @@ static int yas537_measure(struct yas5xx *yas5xx, u16 *t, u16 *x, u16 *y1, u16 *y  	/* The second version of YAS537 needs to include calibration coefficients */  	if (yas5xx->version == YAS537_VERSION_1) {  		for (i = 0; i < 3; i++) -			s[i] = xy1y2[i] - BIT(13); -		h[0] = (c->k *   (128 * s[0] + c->a2 * s[1] + c->a3 * s[2])) / BIT(13); -		h[1] = (c->k * (c->a4 * s[0] + c->a5 * s[1] + c->a6 * s[2])) / BIT(13); -		h[2] = (c->k * (c->a7 * s[0] + c->a8 * s[1] + c->a9 * s[2])) / BIT(13); +			s[i] = xy1y2[i] - half_range; +		h[0] = (c->k *   (128 * s[0] + c->a2 * s[1] + c->a3 * s[2])) / half_range; +		h[1] = (c->k * (c->a4 * s[0] + c->a5 * s[1] + c->a6 * s[2])) / half_range; +		h[2] = (c->k * (c->a7 * s[0] + c->a8 * s[1] + c->a9 * s[2])) / half_range;  		for (i = 0; i < 3; i++) { -			clamp_val(h[i], -BIT(13), BIT(13) - 1); -			xy1y2[i] = h[i] + BIT(13); +			h[i] = clamp(h[i], -half_range, half_range - 1); +			xy1y2[i] = h[i] + half_range;  		}  	} diff --git a/drivers/iio/orientation/hid-sensor-incl-3d.c b/drivers/iio/orientation/hid-sensor-incl-3d.c index c74b92d53d4d..429035b65c65 100644 --- a/drivers/iio/orientation/hid-sensor-incl-3d.c +++ b/drivers/iio/orientation/hid-sensor-incl-3d.c @@ -417,4 +417,4 @@ module_platform_driver(hid_incl_3d_platform_driver);  MODULE_DESCRIPTION("HID Sensor Inclinometer 3D");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/orientation/hid-sensor-rotation.c b/drivers/iio/orientation/hid-sensor-rotation.c index 343be43163e4..96f03988640c 100644 --- a/drivers/iio/orientation/hid-sensor-rotation.c +++ b/drivers/iio/orientation/hid-sensor-rotation.c @@ -369,4 +369,4 @@ module_platform_driver(hid_dev_rot_platform_driver);  MODULE_DESCRIPTION("HID Sensor Device Rotation");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/position/hid-sensor-custom-intel-hinge.c b/drivers/iio/position/hid-sensor-custom-intel-hinge.c index 3a6c7e50cc70..423bbb8a3b38 100644 --- a/drivers/iio/position/hid-sensor-custom-intel-hinge.c +++ b/drivers/iio/position/hid-sensor-custom-intel-hinge.c @@ -376,4 +376,4 @@ module_platform_driver(hid_hinge_platform_driver);  MODULE_DESCRIPTION("HID Sensor INTEL Hinge");  MODULE_AUTHOR("Ye Xiang <xiang.ye@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c index e5ec8137961f..5376605b69b4 100644 --- a/drivers/iio/pressure/bmp280-core.c +++ b/drivers/iio/pressure/bmp280-core.c @@ -1199,7 +1199,7 @@ const struct bmp280_chip_info bmp280_chip_info = {  	.trigger_handler = bmp280_trigger_handler,  }; -EXPORT_SYMBOL_NS(bmp280_chip_info, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp280_chip_info, "IIO_BMP280");  static int bme280_chip_config(struct bmp280_data *data)  { @@ -1382,7 +1382,7 @@ const struct bmp280_chip_info bme280_chip_info = {  	.trigger_handler = bme280_trigger_handler,  }; -EXPORT_SYMBOL_NS(bme280_chip_info, IIO_BMP280); +EXPORT_SYMBOL_NS(bme280_chip_info, "IIO_BMP280");  /*   * Helper function to send a command to BMP3XX sensors. @@ -1994,7 +1994,7 @@ const struct bmp280_chip_info bmp380_chip_info = {  	.trigger_probe = bmp380_trigger_probe,  	.trigger_handler = bmp380_trigger_handler,  }; -EXPORT_SYMBOL_NS(bmp380_chip_info, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp380_chip_info, "IIO_BMP280");  static int bmp580_soft_reset(struct bmp280_data *data)  { @@ -2685,7 +2685,7 @@ const struct bmp280_chip_info bmp580_chip_info = {  	.trigger_probe = bmp580_trigger_probe,  	.trigger_handler = bmp580_trigger_handler,  }; -EXPORT_SYMBOL_NS(bmp580_chip_info, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp580_chip_info, "IIO_BMP280");  static int bmp180_wait_for_eoc(struct bmp280_data *data, u8 ctrl_meas)  { @@ -3017,7 +3017,7 @@ const struct bmp280_chip_info bmp180_chip_info = {  	.trigger_handler = bmp180_trigger_handler,  }; -EXPORT_SYMBOL_NS(bmp180_chip_info, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp180_chip_info, "IIO_BMP280");  static irqreturn_t bmp085_eoc_irq(int irq, void *d)  { @@ -3096,7 +3096,7 @@ const struct bmp280_chip_info bmp085_chip_info = {  	.trigger_probe = bmp085_trigger_probe,  	.trigger_handler = bmp180_trigger_handler,  }; -EXPORT_SYMBOL_NS(bmp085_chip_info, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp085_chip_info, "IIO_BMP280");  static int bmp280_buffer_preenable(struct iio_dev *indio_dev)  { @@ -3297,7 +3297,7 @@ int bmp280_common_probe(struct device *dev,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS(bmp280_common_probe, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp280_common_probe, "IIO_BMP280");  static int bmp280_runtime_suspend(struct device *dev)  { diff --git a/drivers/iio/pressure/bmp280-i2c.c b/drivers/iio/pressure/bmp280-i2c.c index 2f7b25984c7b..868e1b2ec711 100644 --- a/drivers/iio/pressure/bmp280-i2c.c +++ b/drivers/iio/pressure/bmp280-i2c.c @@ -62,4 +62,4 @@ module_i2c_driver(bmp280_i2c_driver);  MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>");  MODULE_DESCRIPTION("Driver for Bosch Sensortec BMP180/BMP280 pressure and temperature sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_BMP280); +MODULE_IMPORT_NS("IIO_BMP280"); diff --git a/drivers/iio/pressure/bmp280-regmap.c b/drivers/iio/pressure/bmp280-regmap.c index d27d68edd906..b6a7b417c8cf 100644 --- a/drivers/iio/pressure/bmp280-regmap.c +++ b/drivers/iio/pressure/bmp280-regmap.c @@ -39,7 +39,7 @@ const struct regmap_config bmp180_regmap_config = {  	.writeable_reg = bmp180_is_writeable_reg,  	.volatile_reg = bmp180_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bmp180_regmap_config, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp180_regmap_config, "IIO_BMP280");  static bool bme280_is_writeable_reg(struct device *dev, unsigned int reg)  { @@ -200,7 +200,7 @@ const struct regmap_config bmp280_regmap_config = {  	.writeable_reg = bmp280_is_writeable_reg,  	.volatile_reg = bmp280_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bmp280_regmap_config, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp280_regmap_config, "IIO_BMP280");  const struct regmap_config bme280_regmap_config = {  	.reg_bits = 8, @@ -212,7 +212,7 @@ const struct regmap_config bme280_regmap_config = {  	.writeable_reg = bme280_is_writeable_reg,  	.volatile_reg = bme280_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bme280_regmap_config, IIO_BMP280); +EXPORT_SYMBOL_NS(bme280_regmap_config, "IIO_BMP280");  const struct regmap_config bmp380_regmap_config = {  	.reg_bits = 8, @@ -224,7 +224,7 @@ const struct regmap_config bmp380_regmap_config = {  	.writeable_reg = bmp380_is_writeable_reg,  	.volatile_reg = bmp380_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bmp380_regmap_config, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp380_regmap_config, "IIO_BMP280");  const struct regmap_config bmp580_regmap_config = {  	.reg_bits = 8, @@ -236,4 +236,4 @@ const struct regmap_config bmp580_regmap_config = {  	.writeable_reg = bmp580_is_writeable_reg,  	.volatile_reg = bmp580_is_volatile_reg,  }; -EXPORT_SYMBOL_NS(bmp580_regmap_config, IIO_BMP280); +EXPORT_SYMBOL_NS(bmp580_regmap_config, "IIO_BMP280"); diff --git a/drivers/iio/pressure/bmp280-spi.c b/drivers/iio/pressure/bmp280-spi.c index 49aa8c2cd85b..0e6e27892f99 100644 --- a/drivers/iio/pressure/bmp280-spi.c +++ b/drivers/iio/pressure/bmp280-spi.c @@ -150,4 +150,4 @@ module_spi_driver(bmp280_spi_driver);  MODULE_DESCRIPTION("BMP280 SPI bus driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_BMP280); +MODULE_IMPORT_NS("IIO_BMP280"); diff --git a/drivers/iio/pressure/hid-sensor-press.c b/drivers/iio/pressure/hid-sensor-press.c index dfc36430c467..f7273d30c5f0 100644 --- a/drivers/iio/pressure/hid-sensor-press.c +++ b/drivers/iio/pressure/hid-sensor-press.c @@ -357,4 +357,4 @@ module_platform_driver(hid_press_platform_driver);  MODULE_DESCRIPTION("HID Sensor Pressure");  MODULE_AUTHOR("Archana Patni <archana.patni@intel.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/pressure/hsc030pa.c b/drivers/iio/pressure/hsc030pa.c index 4e6f10eeabc3..168245818cfe 100644 --- a/drivers/iio/pressure/hsc030pa.c +++ b/drivers/iio/pressure/hsc030pa.c @@ -534,7 +534,7 @@ int hsc_common_probe(struct device *dev, hsc_recv_fn recv)  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS(hsc_common_probe, IIO_HONEYWELL_HSC030PA); +EXPORT_SYMBOL_NS(hsc_common_probe, "IIO_HONEYWELL_HSC030PA");  MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>");  MODULE_DESCRIPTION("Honeywell HSC and SSC pressure sensor core driver"); diff --git a/drivers/iio/pressure/hsc030pa_i2c.c b/drivers/iio/pressure/hsc030pa_i2c.c index b3fd230e71da..7f2398aa8155 100644 --- a/drivers/iio/pressure/hsc030pa_i2c.c +++ b/drivers/iio/pressure/hsc030pa_i2c.c @@ -71,4 +71,4 @@ module_i2c_driver(hsc_i2c_driver);  MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>");  MODULE_DESCRIPTION("Honeywell HSC and SSC pressure sensor i2c driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HONEYWELL_HSC030PA); +MODULE_IMPORT_NS("IIO_HONEYWELL_HSC030PA"); diff --git a/drivers/iio/pressure/hsc030pa_spi.c b/drivers/iio/pressure/hsc030pa_spi.c index 337eecc577d2..60768726e9ad 100644 --- a/drivers/iio/pressure/hsc030pa_spi.c +++ b/drivers/iio/pressure/hsc030pa_spi.c @@ -58,4 +58,4 @@ module_spi_driver(hsc_spi_driver);  MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>");  MODULE_DESCRIPTION("Honeywell HSC and SSC pressure sensor spi driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HONEYWELL_HSC030PA); +MODULE_IMPORT_NS("IIO_HONEYWELL_HSC030PA"); diff --git a/drivers/iio/pressure/mpl115.c b/drivers/iio/pressure/mpl115.c index 02ea38c8a3e4..71beb28b7f2c 100644 --- a/drivers/iio/pressure/mpl115.c +++ b/drivers/iio/pressure/mpl115.c @@ -225,7 +225,7 @@ int mpl115_probe(struct device *dev, const char *name,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(mpl115_probe, IIO_MPL115); +EXPORT_SYMBOL_NS_GPL(mpl115_probe, "IIO_MPL115");  static int mpl115_runtime_suspend(struct device *dev)  { diff --git a/drivers/iio/pressure/mpl115_i2c.c b/drivers/iio/pressure/mpl115_i2c.c index 0c51dc02478e..3db9ef4e2770 100644 --- a/drivers/iio/pressure/mpl115_i2c.c +++ b/drivers/iio/pressure/mpl115_i2c.c @@ -63,4 +63,4 @@ module_i2c_driver(mpl115_i2c_driver);  MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");  MODULE_DESCRIPTION("Freescale MPL115A2 pressure/temperature driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_MPL115); +MODULE_IMPORT_NS("IIO_MPL115"); diff --git a/drivers/iio/pressure/mpl115_spi.c b/drivers/iio/pressure/mpl115_spi.c index 58d218fd90dc..888cfa666238 100644 --- a/drivers/iio/pressure/mpl115_spi.c +++ b/drivers/iio/pressure/mpl115_spi.c @@ -102,4 +102,4 @@ module_spi_driver(mpl115_spi_driver);  MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");  MODULE_DESCRIPTION("Freescale MPL115A1 pressure/temperature driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_MPL115); +MODULE_IMPORT_NS("IIO_MPL115"); diff --git a/drivers/iio/pressure/mprls0025pa.c b/drivers/iio/pressure/mprls0025pa.c index 3b6145348c2e..2336f2760eae 100644 --- a/drivers/iio/pressure/mprls0025pa.c +++ b/drivers/iio/pressure/mprls0025pa.c @@ -448,7 +448,7 @@ int mpr_common_probe(struct device *dev, const struct mpr_ops *ops, int irq)  	return 0;  } -EXPORT_SYMBOL_NS(mpr_common_probe, IIO_HONEYWELL_MPRLS0025PA); +EXPORT_SYMBOL_NS(mpr_common_probe, "IIO_HONEYWELL_MPRLS0025PA");  MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");  MODULE_DESCRIPTION("Honeywell MPR pressure sensor core driver"); diff --git a/drivers/iio/pressure/mprls0025pa_i2c.c b/drivers/iio/pressure/mprls0025pa_i2c.c index 7a5c5aa2b456..48b23a4256ce 100644 --- a/drivers/iio/pressure/mprls0025pa_i2c.c +++ b/drivers/iio/pressure/mprls0025pa_i2c.c @@ -97,4 +97,4 @@ module_i2c_driver(mpr_i2c_driver);  MODULE_AUTHOR("Andreas Klinger <ak@it-klinger.de>");  MODULE_DESCRIPTION("Honeywell MPR pressure sensor i2c driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HONEYWELL_MPRLS0025PA); +MODULE_IMPORT_NS("IIO_HONEYWELL_MPRLS0025PA"); diff --git a/drivers/iio/pressure/mprls0025pa_spi.c b/drivers/iio/pressure/mprls0025pa_spi.c index 3aed14cd95c5..09f724c76d70 100644 --- a/drivers/iio/pressure/mprls0025pa_spi.c +++ b/drivers/iio/pressure/mprls0025pa_spi.c @@ -89,4 +89,4 @@ module_spi_driver(mpr_spi_driver);  MODULE_AUTHOR("Petre Rodan <petre.rodan@subdimension.ro>");  MODULE_DESCRIPTION("Honeywell MPR pressure sensor spi driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HONEYWELL_MPRLS0025PA); +MODULE_IMPORT_NS("IIO_HONEYWELL_MPRLS0025PA"); diff --git a/drivers/iio/pressure/ms5611_core.c b/drivers/iio/pressure/ms5611_core.c index 2fc706f9d8ae..056c8271c49d 100644 --- a/drivers/iio/pressure/ms5611_core.c +++ b/drivers/iio/pressure/ms5611_core.c @@ -449,7 +449,7 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev,  	return 0;  } -EXPORT_SYMBOL_NS(ms5611_probe, IIO_MS5611); +EXPORT_SYMBOL_NS(ms5611_probe, "IIO_MS5611");  MODULE_AUTHOR("Tomasz Duszynski <tduszyns@gmail.com>");  MODULE_DESCRIPTION("MS5611 core driver"); diff --git a/drivers/iio/pressure/ms5611_i2c.c b/drivers/iio/pressure/ms5611_i2c.c index 7e2cb8b6afa2..1c041b9085fb 100644 --- a/drivers/iio/pressure/ms5611_i2c.c +++ b/drivers/iio/pressure/ms5611_i2c.c @@ -132,4 +132,4 @@ module_i2c_driver(ms5611_driver);  MODULE_AUTHOR("Tomasz Duszynski <tduszyns@gmail.com>");  MODULE_DESCRIPTION("MS5611 i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MS5611); +MODULE_IMPORT_NS("IIO_MS5611"); diff --git a/drivers/iio/pressure/ms5611_spi.c b/drivers/iio/pressure/ms5611_spi.c index 87181963a3e3..b5a91e885793 100644 --- a/drivers/iio/pressure/ms5611_spi.c +++ b/drivers/iio/pressure/ms5611_spi.c @@ -134,4 +134,4 @@ module_spi_driver(ms5611_driver);  MODULE_AUTHOR("Tomasz Duszynski <tduszyns@gmail.com>");  MODULE_DESCRIPTION("MS5611 spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MS5611); +MODULE_IMPORT_NS("IIO_MS5611"); diff --git a/drivers/iio/pressure/ms5637.c b/drivers/iio/pressure/ms5637.c index ac30d76285d1..a1767a17fdce 100644 --- a/drivers/iio/pressure/ms5637.c +++ b/drivers/iio/pressure/ms5637.c @@ -248,4 +248,4 @@ MODULE_DESCRIPTION("Measurement-Specialties ms5637 temperature & pressure driver  MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>");  MODULE_AUTHOR("Ludovic Tancerel <ludovic.tancerel@maplehightech.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MEAS_SPEC_SENSORS); +MODULE_IMPORT_NS("IIO_MEAS_SPEC_SENSORS"); diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c index 597bf268ea51..b70d1cee82f3 100644 --- a/drivers/iio/pressure/st_pressure_core.c +++ b/drivers/iio/pressure/st_pressure_core.c @@ -738,7 +738,7 @@ const struct st_sensor_settings *st_press_get_settings(const char *name)  	return &st_press_sensors_settings[index];  } -EXPORT_SYMBOL_NS(st_press_get_settings, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_press_get_settings, "IIO_ST_SENSORS");  int st_press_common_probe(struct iio_dev *indio_dev)  { @@ -790,9 +790,9 @@ int st_press_common_probe(struct iio_dev *indio_dev)  	return devm_iio_device_register(parent, indio_dev);  } -EXPORT_SYMBOL_NS(st_press_common_probe, IIO_ST_SENSORS); +EXPORT_SYMBOL_NS(st_press_common_probe, "IIO_ST_SENSORS");  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics pressures driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/pressure/st_pressure_i2c.c b/drivers/iio/pressure/st_pressure_i2c.c index 389523d6ae32..b7b66ddc3a73 100644 --- a/drivers/iio/pressure/st_pressure_i2c.c +++ b/drivers/iio/pressure/st_pressure_i2c.c @@ -121,4 +121,4 @@ module_i2c_driver(st_press_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics pressures i2c driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/pressure/st_pressure_spi.c b/drivers/iio/pressure/st_pressure_spi.c index 25cca5ad7c55..1a4bd1a0f787 100644 --- a/drivers/iio/pressure/st_pressure_spi.c +++ b/drivers/iio/pressure/st_pressure_spi.c @@ -123,4 +123,4 @@ module_spi_driver(st_press_driver);  MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");  MODULE_DESCRIPTION("STMicroelectronics pressures spi driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ST_SENSORS); +MODULE_IMPORT_NS("IIO_ST_SENSORS"); diff --git a/drivers/iio/pressure/zpa2326.c b/drivers/iio/pressure/zpa2326.c index 950f8dee2b26..9db1c94dfc18 100644 --- a/drivers/iio/pressure/zpa2326.c +++ b/drivers/iio/pressure/zpa2326.c @@ -162,7 +162,7 @@ bool zpa2326_isreg_writeable(struct device *dev, unsigned int reg)  		return false;  	}  } -EXPORT_SYMBOL_NS_GPL(zpa2326_isreg_writeable, IIO_ZPA2326); +EXPORT_SYMBOL_NS_GPL(zpa2326_isreg_writeable, "IIO_ZPA2326");  bool zpa2326_isreg_readable(struct device *dev, unsigned int reg)  { @@ -191,7 +191,7 @@ bool zpa2326_isreg_readable(struct device *dev, unsigned int reg)  		return false;  	}  } -EXPORT_SYMBOL_NS_GPL(zpa2326_isreg_readable, IIO_ZPA2326); +EXPORT_SYMBOL_NS_GPL(zpa2326_isreg_readable, "IIO_ZPA2326");  bool zpa2326_isreg_precious(struct device *dev, unsigned int reg)  { @@ -204,7 +204,7 @@ bool zpa2326_isreg_precious(struct device *dev, unsigned int reg)  		return false;  	}  } -EXPORT_SYMBOL_NS_GPL(zpa2326_isreg_precious, IIO_ZPA2326); +EXPORT_SYMBOL_NS_GPL(zpa2326_isreg_precious, "IIO_ZPA2326");  /**   * zpa2326_enable_device() - Enable device, i.e. get out of low power mode. @@ -586,6 +586,8 @@ static int zpa2326_fill_sample_buffer(struct iio_dev               *indio_dev,  	}   sample;  	int err; +	memset(&sample, 0, sizeof(sample)); +  	if (test_bit(0, indio_dev->active_scan_mask)) {  		/* Get current pressure from hardware FIFO. */  		err = zpa2326_dequeue_pressure(indio_dev, &sample.pressure); @@ -649,7 +651,7 @@ const struct dev_pm_ops zpa2326_pm_ops = {  	SET_RUNTIME_PM_OPS(zpa2326_runtime_suspend, zpa2326_runtime_resume,  			   NULL)  }; -EXPORT_SYMBOL_NS_GPL(zpa2326_pm_ops, IIO_ZPA2326); +EXPORT_SYMBOL_NS_GPL(zpa2326_pm_ops, "IIO_ZPA2326");  /**   * zpa2326_resume() - Request the PM layer to power supply the device. @@ -1698,7 +1700,7 @@ poweroff:  	return err;  } -EXPORT_SYMBOL_NS_GPL(zpa2326_probe, IIO_ZPA2326); +EXPORT_SYMBOL_NS_GPL(zpa2326_probe, "IIO_ZPA2326");  void zpa2326_remove(const struct device *parent)  { @@ -1709,7 +1711,7 @@ void zpa2326_remove(const struct device *parent)  	zpa2326_sleep(indio_dev);  	zpa2326_power_off(indio_dev, iio_priv(indio_dev));  } -EXPORT_SYMBOL_NS_GPL(zpa2326_remove, IIO_ZPA2326); +EXPORT_SYMBOL_NS_GPL(zpa2326_remove, "IIO_ZPA2326");  MODULE_AUTHOR("Gregor Boirie <gregor.boirie@parrot.com>");  MODULE_DESCRIPTION("Core driver for Murata ZPA2326 pressure sensor"); diff --git a/drivers/iio/pressure/zpa2326_i2c.c b/drivers/iio/pressure/zpa2326_i2c.c index 4833e525c393..49a239ebdabf 100644 --- a/drivers/iio/pressure/zpa2326_i2c.c +++ b/drivers/iio/pressure/zpa2326_i2c.c @@ -85,4 +85,4 @@ module_i2c_driver(zpa2326_i2c_driver);  MODULE_AUTHOR("Gregor Boirie <gregor.boirie@parrot.com>");  MODULE_DESCRIPTION("I2C driver for Murata ZPA2326 pressure sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ZPA2326); +MODULE_IMPORT_NS("IIO_ZPA2326"); diff --git a/drivers/iio/pressure/zpa2326_spi.c b/drivers/iio/pressure/zpa2326_spi.c index 9c1bcb82d360..317270fa1c43 100644 --- a/drivers/iio/pressure/zpa2326_spi.c +++ b/drivers/iio/pressure/zpa2326_spi.c @@ -89,4 +89,4 @@ module_spi_driver(zpa2326_spi_driver);  MODULE_AUTHOR("Gregor Boirie <gregor.boirie@parrot.com>");  MODULE_DESCRIPTION("SPI driver for Murata ZPA2326 pressure sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_ZPA2326); +MODULE_IMPORT_NS("IIO_ZPA2326"); diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c index 427c9343d6d1..0d7f0518d4fb 100644 --- a/drivers/iio/proximity/sx9310.c +++ b/drivers/iio/proximity/sx9310.c @@ -1029,4 +1029,4 @@ MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>");  MODULE_AUTHOR("Daniel Campello <campello@chromium.org>");  MODULE_DESCRIPTION("Driver for Semtech SX9310/SX9311 proximity sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SEMTECH_PROX); +MODULE_IMPORT_NS("SEMTECH_PROX"); diff --git a/drivers/iio/proximity/sx9324.c b/drivers/iio/proximity/sx9324.c index 40747d7f6e7e..f7819dd2775c 100644 --- a/drivers/iio/proximity/sx9324.c +++ b/drivers/iio/proximity/sx9324.c @@ -1155,4 +1155,4 @@ module_i2c_driver(sx9324_driver);  MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>");  MODULE_DESCRIPTION("Driver for Semtech SX9324 proximity sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SEMTECH_PROX); +MODULE_IMPORT_NS("SEMTECH_PROX"); diff --git a/drivers/iio/proximity/sx9360.c b/drivers/iio/proximity/sx9360.c index 07551e0decbd..a6ff16e33c1e 100644 --- a/drivers/iio/proximity/sx9360.c +++ b/drivers/iio/proximity/sx9360.c @@ -865,4 +865,4 @@ module_i2c_driver(sx9360_driver);  MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>");  MODULE_DESCRIPTION("Driver for Semtech SX9360 proximity sensor");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SEMTECH_PROX); +MODULE_IMPORT_NS("SEMTECH_PROX"); diff --git a/drivers/iio/proximity/sx_common.c b/drivers/iio/proximity/sx_common.c index 76384c74fe01..f70198a1f0d1 100644 --- a/drivers/iio/proximity/sx_common.c +++ b/drivers/iio/proximity/sx_common.c @@ -53,7 +53,7 @@ const struct iio_event_spec sx_common_events[3] = {  				 BIT(IIO_EV_INFO_VALUE),  	},  }; -EXPORT_SYMBOL_NS_GPL(sx_common_events, SEMTECH_PROX); +EXPORT_SYMBOL_NS_GPL(sx_common_events, "SEMTECH_PROX");  static irqreturn_t sx_common_irq_handler(int irq, void *private)  { @@ -233,7 +233,7 @@ out:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(sx_common_read_proximity, SEMTECH_PROX); +EXPORT_SYMBOL_NS_GPL(sx_common_read_proximity, "SEMTECH_PROX");  /**   * sx_common_read_event_config() - Configure event setting. @@ -253,7 +253,7 @@ int sx_common_read_event_config(struct iio_dev *indio_dev,  	return !!(data->chan_event & BIT(chan->channel));  } -EXPORT_SYMBOL_NS_GPL(sx_common_read_event_config, SEMTECH_PROX); +EXPORT_SYMBOL_NS_GPL(sx_common_read_event_config, "SEMTECH_PROX");  /**   * sx_common_write_event_config() - Configure event setting. @@ -303,7 +303,7 @@ out_unlock:  	mutex_unlock(&data->mutex);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(sx_common_write_event_config, SEMTECH_PROX); +EXPORT_SYMBOL_NS_GPL(sx_common_write_event_config, "SEMTECH_PROX");  static int sx_common_set_trigger_state(struct iio_trigger *trig, bool state)  { @@ -542,7 +542,7 @@ int sx_common_probe(struct i2c_client *client,  	return devm_iio_device_register(dev, indio_dev);  } -EXPORT_SYMBOL_NS_GPL(sx_common_probe, SEMTECH_PROX); +EXPORT_SYMBOL_NS_GPL(sx_common_probe, "SEMTECH_PROX");  MODULE_AUTHOR("Gwendal Grignou <gwendal@chromium.org>");  MODULE_DESCRIPTION("Common functions and structures for Semtech sensor"); diff --git a/drivers/iio/temperature/hid-sensor-temperature.c b/drivers/iio/temperature/hid-sensor-temperature.c index 0e21217472ab..692520e1c497 100644 --- a/drivers/iio/temperature/hid-sensor-temperature.c +++ b/drivers/iio/temperature/hid-sensor-temperature.c @@ -290,4 +290,4 @@ module_platform_driver(hid_temperature_platform_driver);  MODULE_DESCRIPTION("HID Environmental temperature sensor");  MODULE_AUTHOR("Song Hongyan <hongyan.song@intel.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/iio/temperature/tmp006.c b/drivers/iio/temperature/tmp006.c index 0c844137d7aa..02b27f471baa 100644 --- a/drivers/iio/temperature/tmp006.c +++ b/drivers/iio/temperature/tmp006.c @@ -252,6 +252,8 @@ static irqreturn_t tmp006_trigger_handler(int irq, void *p)  	} scan;  	s32 ret; +	memset(&scan, 0, sizeof(scan)); +  	ret = i2c_smbus_read_word_data(data->client, TMP006_VOBJECT);  	if (ret < 0)  		goto err; diff --git a/drivers/iio/temperature/tsys01.c b/drivers/iio/temperature/tsys01.c index 9213761c5d18..cfaa16f46a3f 100644 --- a/drivers/iio/temperature/tsys01.c +++ b/drivers/iio/temperature/tsys01.c @@ -232,4 +232,4 @@ MODULE_DESCRIPTION("Measurement-Specialties tsys01 temperature driver");  MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>");  MODULE_AUTHOR("Ludovic Tancerel <ludovic.tancerel@maplehightech.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MEAS_SPEC_SENSORS); +MODULE_IMPORT_NS("IIO_MEAS_SPEC_SENSORS"); diff --git a/drivers/iio/temperature/tsys02d.c b/drivers/iio/temperature/tsys02d.c index 2b4959d6e467..ef34b3c58f26 100644 --- a/drivers/iio/temperature/tsys02d.c +++ b/drivers/iio/temperature/tsys02d.c @@ -187,4 +187,4 @@ MODULE_DESCRIPTION("Measurement-Specialties tsys02d temperature driver");  MODULE_AUTHOR("William Markezana <william.markezana@meas-spec.com>");  MODULE_AUTHOR("Ludovic Tancerel <ludovic.tancerel@maplehightech.com>");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_MEAS_SPEC_SENSORS); +MODULE_IMPORT_NS("IIO_MEAS_SPEC_SENSORS"); diff --git a/drivers/iio/test/Kconfig b/drivers/iio/test/Kconfig index 33cca49c8058..7a181cac3cc9 100644 --- a/drivers/iio/test/Kconfig +++ b/drivers/iio/test/Kconfig @@ -5,7 +5,7 @@  # Keep in alphabetical order  config IIO_GTS_KUNIT_TEST -	tristate "Test IIO formatting functions" if !KUNIT_ALL_TESTS +	tristate "Test IIO gain-time-scale helpers" if !KUNIT_ALL_TESTS  	depends on KUNIT  	select IIO_GTS_HELPER  	select TEST_KUNIT_DEVICE_HELPERS diff --git a/drivers/iio/test/iio-test-gts.c b/drivers/iio/test/iio-test-gts.c index 5f16a7b5e6d4..1eceec9d477f 100644 --- a/drivers/iio/test/iio-test-gts.c +++ b/drivers/iio/test/iio-test-gts.c @@ -512,4 +512,4 @@ kunit_test_suite(iio_gts_test_suite);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Matti Vaittinen <mazziesaccount@gmail.com>");  MODULE_DESCRIPTION("Test IIO light sensor gain-time-scale helpers"); -MODULE_IMPORT_NS(IIO_GTS_HELPER); +MODULE_IMPORT_NS("IIO_GTS_HELPER"); diff --git a/drivers/iio/test/iio-test-rescale.c b/drivers/iio/test/iio-test-rescale.c index 31ee55a6faed..bbc6a2e1c2c1 100644 --- a/drivers/iio/test/iio-test-rescale.c +++ b/drivers/iio/test/iio-test-rescale.c @@ -652,6 +652,8 @@ static void iio_rescale_test_scale(struct kunit *test)  	int rel_ppm;  	int ret; +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buff); +  	rescale.numerator = t->numerator;  	rescale.denominator = t->denominator;  	rescale.offset = t->offset; @@ -681,6 +683,8 @@ static void iio_rescale_test_offset(struct kunit *test)  	int values[2];  	int ret; +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buff_off); +  	rescale.numerator = t->numerator;  	rescale.denominator = t->denominator;  	rescale.offset = t->offset; @@ -712,4 +716,4 @@ kunit_test_suite(iio_rescale_test_suite);  MODULE_AUTHOR("Liam Beguin <liambeguin@gmail.com>");  MODULE_DESCRIPTION("Test IIO rescale conversion functions");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(IIO_RESCALE); +MODULE_IMPORT_NS("IIO_RESCALE"); diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 64ace0b968f0..91db10515d74 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -690,6 +690,7 @@ cma_validate_port(struct ib_device *device, u32 port,  	int bound_if_index = dev_addr->bound_dev_if;  	int dev_type = dev_addr->dev_type;  	struct net_device *ndev = NULL; +	struct net_device *pdev = NULL;  	if (!rdma_dev_access_netns(device, id_priv->id.route.addr.dev_addr.net))  		goto out; @@ -714,6 +715,21 @@ cma_validate_port(struct ib_device *device, u32 port,  		rcu_read_lock();  		ndev = rcu_dereference(sgid_attr->ndev); +		if (ndev->ifindex != bound_if_index) { +			pdev = dev_get_by_index_rcu(dev_addr->net, bound_if_index); +			if (pdev) { +				if (is_vlan_dev(pdev)) { +					pdev = vlan_dev_real_dev(pdev); +					if (ndev->ifindex == pdev->ifindex) +						bound_if_index = pdev->ifindex; +				} +				if (is_vlan_dev(ndev)) { +					pdev = vlan_dev_real_dev(ndev); +					if (bound_if_index == pdev->ifindex) +						bound_if_index = ndev->ifindex; +				} +			} +		}  		if (!net_eq(dev_net(ndev), dev_addr->net) ||  		    ndev->ifindex != bound_if_index) {  			rdma_put_gid_attr(sgid_attr); diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c index ff121e59b9c0..cb987ab0177c 100644 --- a/drivers/infiniband/core/nldev.c +++ b/drivers/infiniband/core/nldev.c @@ -2833,8 +2833,8 @@ int rdma_nl_notify_event(struct ib_device *device, u32 port_num,  			  enum rdma_nl_notify_event_type type)  {  	struct sk_buff *skb; +	int ret = -EMSGSIZE;  	struct net *net; -	int ret = 0;  	void *nlh;  	net = read_pnet(&device->coredev.rdma_net); diff --git a/drivers/infiniband/core/umem_dmabuf.c b/drivers/infiniband/core/umem_dmabuf.c index 9fcd37761264..0ec2e4120cc9 100644 --- a/drivers/infiniband/core/umem_dmabuf.c +++ b/drivers/infiniband/core/umem_dmabuf.c @@ -10,7 +10,7 @@  #include "uverbs.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  int ib_umem_dmabuf_map_pages(struct ib_umem_dmabuf *umem_dmabuf)  { diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 66b02fbf077a..5ad14c39d48c 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -161,7 +161,7 @@ static const void __user *uverbs_request_next_ptr(struct uverbs_req_iter *iter,  {  	const void __user *res = iter->cur; -	if (iter->cur + len > iter->end) +	if (len > iter->end - iter->cur)  		return (void __force __user *)ERR_PTR(-ENOSPC);  	iter->cur += len;  	return res; @@ -2008,11 +2008,13 @@ static int ib_uverbs_post_send(struct uverbs_attr_bundle *attrs)  	ret = uverbs_request_start(attrs, &iter, &cmd, sizeof(cmd));  	if (ret)  		return ret; -	wqes = uverbs_request_next_ptr(&iter, cmd.wqe_size * cmd.wr_count); +	wqes = uverbs_request_next_ptr(&iter, size_mul(cmd.wqe_size, +						       cmd.wr_count));  	if (IS_ERR(wqes))  		return PTR_ERR(wqes); -	sgls = uverbs_request_next_ptr( -		&iter, cmd.sge_count * sizeof(struct ib_uverbs_sge)); +	sgls = uverbs_request_next_ptr(&iter, +				       size_mul(cmd.sge_count, +						sizeof(struct ib_uverbs_sge)));  	if (IS_ERR(sgls))  		return PTR_ERR(sgls);  	ret = uverbs_request_finish(&iter); @@ -2198,11 +2200,11 @@ ib_uverbs_unmarshall_recv(struct uverbs_req_iter *iter, u32 wr_count,  	if (wqe_size < sizeof(struct ib_uverbs_recv_wr))  		return ERR_PTR(-EINVAL); -	wqes = uverbs_request_next_ptr(iter, wqe_size * wr_count); +	wqes = uverbs_request_next_ptr(iter, size_mul(wqe_size, wr_count));  	if (IS_ERR(wqes))  		return ERR_CAST(wqes); -	sgls = uverbs_request_next_ptr( -		iter, sge_count * sizeof(struct ib_uverbs_sge)); +	sgls = uverbs_request_next_ptr(iter, size_mul(sge_count, +						      sizeof(struct ib_uverbs_sge)));  	if (IS_ERR(sgls))  		return ERR_CAST(sgls);  	ret = uverbs_request_finish(iter); diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c index 82023394e330..e3d26bd6de05 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c @@ -199,7 +199,7 @@ int bnxt_re_query_device(struct ib_device *ibdev,  	ib_attr->vendor_id = rdev->en_dev->pdev->vendor;  	ib_attr->vendor_part_id = rdev->en_dev->pdev->device; -	ib_attr->hw_ver = rdev->en_dev->pdev->subsystem_device; +	ib_attr->hw_ver = rdev->en_dev->pdev->revision;  	ib_attr->max_qp = dev_attr->max_qp;  	ib_attr->max_qp_wr = dev_attr->max_qp_wqes;  	ib_attr->device_cap_flags = @@ -967,13 +967,13 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)  	unsigned int flags;  	int rc; +	bnxt_re_debug_rem_qpinfo(rdev, qp); +  	bnxt_qplib_flush_cqn_wq(&qp->qplib_qp);  	rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp); -	if (rc) { +	if (rc)  		ibdev_err(&rdev->ibdev, "Failed to destroy HW QP"); -		return rc; -	}  	if (rdma_is_kernel_res(&qp->ib_qp.res)) {  		flags = bnxt_re_lock_cqs(qp); @@ -983,11 +983,8 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)  	bnxt_qplib_free_qp_res(&rdev->qplib_res, &qp->qplib_qp); -	if (ib_qp->qp_type == IB_QPT_GSI && rdev->gsi_ctx.gsi_sqp) { -		rc = bnxt_re_destroy_gsi_sqp(qp); -		if (rc) -			return rc; -	} +	if (ib_qp->qp_type == IB_QPT_GSI && rdev->gsi_ctx.gsi_sqp) +		bnxt_re_destroy_gsi_sqp(qp);  	mutex_lock(&rdev->qp_lock);  	list_del(&qp->list); @@ -998,8 +995,6 @@ int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)  	else if (qp->qplib_qp.type == CMDQ_CREATE_QP_TYPE_UD)  		atomic_dec(&rdev->stats.res.ud_qp_count); -	bnxt_re_debug_rem_qpinfo(rdev, qp); -  	ib_umem_release(qp->rumem);  	ib_umem_release(qp->sumem); @@ -2167,18 +2162,20 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,  		}  	} -	if (qp_attr_mask & IB_QP_PATH_MTU) { -		qp->qplib_qp.modify_flags |= -				CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU; -		qp->qplib_qp.path_mtu = __from_ib_mtu(qp_attr->path_mtu); -		qp->qplib_qp.mtu = ib_mtu_enum_to_int(qp_attr->path_mtu); -	} else if (qp_attr->qp_state == IB_QPS_RTR) { -		qp->qplib_qp.modify_flags |= -			CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU; -		qp->qplib_qp.path_mtu = -			__from_ib_mtu(iboe_get_mtu(rdev->netdev->mtu)); -		qp->qplib_qp.mtu = -			ib_mtu_enum_to_int(iboe_get_mtu(rdev->netdev->mtu)); +	if (qp_attr->qp_state == IB_QPS_RTR) { +		enum ib_mtu qpmtu; + +		qpmtu = iboe_get_mtu(rdev->netdev->mtu); +		if (qp_attr_mask & IB_QP_PATH_MTU) { +			if (ib_mtu_enum_to_int(qp_attr->path_mtu) > +			    ib_mtu_enum_to_int(qpmtu)) +				return -EINVAL; +			qpmtu = qp_attr->path_mtu; +		} + +		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU; +		qp->qplib_qp.path_mtu = __from_ib_mtu(qpmtu); +		qp->qplib_qp.mtu = ib_mtu_enum_to_int(qpmtu);  	}  	if (qp_attr_mask & IB_QP_TIMEOUT) { @@ -2328,6 +2325,7 @@ int bnxt_re_query_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,  	qp_attr->retry_cnt = qplib_qp->retry_cnt;  	qp_attr->rnr_retry = qplib_qp->rnr_retry;  	qp_attr->min_rnr_timer = qplib_qp->min_rnr_timer; +	qp_attr->port_num = __to_ib_port_num(qplib_qp->port_id);  	qp_attr->rq_psn = qplib_qp->rq.psn;  	qp_attr->max_rd_atomic = qplib_qp->max_rd_atomic;  	qp_attr->sq_psn = qplib_qp->sq.psn; @@ -2824,7 +2822,8 @@ bad:  		wr = wr->next;  	}  	bnxt_qplib_post_send_db(&qp->qplib_qp); -	bnxt_ud_qp_hw_stall_workaround(qp); +	if (!bnxt_qplib_is_chip_gen_p5_p7(qp->rdev->chip_ctx)) +		bnxt_ud_qp_hw_stall_workaround(qp);  	spin_unlock_irqrestore(&qp->sq_lock, flags);  	return rc;  } @@ -2936,7 +2935,8 @@ bad:  		wr = wr->next;  	}  	bnxt_qplib_post_send_db(&qp->qplib_qp); -	bnxt_ud_qp_hw_stall_workaround(qp); +	if (!bnxt_qplib_is_chip_gen_p5_p7(qp->rdev->chip_ctx)) +		bnxt_ud_qp_hw_stall_workaround(qp);  	spin_unlock_irqrestore(&qp->sq_lock, flags);  	return rc; diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h index ac59f1d73b15..fbb16a411d6a 100644 --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h @@ -268,6 +268,10 @@ void bnxt_re_dealloc_ucontext(struct ib_ucontext *context);  int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);  void bnxt_re_mmap_free(struct rdma_user_mmap_entry *rdma_entry); +static inline u32 __to_ib_port_num(u16 port_id) +{ +	return (u32)port_id + 1; +}  unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp);  void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp, unsigned long flags); diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c index b7af0d5ff3b6..c143f273b759 100644 --- a/drivers/infiniband/hw/bnxt_re/main.c +++ b/drivers/infiniband/hw/bnxt_re/main.c @@ -1715,11 +1715,8 @@ static bool bnxt_re_is_qp1_or_shadow_qp(struct bnxt_re_dev *rdev,  static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev)  { -	int mask = IB_QP_STATE; -	struct ib_qp_attr qp_attr;  	struct bnxt_re_qp *qp; -	qp_attr.qp_state = IB_QPS_ERR;  	mutex_lock(&rdev->qp_lock);  	list_for_each_entry(qp, &rdev->qp_list, list) {  		/* Modify the state of all QPs except QP1/Shadow QP */ @@ -1727,12 +1724,9 @@ static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev)  			if (qp->qplib_qp.state !=  			    CMDQ_MODIFY_QP_NEW_STATE_RESET &&  			    qp->qplib_qp.state != -			    CMDQ_MODIFY_QP_NEW_STATE_ERR) { +			    CMDQ_MODIFY_QP_NEW_STATE_ERR)  				bnxt_re_dispatch_event(&rdev->ibdev, &qp->ib_qp,  						       1, IB_EVENT_QP_FATAL); -				bnxt_re_modify_qp(&qp->ib_qp, &qp_attr, mask, -						  NULL); -			}  		}  	}  	mutex_unlock(&rdev->qp_lock); diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c index e42abf5be6c0..5336f74297f8 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c @@ -659,13 +659,6 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,  	rc = bnxt_qplib_alloc_init_hwq(&srq->hwq, &hwq_attr);  	if (rc)  		return rc; - -	srq->swq = kcalloc(srq->hwq.max_elements, sizeof(*srq->swq), -			   GFP_KERNEL); -	if (!srq->swq) { -		rc = -ENOMEM; -		goto fail; -	}  	srq->dbinfo.flags = 0;  	bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req,  				 CMDQ_BASE_OPCODE_CREATE_SRQ, @@ -694,9 +687,17 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,  	spin_lock_init(&srq->lock);  	srq->start_idx = 0;  	srq->last_idx = srq->hwq.max_elements - 1; -	for (idx = 0; idx < srq->hwq.max_elements; idx++) -		srq->swq[idx].next_idx = idx + 1; -	srq->swq[srq->last_idx].next_idx = -1; +	if (!srq->hwq.is_user) { +		srq->swq = kcalloc(srq->hwq.max_elements, sizeof(*srq->swq), +				   GFP_KERNEL); +		if (!srq->swq) { +			rc = -ENOMEM; +			goto fail; +		} +		for (idx = 0; idx < srq->hwq.max_elements; idx++) +			srq->swq[idx].next_idx = idx + 1; +		srq->swq[srq->last_idx].next_idx = -1; +	}  	srq->id = le32_to_cpu(resp.xid);  	srq->dbinfo.hwq = &srq->hwq; @@ -1000,9 +1001,7 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  	u32 tbl_indx;  	u16 nsge; -	if (res->dattr) -		qp->is_host_msn_tbl = _is_host_msn_table(res->dattr->dev_cap_flags2); - +	qp->is_host_msn_tbl = _is_host_msn_table(res->dattr->dev_cap_flags2);  	sq->dbinfo.flags = 0;  	bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req,  				 CMDQ_BASE_OPCODE_CREATE_QP, @@ -1034,7 +1033,12 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  				    : 0;  	/* Update msn tbl size */  	if (qp->is_host_msn_tbl && psn_sz) { -		hwq_attr.aux_depth = roundup_pow_of_two(bnxt_qplib_set_sq_size(sq, qp->wqe_mode)); +		if (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) +			hwq_attr.aux_depth = +				roundup_pow_of_two(bnxt_qplib_set_sq_size(sq, qp->wqe_mode)); +		else +			hwq_attr.aux_depth = +				roundup_pow_of_two(bnxt_qplib_set_sq_size(sq, qp->wqe_mode)) / 2;  		qp->msn_tbl_sz = hwq_attr.aux_depth;  		qp->msn = 0;  	} @@ -1044,13 +1048,14 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  	if (rc)  		return rc; -	rc = bnxt_qplib_alloc_init_swq(sq); -	if (rc) -		goto fail_sq; - -	if (psn_sz) -		bnxt_qplib_init_psn_ptr(qp, psn_sz); +	if (!sq->hwq.is_user) { +		rc = bnxt_qplib_alloc_init_swq(sq); +		if (rc) +			goto fail_sq; +		if (psn_sz) +			bnxt_qplib_init_psn_ptr(qp, psn_sz); +	}  	req.sq_size = cpu_to_le32(bnxt_qplib_set_sq_size(sq, qp->wqe_mode));  	pbl = &sq->hwq.pbl[PBL_LVL_0];  	req.sq_pbl = cpu_to_le64(pbl->pg_map_arr[0]); @@ -1076,9 +1081,11 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  		rc = bnxt_qplib_alloc_init_hwq(&rq->hwq, &hwq_attr);  		if (rc)  			goto sq_swq; -		rc = bnxt_qplib_alloc_init_swq(rq); -		if (rc) -			goto fail_rq; +		if (!rq->hwq.is_user) { +			rc = bnxt_qplib_alloc_init_swq(rq); +			if (rc) +				goto fail_rq; +		}  		req.rq_size = cpu_to_le32(rq->max_wqe);  		pbl = &rq->hwq.pbl[PBL_LVL_0]; @@ -1174,9 +1181,11 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  		rq->dbinfo.db = qp->dpi->dbr;  		rq->dbinfo.max_slot = bnxt_qplib_set_rq_max_slot(rq->wqe_size);  	} +	spin_lock_bh(&rcfw->tbl_lock);  	tbl_indx = map_qp_id_to_tbl_indx(qp->id, rcfw);  	rcfw->qp_tbl[tbl_indx].qp_id = qp->id;  	rcfw->qp_tbl[tbl_indx].qp_handle = (void *)qp; +	spin_unlock_bh(&rcfw->tbl_lock);  	return 0;  fail: @@ -1283,7 +1292,8 @@ static void __filter_modify_flags(struct bnxt_qplib_qp *qp)  	}  } -static void bnxt_set_mandatory_attributes(struct bnxt_qplib_qp *qp, +static void bnxt_set_mandatory_attributes(struct bnxt_qplib_res *res, +					  struct bnxt_qplib_qp *qp,  					  struct cmdq_modify_qp *req)  {  	u32 mandatory_flags = 0; @@ -1298,6 +1308,14 @@ static void bnxt_set_mandatory_attributes(struct bnxt_qplib_qp *qp,  		mandatory_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_PKEY;  	} +	if (_is_min_rnr_in_rtr_rts_mandatory(res->dattr->dev_cap_flags2) && +	    (qp->cur_qp_state == CMDQ_MODIFY_QP_NEW_STATE_RTR && +	     qp->state == CMDQ_MODIFY_QP_NEW_STATE_RTS)) { +		if (qp->type == CMDQ_MODIFY_QP_QP_TYPE_RC) +			mandatory_flags |= +				CMDQ_MODIFY_QP_MODIFY_MASK_MIN_RNR_TIMER; +	} +  	if (qp->type == CMDQ_MODIFY_QP_QP_TYPE_UD ||  	    qp->type == CMDQ_MODIFY_QP_QP_TYPE_GSI)  		mandatory_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_QKEY; @@ -1338,7 +1356,7 @@ int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  		/* Set mandatory attributes for INIT -> RTR and RTR -> RTS transition */  		if (_is_optimize_modify_qp_supported(res->dattr->dev_cap_flags2) &&  		    is_optimized_state_transition(qp)) -			bnxt_set_mandatory_attributes(qp, &req); +			bnxt_set_mandatory_attributes(res, qp, &req);  	}  	bmask = qp->modify_flags;  	req.modify_mask = cpu_to_le32(qp->modify_flags); @@ -1521,6 +1539,7 @@ int bnxt_qplib_query_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)  	qp->dest_qpn = le32_to_cpu(sb->dest_qp_id);  	memcpy(qp->smac, sb->src_mac, 6);  	qp->vlan_id = le16_to_cpu(sb->vlan_pcp_vlan_dei_vlan_id); +	qp->port_id = le16_to_cpu(sb->port_id);  bail:  	dma_free_coherent(&rcfw->pdev->dev, sbuf.size,  			  sbuf.sb, sbuf.dma_addr); @@ -2667,10 +2686,12 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq,  			bnxt_qplib_add_flush_qp(qp);  		} else {  			/* Before we complete, do WA 9060 */ -			if (do_wa9060(qp, cq, cq_cons, sq->swq_last, -				      cqe_sq_cons)) { -				*lib_qp = qp; -				goto out; +			if (!bnxt_qplib_is_chip_gen_p5_p7(qp->cctx)) { +				if (do_wa9060(qp, cq, cq_cons, sq->swq_last, +					      cqe_sq_cons)) { +					*lib_qp = qp; +					goto out; +				}  			}  			if (swq->flags & SQ_SEND_FLAGS_SIGNAL_COMP) {  				cqe->status = CQ_REQ_STATUS_OK; diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h index ef3424c81345..0660101b5310 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h @@ -114,7 +114,6 @@ struct bnxt_qplib_sge {  	u32				size;  }; -#define BNXT_QPLIB_QP_MAX_SGL	6  struct bnxt_qplib_swq {  	u64				wr_id;  	int				next_idx; @@ -154,7 +153,7 @@ struct bnxt_qplib_swqe {  #define BNXT_QPLIB_SWQE_FLAGS_UC_FENCE			BIT(2)  #define BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT		BIT(3)  #define BNXT_QPLIB_SWQE_FLAGS_INLINE			BIT(4) -	struct bnxt_qplib_sge		sg_list[BNXT_QPLIB_QP_MAX_SGL]; +	struct bnxt_qplib_sge		sg_list[BNXT_VAR_MAX_SGE];  	int				num_sge;  	/* Max inline data is 96 bytes */  	u32				inline_len; @@ -299,6 +298,7 @@ struct bnxt_qplib_qp {  	u32				dest_qpn;  	u8				smac[6];  	u16				vlan_id; +	u16				port_id;  	u8				nw_type;  	struct bnxt_qplib_ah		ah; diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c index 5e90ea232de8..17e62f22683b 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c @@ -424,7 +424,8 @@ static int __send_message_basic_sanity(struct bnxt_qplib_rcfw *rcfw,  	/* Prevent posting if f/w is not in a state to process */  	if (test_bit(ERR_DEVICE_DETACHED, &rcfw->cmdq.flags)) -		return bnxt_qplib_map_rc(opcode); +		return -ENXIO; +  	if (test_bit(FIRMWARE_STALL_DETECTED, &cmdq->flags))  		return -ETIMEDOUT; @@ -493,7 +494,7 @@ static int __bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,  	rc = __send_message_basic_sanity(rcfw, msg, opcode);  	if (rc) -		return rc; +		return rc == -ENXIO ? bnxt_qplib_map_rc(opcode) : rc;  	rc = __send_message(rcfw, msg, opcode);  	if (rc) diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h index 21fb148713a6..cbfc49a1a56d 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_res.h +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h @@ -584,6 +584,11 @@ static inline bool _is_optimize_modify_qp_supported(u16 dev_cap_ext_flags2)  	return dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_OPTIMIZE_MODIFY_QP_SUPPORTED;  } +static inline bool _is_min_rnr_in_rtr_rts_mandatory(u16 dev_cap_ext_flags2) +{ +	return !!(dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_MIN_RNR_RTR_RTS_OPT_SUPPORTED); +} +  static inline bool _is_cq_coalescing_supported(u16 dev_cap_ext_flags2)  {  	return dev_cap_ext_flags2 & CREQ_QUERY_FUNC_RESP_SB_CQ_COALESCING_SUPPORTED; diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c index 7e20ae3d2c4f..9df3e3271577 100644 --- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c +++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c @@ -129,12 +129,18 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,  	attr->max_qp_init_rd_atom =  		sb->max_qp_init_rd_atom > BNXT_QPLIB_MAX_OUT_RD_ATOM ?  		BNXT_QPLIB_MAX_OUT_RD_ATOM : sb->max_qp_init_rd_atom; -	attr->max_qp_wqes = le16_to_cpu(sb->max_qp_wr); -	/* -	 * 128 WQEs needs to be reserved for the HW (8916). Prevent -	 * reporting the max number -	 */ -	attr->max_qp_wqes -= BNXT_QPLIB_RESERVED_QP_WRS + 1; +	attr->max_qp_wqes = le16_to_cpu(sb->max_qp_wr) - 1; +	if (!bnxt_qplib_is_chip_gen_p5_p7(rcfw->res->cctx)) { +		/* +		 * 128 WQEs needs to be reserved for the HW (8916). Prevent +		 * reporting the max number on legacy devices +		 */ +		attr->max_qp_wqes -= BNXT_QPLIB_RESERVED_QP_WRS + 1; +	} + +	/* Adjust for max_qp_wqes for variable wqe */ +	if (cctx->modes.wqe_mode == BNXT_QPLIB_WQE_MODE_VARIABLE) +		attr->max_qp_wqes = BNXT_VAR_MAX_WQE - 1;  	attr->max_qp_sges = cctx->modes.wqe_mode == BNXT_QPLIB_WQE_MODE_VARIABLE ?  			    min_t(u32, sb->max_sge_var_wqe, BNXT_VAR_MAX_SGE) : 6; diff --git a/drivers/infiniband/hw/bnxt_re/roce_hsi.h b/drivers/infiniband/hw/bnxt_re/roce_hsi.h index a98fc9c2313e..0ee60fdc18b3 100644 --- a/drivers/infiniband/hw/bnxt_re/roce_hsi.h +++ b/drivers/infiniband/hw/bnxt_re/roce_hsi.h @@ -2215,6 +2215,7 @@ struct creq_query_func_resp_sb {  	#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE   (0x2UL << 4)  	#define CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_LAST	\  			CREQ_QUERY_FUNC_RESP_SB_REQ_RETRANSMISSION_SUPPORT_IQM_MSN_TABLE +	#define CREQ_QUERY_FUNC_RESP_SB_MIN_RNR_RTR_RTS_OPT_SUPPORTED            0x1000UL  	__le16	max_xp_qp_size;  	__le16	create_qp_batch_size;  	__le16	destroy_qp_batch_size; diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c index f84521be3bea..605562122ecc 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hem.c +++ b/drivers/infiniband/hw/hns/hns_roce_hem.c @@ -931,6 +931,7 @@ struct hns_roce_hem_item {  	size_t count; /* max ba numbers */  	int start; /* start buf offset in this hem */  	int end; /* end buf offset in this hem */ +	bool exist_bt;  };  /* All HEM items are linked in a tree structure */ @@ -959,6 +960,7 @@ hem_list_alloc_item(struct hns_roce_dev *hr_dev, int start, int end, int count,  		}  	} +	hem->exist_bt = exist_bt;  	hem->count = count;  	hem->start = start;  	hem->end = end; @@ -969,22 +971,22 @@ hem_list_alloc_item(struct hns_roce_dev *hr_dev, int start, int end, int count,  }  static void hem_list_free_item(struct hns_roce_dev *hr_dev, -			       struct hns_roce_hem_item *hem, bool exist_bt) +			       struct hns_roce_hem_item *hem)  { -	if (exist_bt) +	if (hem->exist_bt)  		dma_free_coherent(hr_dev->dev, hem->count * BA_BYTE_LEN,  				  hem->addr, hem->dma_addr);  	kfree(hem);  }  static void hem_list_free_all(struct hns_roce_dev *hr_dev, -			      struct list_head *head, bool exist_bt) +			      struct list_head *head)  {  	struct hns_roce_hem_item *hem, *temp_hem;  	list_for_each_entry_safe(hem, temp_hem, head, list) {  		list_del(&hem->list); -		hem_list_free_item(hr_dev, hem, exist_bt); +		hem_list_free_item(hr_dev, hem);  	}  } @@ -1084,6 +1086,10 @@ int hns_roce_hem_list_calc_root_ba(const struct hns_roce_buf_region *regions,  	for (i = 0; i < region_cnt; i++) {  		r = (struct hns_roce_buf_region *)®ions[i]; +		/* when r->hopnum = 0, the region should not occupy root_ba. */ +		if (!r->hopnum) +			continue; +  		if (r->hopnum > 1) {  			step = hem_list_calc_ba_range(r->hopnum, 1, unit);  			if (step > 0) @@ -1177,7 +1183,7 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,  err_exit:  	for (level = 1; level < hopnum; level++) -		hem_list_free_all(hr_dev, &temp_list[level], true); +		hem_list_free_all(hr_dev, &temp_list[level]);  	return ret;  } @@ -1218,16 +1224,26 @@ static int alloc_fake_root_bt(struct hns_roce_dev *hr_dev, void *cpu_base,  {  	struct hns_roce_hem_item *hem; +	/* This is on the has_mtt branch, if r->hopnum +	 * is 0, there is no root_ba to reuse for the +	 * region's fake hem, so a dma_alloc request is +	 * necessary here. +	 */  	hem = hem_list_alloc_item(hr_dev, r->offset, r->offset + r->count - 1, -				  r->count, false); +				  r->count, !r->hopnum);  	if (!hem)  		return -ENOMEM; -	hem_list_assign_bt(hem, cpu_base, phy_base); +	/* The root_ba can be reused only when r->hopnum > 0. */ +	if (r->hopnum) +		hem_list_assign_bt(hem, cpu_base, phy_base);  	list_add(&hem->list, branch_head);  	list_add(&hem->sibling, leaf_head); -	return r->count; +	/* If r->hopnum == 0, 0 is returned, +	 * so that the root_bt entry is not occupied. +	 */ +	return r->hopnum ? r->count : 0;  }  static int setup_middle_bt(struct hns_roce_dev *hr_dev, void *cpu_base, @@ -1271,7 +1287,7 @@ setup_root_hem(struct hns_roce_dev *hr_dev, struct hns_roce_hem_list *hem_list,  		return -ENOMEM;  	total = 0; -	for (i = 0; i < region_cnt && total < max_ba_num; i++) { +	for (i = 0; i < region_cnt && total <= max_ba_num; i++) {  		r = ®ions[i];  		if (!r->count)  			continue; @@ -1337,9 +1353,9 @@ static int hem_list_alloc_root_bt(struct hns_roce_dev *hr_dev,  			     region_cnt);  	if (ret) {  		for (i = 0; i < region_cnt; i++) -			hem_list_free_all(hr_dev, &head.branch[i], false); +			hem_list_free_all(hr_dev, &head.branch[i]); -		hem_list_free_all(hr_dev, &head.root, true); +		hem_list_free_all(hr_dev, &head.root);  	}  	return ret; @@ -1402,10 +1418,9 @@ void hns_roce_hem_list_release(struct hns_roce_dev *hr_dev,  	for (i = 0; i < HNS_ROCE_MAX_BT_REGION; i++)  		for (j = 0; j < HNS_ROCE_MAX_BT_LEVEL; j++) -			hem_list_free_all(hr_dev, &hem_list->mid_bt[i][j], -					  j != 0); +			hem_list_free_all(hr_dev, &hem_list->mid_bt[i][j]); -	hem_list_free_all(hr_dev, &hem_list->root_bt, true); +	hem_list_free_all(hr_dev, &hem_list->root_bt);  	INIT_LIST_HEAD(&hem_list->btm_bt);  	hem_list->root_ba = 0;  } diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 697b17cca02e..0144e7210d05 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -468,7 +468,7 @@ static inline int set_ud_wqe(struct hns_roce_qp *qp,  	valid_num_sge = calc_wr_sge_num(wr, &msg_len);  	ret = set_ud_opcode(ud_sq_wqe, wr); -	if (WARN_ON(ret)) +	if (WARN_ON_ONCE(ret))  		return ret;  	ud_sq_wqe->msg_len = cpu_to_le32(msg_len); @@ -572,7 +572,7 @@ static inline int set_rc_wqe(struct hns_roce_qp *qp,  	rc_sq_wqe->msg_len = cpu_to_le32(msg_len);  	ret = set_rc_opcode(hr_dev, rc_sq_wqe, wr); -	if (WARN_ON(ret)) +	if (WARN_ON_ONCE(ret))  		return ret;  	hr_reg_write(rc_sq_wqe, RC_SEND_WQE_SO, @@ -670,6 +670,10 @@ static void write_dwqe(struct hns_roce_dev *hr_dev, struct hns_roce_qp *qp,  #define HNS_ROCE_SL_SHIFT 2  	struct hns_roce_v2_rc_send_wqe *rc_sq_wqe = wqe; +	if (unlikely(qp->state == IB_QPS_ERR)) { +		flush_cqe(hr_dev, qp); +		return; +	}  	/* All kinds of DirectWQE have the same header field layout */  	hr_reg_enable(rc_sq_wqe, RC_SEND_WQE_FLAG);  	hr_reg_write(rc_sq_wqe, RC_SEND_WQE_DB_SL_L, qp->sl); @@ -5619,6 +5623,9 @@ static void put_dip_ctx_idx(struct hns_roce_dev *hr_dev,  {  	struct hns_roce_dip *hr_dip = hr_qp->dip; +	if (!hr_dip) +		return; +  	xa_lock(&hr_dev->qp_table.dip_xa);  	hr_dip->qp_cnt--; diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c index bf30b3a65a9b..55b9283bfc6f 100644 --- a/drivers/infiniband/hw/hns/hns_roce_mr.c +++ b/drivers/infiniband/hw/hns/hns_roce_mr.c @@ -814,11 +814,6 @@ int hns_roce_mtr_map(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,  	for (i = 0, mapped_cnt = 0; i < mtr->hem_cfg.region_count &&  	     mapped_cnt < page_cnt; i++) {  		r = &mtr->hem_cfg.region[i]; -		/* if hopnum is 0, no need to map pages in this region */ -		if (!r->hopnum) { -			mapped_cnt += r->count; -			continue; -		}  		if (r->offset + r->count > page_cnt) {  			ret = -EINVAL; diff --git a/drivers/infiniband/hw/mana/device.c b/drivers/infiniband/hw/mana/device.c index 7ac01918ef7c..3416a85f8738 100644 --- a/drivers/infiniband/hw/mana/device.c +++ b/drivers/infiniband/hw/mana/device.c @@ -9,7 +9,7 @@  MODULE_DESCRIPTION("Microsoft Azure Network Adapter IB driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(NET_MANA); +MODULE_IMPORT_NS("NET_MANA");  static const struct ib_device_ops mana_ib_dev_ops = {  	.owner = THIS_MODULE, diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index bc7930d0c564..f5b59d02f4d3 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -2839,7 +2839,7 @@ static int mlx5_ib_get_plane_num(struct mlx5_core_dev *mdev, u8 *num_plane)  	int err;  	*num_plane = 0; -	if (!MLX5_CAP_GEN(mdev, ib_virt)) +	if (!MLX5_CAP_GEN(mdev, ib_virt) || !MLX5_CAP_GEN_2(mdev, multiplane))  		return 0;  	err = mlx5_query_hca_vport_context(mdev, 0, 1, 0, &vport_ctx); @@ -3639,7 +3639,8 @@ static int mlx5_ib_init_multiport_master(struct mlx5_ib_dev *dev)  		list_for_each_entry(mpi, &mlx5_ib_unaffiliated_port_list,  				    list) {  			if (dev->sys_image_guid == mpi->sys_image_guid && -			    (mlx5_core_native_port_num(mpi->mdev) - 1) == i) { +			    (mlx5_core_native_port_num(mpi->mdev) - 1) == i && +			    mlx5_core_same_coredev_type(dev->mdev, mpi->mdev)) {  				bound = mlx5_ib_bind_slave_port(dev, mpi);  			} @@ -4785,7 +4786,8 @@ static int mlx5r_mp_probe(struct auxiliary_device *adev,  	mutex_lock(&mlx5_ib_multiport_mutex);  	list_for_each_entry(dev, &mlx5_ib_dev_list, ib_dev_list) { -		if (dev->sys_image_guid == mpi->sys_image_guid) +		if (dev->sys_image_guid == mpi->sys_image_guid && +		    mlx5_core_same_coredev_type(dev->mdev, mpi->mdev))  			bound = mlx5_ib_bind_slave_port(dev, mpi);  		if (bound) { diff --git a/drivers/infiniband/sw/rxe/rxe.c b/drivers/infiniband/sw/rxe/rxe.c index 255677bc12b2..1ba4a0c8726a 100644 --- a/drivers/infiniband/sw/rxe/rxe.c +++ b/drivers/infiniband/sw/rxe/rxe.c @@ -40,6 +40,8 @@ void rxe_dealloc(struct ib_device *ib_dev)  /* initialize rxe device parameters */  static void rxe_init_device_param(struct rxe_dev *rxe)  { +	struct net_device *ndev; +  	rxe->max_inline_data			= RXE_MAX_INLINE_DATA;  	rxe->attr.vendor_id			= RXE_VENDOR_ID; @@ -71,8 +73,15 @@ static void rxe_init_device_param(struct rxe_dev *rxe)  	rxe->attr.max_fast_reg_page_list_len	= RXE_MAX_FMR_PAGE_LIST_LEN;  	rxe->attr.max_pkeys			= RXE_MAX_PKEYS;  	rxe->attr.local_ca_ack_delay		= RXE_LOCAL_CA_ACK_DELAY; + +	ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); +	if (!ndev) +		return; +  	addrconf_addr_eui48((unsigned char *)&rxe->attr.sys_image_guid, -			rxe->ndev->dev_addr); +			ndev->dev_addr); + +	dev_put(ndev);  	rxe->max_ucontext			= RXE_MAX_UCONTEXT;  } @@ -109,10 +118,15 @@ static void rxe_init_port_param(struct rxe_port *port)  static void rxe_init_ports(struct rxe_dev *rxe)  {  	struct rxe_port *port = &rxe->port; +	struct net_device *ndev;  	rxe_init_port_param(port); +	ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); +	if (!ndev) +		return;  	addrconf_addr_eui48((unsigned char *)&port->port_guid, -			    rxe->ndev->dev_addr); +			    ndev->dev_addr); +	dev_put(ndev);  	spin_lock_init(&port->port_lock);  } @@ -167,12 +181,13 @@ void rxe_set_mtu(struct rxe_dev *rxe, unsigned int ndev_mtu)  /* called by ifc layer to create new rxe device.   * The caller should allocate memory for rxe by calling ib_alloc_device.   */ -int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name) +int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name, +			struct net_device *ndev)  {  	rxe_init(rxe);  	rxe_set_mtu(rxe, mtu); -	return rxe_register_device(rxe, ibdev_name); +	return rxe_register_device(rxe, ibdev_name, ndev);  }  static int rxe_newlink(const char *ibdev_name, struct net_device *ndev) diff --git a/drivers/infiniband/sw/rxe/rxe.h b/drivers/infiniband/sw/rxe/rxe.h index d8fb2c7af30a..fe7f97066732 100644 --- a/drivers/infiniband/sw/rxe/rxe.h +++ b/drivers/infiniband/sw/rxe/rxe.h @@ -139,7 +139,8 @@ enum resp_states {  void rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu); -int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name); +int rxe_add(struct rxe_dev *rxe, unsigned int mtu, const char *ibdev_name, +			struct net_device *ndev);  void rxe_rcv(struct sk_buff *skb); diff --git a/drivers/infiniband/sw/rxe/rxe_mcast.c b/drivers/infiniband/sw/rxe/rxe_mcast.c index 86cc2e18a7fd..07ff47bae31d 100644 --- a/drivers/infiniband/sw/rxe/rxe_mcast.c +++ b/drivers/infiniband/sw/rxe/rxe_mcast.c @@ -31,10 +31,19 @@  static int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)  {  	unsigned char ll_addr[ETH_ALEN]; +	struct net_device *ndev; +	int ret; + +	ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); +	if (!ndev) +		return -ENODEV;  	ipv6_eth_mc_map((struct in6_addr *)mgid->raw, ll_addr); -	return dev_mc_add(rxe->ndev, ll_addr); +	ret = dev_mc_add(ndev, ll_addr); +	dev_put(ndev); + +	return ret;  }  /** @@ -47,10 +56,19 @@ static int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)  static int rxe_mcast_del(struct rxe_dev *rxe, union ib_gid *mgid)  {  	unsigned char ll_addr[ETH_ALEN]; +	struct net_device *ndev; +	int ret; + +	ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); +	if (!ndev) +		return -ENODEV;  	ipv6_eth_mc_map((struct in6_addr *)mgid->raw, ll_addr); -	return dev_mc_del(rxe->ndev, ll_addr); +	ret = dev_mc_del(ndev, ll_addr); +	dev_put(ndev); + +	return ret;  }  /** diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c index 75d1407db52d..8cc64ceeb356 100644 --- a/drivers/infiniband/sw/rxe/rxe_net.c +++ b/drivers/infiniband/sw/rxe/rxe_net.c @@ -524,7 +524,16 @@ out:   */  const char *rxe_parent_name(struct rxe_dev *rxe, unsigned int port_num)  { -	return rxe->ndev->name; +	struct net_device *ndev; +	char *ndev_name; + +	ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); +	if (!ndev) +		return NULL; +	ndev_name = ndev->name; +	dev_put(ndev); + +	return ndev_name;  }  int rxe_net_add(const char *ibdev_name, struct net_device *ndev) @@ -536,10 +545,9 @@ int rxe_net_add(const char *ibdev_name, struct net_device *ndev)  	if (!rxe)  		return -ENOMEM; -	rxe->ndev = ndev;  	ib_mark_name_assigned_by_user(&rxe->ib_dev); -	err = rxe_add(rxe, ndev->mtu, ibdev_name); +	err = rxe_add(rxe, ndev->mtu, ibdev_name, ndev);  	if (err) {  		ib_dealloc_device(&rxe->ib_dev);  		return err; @@ -587,10 +595,18 @@ void rxe_port_down(struct rxe_dev *rxe)  void rxe_set_port_state(struct rxe_dev *rxe)  { -	if (netif_running(rxe->ndev) && netif_carrier_ok(rxe->ndev)) +	struct net_device *ndev; + +	ndev = rxe_ib_device_get_netdev(&rxe->ib_dev); +	if (!ndev) +		return; + +	if (netif_running(ndev) && netif_carrier_ok(ndev))  		rxe_port_up(rxe);  	else  		rxe_port_down(rxe); + +	dev_put(ndev);  }  static int rxe_notify(struct notifier_block *not_blk, diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c index 5c18f7e342f2..8a5fc20fd186 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.c +++ b/drivers/infiniband/sw/rxe/rxe_verbs.c @@ -41,6 +41,7 @@ static int rxe_query_port(struct ib_device *ibdev,  			  u32 port_num, struct ib_port_attr *attr)  {  	struct rxe_dev *rxe = to_rdev(ibdev); +	struct net_device *ndev;  	int err, ret;  	if (port_num != 1) { @@ -49,6 +50,12 @@ static int rxe_query_port(struct ib_device *ibdev,  		goto err_out;  	} +	ndev = rxe_ib_device_get_netdev(ibdev); +	if (!ndev) { +		err = -ENODEV; +		goto err_out; +	} +  	memcpy(attr, &rxe->port.attr, sizeof(*attr));  	mutex_lock(&rxe->usdev_lock); @@ -57,13 +64,14 @@ static int rxe_query_port(struct ib_device *ibdev,  	if (attr->state == IB_PORT_ACTIVE)  		attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP; -	else if (dev_get_flags(rxe->ndev) & IFF_UP) +	else if (dev_get_flags(ndev) & IFF_UP)  		attr->phys_state = IB_PORT_PHYS_STATE_POLLING;  	else  		attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;  	mutex_unlock(&rxe->usdev_lock); +	dev_put(ndev);  	return ret;  err_out: @@ -1425,9 +1433,16 @@ static const struct attribute_group rxe_attr_group = {  static int rxe_enable_driver(struct ib_device *ib_dev)  {  	struct rxe_dev *rxe = container_of(ib_dev, struct rxe_dev, ib_dev); +	struct net_device *ndev; + +	ndev = rxe_ib_device_get_netdev(ib_dev); +	if (!ndev) +		return -ENODEV;  	rxe_set_port_state(rxe); -	dev_info(&rxe->ib_dev.dev, "added %s\n", netdev_name(rxe->ndev)); +	dev_info(&rxe->ib_dev.dev, "added %s\n", netdev_name(ndev)); + +	dev_put(ndev);  	return 0;  } @@ -1495,7 +1510,8 @@ static const struct ib_device_ops rxe_dev_ops = {  	INIT_RDMA_OBJ_SIZE(ib_mw, rxe_mw, ibmw),  }; -int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name) +int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name, +						struct net_device *ndev)  {  	int err;  	struct ib_device *dev = &rxe->ib_dev; @@ -1507,13 +1523,13 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)  	dev->num_comp_vectors = num_possible_cpus();  	dev->local_dma_lkey = 0;  	addrconf_addr_eui48((unsigned char *)&dev->node_guid, -			    rxe->ndev->dev_addr); +			    ndev->dev_addr);  	dev->uverbs_cmd_mask |= BIT_ULL(IB_USER_VERBS_CMD_POST_SEND) |  				BIT_ULL(IB_USER_VERBS_CMD_REQ_NOTIFY_CQ);  	ib_set_device_ops(dev, &rxe_dev_ops); -	err = ib_device_set_netdev(&rxe->ib_dev, rxe->ndev, 1); +	err = ib_device_set_netdev(&rxe->ib_dev, ndev, 1);  	if (err)  		return err; diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h index 3c1354f82283..6573ceec0ef5 100644 --- a/drivers/infiniband/sw/rxe/rxe_verbs.h +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h @@ -370,6 +370,7 @@ struct rxe_port {  	u32			qp_gsi_index;  }; +#define	RXE_PORT	1  struct rxe_dev {  	struct ib_device	ib_dev;  	struct ib_device_attr	attr; @@ -377,8 +378,6 @@ struct rxe_dev {  	int			max_inline_data;  	struct mutex	usdev_lock; -	struct net_device	*ndev; -  	struct rxe_pool		uc_pool;  	struct rxe_pool		pd_pool;  	struct rxe_pool		ah_pool; @@ -406,6 +405,11 @@ struct rxe_dev {  	struct crypto_shash	*tfm;  }; +static inline struct net_device *rxe_ib_device_get_netdev(struct ib_device *dev) +{ +	return ib_device_get_netdev(dev, RXE_PORT); +} +  static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index)  {  	atomic64_inc(&rxe->stats_counters[index]); @@ -471,6 +475,7 @@ static inline struct rxe_pd *rxe_mw_pd(struct rxe_mw *mw)  	return to_rpd(mw->ibmw.pd);  } -int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name); +int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name, +						struct net_device *ndev);  #endif /* RXE_VERBS_H */ diff --git a/drivers/infiniband/sw/siw/siw.h b/drivers/infiniband/sw/siw/siw.h index 86d4d6a2170e..ea5eee50dc39 100644 --- a/drivers/infiniband/sw/siw/siw.h +++ b/drivers/infiniband/sw/siw/siw.h @@ -46,6 +46,9 @@   */  #define SIW_IRQ_MAXBURST_SQ_ACTIVE 4 +/* There is always only a port 1 per siw device */ +#define SIW_PORT 1 +  struct siw_dev_cap {  	int max_qp;  	int max_qp_wr; @@ -69,16 +72,12 @@ struct siw_pd {  struct siw_device {  	struct ib_device base_dev; -	struct net_device *netdev;  	struct siw_dev_cap attrs;  	u32 vendor_part_id;  	int numa_node;  	char raw_gid[ETH_ALEN]; -	/* physical port state (only one port per device) */ -	enum ib_port_state state; -  	spinlock_t lock;  	struct xarray qp_xa; diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c index 86323918a570..708b13993fdf 100644 --- a/drivers/infiniband/sw/siw/siw_cm.c +++ b/drivers/infiniband/sw/siw/siw_cm.c @@ -1759,6 +1759,7 @@ int siw_create_listen(struct iw_cm_id *id, int backlog)  {  	struct socket *s;  	struct siw_cep *cep = NULL; +	struct net_device *ndev = NULL;  	struct siw_device *sdev = to_siw_dev(id->device);  	int addr_family = id->local_addr.ss_family;  	int rv = 0; @@ -1779,9 +1780,15 @@ int siw_create_listen(struct iw_cm_id *id, int backlog)  		struct sockaddr_in *laddr = &to_sockaddr_in(id->local_addr);  		/* For wildcard addr, limit binding to current device only */ -		if (ipv4_is_zeronet(laddr->sin_addr.s_addr)) -			s->sk->sk_bound_dev_if = sdev->netdev->ifindex; - +		if (ipv4_is_zeronet(laddr->sin_addr.s_addr)) { +			ndev = ib_device_get_netdev(id->device, SIW_PORT); +			if (ndev) { +				s->sk->sk_bound_dev_if = ndev->ifindex; +			} else { +				rv = -ENODEV; +				goto error; +			} +		}  		rv = s->ops->bind(s, (struct sockaddr *)laddr,  				  sizeof(struct sockaddr_in));  	} else { @@ -1797,9 +1804,15 @@ int siw_create_listen(struct iw_cm_id *id, int backlog)  		}  		/* For wildcard addr, limit binding to current device only */ -		if (ipv6_addr_any(&laddr->sin6_addr)) -			s->sk->sk_bound_dev_if = sdev->netdev->ifindex; - +		if (ipv6_addr_any(&laddr->sin6_addr)) { +			ndev = ib_device_get_netdev(id->device, SIW_PORT); +			if (ndev) { +				s->sk->sk_bound_dev_if = ndev->ifindex; +			} else { +				rv = -ENODEV; +				goto error; +			} +		}  		rv = s->ops->bind(s, (struct sockaddr *)laddr,  				  sizeof(struct sockaddr_in6));  	} @@ -1860,6 +1873,7 @@ int siw_create_listen(struct iw_cm_id *id, int backlog)  	}  	list_add_tail(&cep->listenq, (struct list_head *)id->provider_data);  	cep->state = SIW_EPSTATE_LISTENING; +	dev_put(ndev);  	siw_dbg(id->device, "Listen at laddr %pISp\n", &id->local_addr); @@ -1879,6 +1893,7 @@ error:  		siw_cep_set_free_and_put(cep);  	}  	sock_release(s); +	dev_put(ndev);  	return rv;  } diff --git a/drivers/infiniband/sw/siw/siw_main.c b/drivers/infiniband/sw/siw/siw_main.c index 17abef48abcd..14d3103aee6f 100644 --- a/drivers/infiniband/sw/siw/siw_main.c +++ b/drivers/infiniband/sw/siw/siw_main.c @@ -287,7 +287,6 @@ static struct siw_device *siw_device_create(struct net_device *netdev)  		return NULL;  	base_dev = &sdev->base_dev; -	sdev->netdev = netdev;  	if (netdev->addr_len) {  		memcpy(sdev->raw_gid, netdev->dev_addr, @@ -381,12 +380,10 @@ static int siw_netdev_event(struct notifier_block *nb, unsigned long event,  	switch (event) {  	case NETDEV_UP: -		sdev->state = IB_PORT_ACTIVE;  		siw_port_event(sdev, 1, IB_EVENT_PORT_ACTIVE);  		break;  	case NETDEV_DOWN: -		sdev->state = IB_PORT_DOWN;  		siw_port_event(sdev, 1, IB_EVENT_PORT_ERR);  		break; @@ -407,12 +404,8 @@ static int siw_netdev_event(struct notifier_block *nb, unsigned long event,  		siw_port_event(sdev, 1, IB_EVENT_LID_CHANGE);  		break;  	/* -	 * Todo: Below netdev events are currently not handled. +	 * All other events are not handled  	 */ -	case NETDEV_CHANGEMTU: -	case NETDEV_CHANGE: -		break; -  	default:  		break;  	} @@ -442,12 +435,6 @@ static int siw_newlink(const char *basedev_name, struct net_device *netdev)  	sdev = siw_device_create(netdev);  	if (sdev) {  		dev_dbg(&netdev->dev, "siw: new device\n"); - -		if (netif_running(netdev) && netif_carrier_ok(netdev)) -			sdev->state = IB_PORT_ACTIVE; -		else -			sdev->state = IB_PORT_DOWN; -  		ib_mark_name_assigned_by_user(&sdev->base_dev);  		rv = siw_device_register(sdev, basedev_name);  		if (rv) diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/siw/siw_verbs.c index 986666c19378..7ca0297d68a4 100644 --- a/drivers/infiniband/sw/siw/siw_verbs.c +++ b/drivers/infiniband/sw/siw/siw_verbs.c @@ -171,21 +171,29 @@ int siw_query_device(struct ib_device *base_dev, struct ib_device_attr *attr,  int siw_query_port(struct ib_device *base_dev, u32 port,  		   struct ib_port_attr *attr)  { -	struct siw_device *sdev = to_siw_dev(base_dev); +	struct net_device *ndev;  	int rv;  	memset(attr, 0, sizeof(*attr));  	rv = ib_get_eth_speed(base_dev, port, &attr->active_speed,  			 &attr->active_width); +	if (rv) +		return rv; + +	ndev = ib_device_get_netdev(base_dev, SIW_PORT); +	if (!ndev) +		return -ENODEV; +  	attr->gid_tbl_len = 1;  	attr->max_msg_sz = -1; -	attr->max_mtu = ib_mtu_int_to_enum(sdev->netdev->mtu); -	attr->active_mtu = ib_mtu_int_to_enum(sdev->netdev->mtu); -	attr->phys_state = sdev->state == IB_PORT_ACTIVE ? +	attr->max_mtu = ib_mtu_int_to_enum(ndev->max_mtu); +	attr->active_mtu = ib_mtu_int_to_enum(READ_ONCE(ndev->mtu)); +	attr->phys_state = (netif_running(ndev) && netif_carrier_ok(ndev)) ?  		IB_PORT_PHYS_STATE_LINK_UP : IB_PORT_PHYS_STATE_DISABLED; +	attr->state = attr->phys_state == IB_PORT_PHYS_STATE_LINK_UP ? +		IB_PORT_ACTIVE : IB_PORT_DOWN;  	attr->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_DEVICE_MGMT_SUP; -	attr->state = sdev->state;  	/*  	 * All zero  	 * @@ -199,6 +207,7 @@ int siw_query_port(struct ib_device *base_dev, u32 port,  	 * attr->subnet_timeout = 0;  	 * attr->init_type_repy = 0;  	 */ +	dev_put(ndev);  	return rv;  } @@ -505,21 +514,24 @@ int siw_query_qp(struct ib_qp *base_qp, struct ib_qp_attr *qp_attr,  		 int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr)  {  	struct siw_qp *qp; -	struct siw_device *sdev; +	struct net_device *ndev; -	if (base_qp && qp_attr && qp_init_attr) { +	if (base_qp && qp_attr && qp_init_attr)  		qp = to_siw_qp(base_qp); -		sdev = to_siw_dev(base_qp->device); -	} else { +	else  		return -EINVAL; -	} + +	ndev = ib_device_get_netdev(base_qp->device, SIW_PORT); +	if (!ndev) +		return -ENODEV; +  	qp_attr->qp_state = siw_qp_state_to_ib_qp_state[qp->attrs.state];  	qp_attr->cap.max_inline_data = SIW_MAX_INLINE;  	qp_attr->cap.max_send_wr = qp->attrs.sq_size;  	qp_attr->cap.max_send_sge = qp->attrs.sq_max_sges;  	qp_attr->cap.max_recv_wr = qp->attrs.rq_size;  	qp_attr->cap.max_recv_sge = qp->attrs.rq_max_sges; -	qp_attr->path_mtu = ib_mtu_int_to_enum(sdev->netdev->mtu); +	qp_attr->path_mtu = ib_mtu_int_to_enum(READ_ONCE(ndev->mtu));  	qp_attr->max_rd_atomic = qp->attrs.irq_size;  	qp_attr->max_dest_rd_atomic = qp->attrs.orq_size; @@ -534,6 +546,7 @@ int siw_query_qp(struct ib_qp *base_qp, struct ib_qp_attr *qp_attr,  	qp_init_attr->cap = qp_attr->cap; +	dev_put(ndev);  	return 0;  } diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c index e83d95647852..ef4abdea3c2d 100644 --- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c +++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c @@ -349,6 +349,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,  	struct rtrs_srv_mr *srv_mr;  	bool need_inval = false;  	enum ib_send_flags flags; +	struct ib_sge list;  	u32 imm;  	int err; @@ -401,7 +402,6 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,  	imm = rtrs_to_io_rsp_imm(id->msg_id, errno, need_inval);  	imm_wr.wr.next = NULL;  	if (always_invalidate) { -		struct ib_sge list;  		struct rtrs_msg_rkey_rsp *msg;  		srv_mr = &srv_path->mrs[id->msg_id]; diff --git a/drivers/interconnect/icc-clk.c b/drivers/interconnect/icc-clk.c index b956e4050f38..88f311c11020 100644 --- a/drivers/interconnect/icc-clk.c +++ b/drivers/interconnect/icc-clk.c @@ -116,6 +116,11 @@ struct icc_provider *icc_clk_register(struct device *dev,  		}  		node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_master", data[i].name); +		if (!node->name) { +			ret = -ENOMEM; +			goto err; +		} +  		node->data = &qp->clocks[i];  		icc_node_add(node, provider);  		/* link to the next node, slave */ @@ -129,6 +134,11 @@ struct icc_provider *icc_clk_register(struct device *dev,  		}  		node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_slave", data[i].name); +		if (!node->name) { +			ret = -ENOMEM; +			goto err; +		} +  		/* no data for slave node */  		icc_node_add(node, provider);  		onecell->nodes[j++] = node; diff --git a/drivers/interconnect/qcom/icc-rpm.c b/drivers/interconnect/qcom/icc-rpm.c index a8ed435f696c..ea1042d38128 100644 --- a/drivers/interconnect/qcom/icc-rpm.c +++ b/drivers/interconnect/qcom/icc-rpm.c @@ -503,6 +503,7 @@ int qnoc_probe(struct platform_device *pdev)  			    GFP_KERNEL);  	if (!data)  		return -ENOMEM; +	data->num_nodes = num_nodes;  	qp->num_intf_clks = cd_num;  	for (i = 0; i < cd_num; i++) @@ -597,7 +598,6 @@ regmap_done:  		data->nodes[i] = node;  	} -	data->num_nodes = num_nodes;  	clk_bulk_disable_unprepare(qp->num_intf_clks, qp->intf_clks); diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index 3f691e1fd22c..16f40b8000d7 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -1415,6 +1415,7 @@ static int domain_flush_pages_v2(struct protection_domain *pdom,  	struct iommu_cmd cmd;  	int ret = 0; +	lockdep_assert_held(&pdom->lock);  	list_for_each_entry(dev_data, &pdom->dev_list, list) {  		struct amd_iommu *iommu = get_amd_iommu_from_dev(dev_data->dev);  		u16 domid = dev_data->gcr3_info.domid; @@ -1464,6 +1465,8 @@ static void __domain_flush_pages(struct protection_domain *domain,  	ioasid_t pasid = IOMMU_NO_PASID;  	bool gn = false; +	lockdep_assert_held(&domain->lock); +  	if (pdom_is_v2_pgtbl_mode(domain)) {  		gn = true;  		ret = domain_flush_pages_v2(domain, address, size); @@ -1585,6 +1588,8 @@ void amd_iommu_update_and_flush_device_table(struct protection_domain *domain)  {  	struct iommu_dev_data *dev_data; +	lockdep_assert_held(&domain->lock); +  	list_for_each_entry(dev_data, &domain->dev_list, list) {  		struct amd_iommu *iommu = rlookup_amd_iommu(dev_data->dev); @@ -2073,6 +2078,7 @@ static int attach_device(struct device *dev,  	struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);  	struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);  	struct pci_dev *pdev; +	unsigned long flags;  	int ret = 0;  	mutex_lock(&dev_data->mutex); @@ -2113,7 +2119,9 @@ static int attach_device(struct device *dev,  	/* Update data structures */  	dev_data->domain = domain; +	spin_lock_irqsave(&domain->lock, flags);  	list_add(&dev_data->list, &domain->dev_list); +	spin_unlock_irqrestore(&domain->lock, flags);  	/* Update device table */  	dev_update_dte(dev_data, true); @@ -2160,6 +2168,7 @@ static void detach_device(struct device *dev)  	/* Flush IOTLB and wait for the flushes to finish */  	spin_lock_irqsave(&domain->lock, flags);  	amd_iommu_domain_flush_all(domain); +	list_del(&dev_data->list);  	spin_unlock_irqrestore(&domain->lock, flags);  	/* Clear GCR3 table */ @@ -2168,7 +2177,6 @@ static void detach_device(struct device *dev)  	/* Update data structures */  	dev_data->domain = NULL; -	list_del(&dev_data->list);  	/* decrease reference counters - needs to happen after the flushes */  	pdom_detach_iommu(iommu, domain); diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c index eb1e62cd499a..95ba3caeb401 100644 --- a/drivers/iommu/apple-dart.c +++ b/drivers/iommu/apple-dart.c @@ -1352,7 +1352,7 @@ static struct platform_driver apple_dart_driver = {  		.pm			= pm_sleep_ptr(&apple_dart_pm_ops),  	},  	.probe	= apple_dart_probe, -	.remove_new = apple_dart_remove, +	.remove = apple_dart_remove,  };  module_platform_driver(apple_dart_driver); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c index 6cc14d82399f..c7cc613050d9 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c @@ -398,4 +398,4 @@ struct iommufd_viommu *arm_vsmmu_alloc(struct device *dev,  	return &vsmmu->core;  } -MODULE_IMPORT_NS(IOMMUFD); +MODULE_IMPORT_NS("IOMMUFD"); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c index 84baa021370a..d2671bfd3798 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c @@ -607,6 +607,6 @@ static struct kunit_suite arm_smmu_v3_test_module = {  };  kunit_test_suites(&arm_smmu_v3_test_module); -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");  MODULE_DESCRIPTION("KUnit tests for arm-smmu-v3 driver");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index e4ebd9e12ad4..a5c7002ff75b 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -4729,7 +4729,7 @@ static struct platform_driver arm_smmu_driver = {  		.suppress_bind_attrs	= true,  	},  	.probe	= arm_smmu_device_probe, -	.remove_new = arm_smmu_device_remove, +	.remove = arm_smmu_device_remove,  	.shutdown = arm_smmu_device_shutdown,  };  module_driver(arm_smmu_driver, platform_driver_register, diff --git a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c index c8ec74f089f3..6e41ddaa24d6 100644 --- a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c +++ b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c @@ -339,7 +339,7 @@ tegra241_cmdqv_get_cmdq(struct arm_smmu_device *smmu,  	 * one CPU at a time can enter the process, while the others  	 * will be spinning at the same lock.  	 */ -	lidx = smp_processor_id() % cmdqv->num_lvcmdqs_per_vintf; +	lidx = raw_smp_processor_id() % cmdqv->num_lvcmdqs_per_vintf;  	vcmdq = vintf->lvcmdqs[lidx];  	if (!vcmdq || !READ_ONCE(vcmdq->enabled))  		return NULL; diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu.c b/drivers/iommu/arm/arm-smmu/arm-smmu.c index ade4684c14c9..650664e0f6e3 100644 --- a/drivers/iommu/arm/arm-smmu/arm-smmu.c +++ b/drivers/iommu/arm/arm-smmu/arm-smmu.c @@ -2367,7 +2367,7 @@ static struct platform_driver arm_smmu_driver = {  		.suppress_bind_attrs    = true,  	},  	.probe	= arm_smmu_device_probe, -	.remove_new = arm_smmu_device_remove, +	.remove = arm_smmu_device_remove,  	.shutdown = arm_smmu_device_shutdown,  };  module_platform_driver(arm_smmu_driver); diff --git a/drivers/iommu/arm/arm-smmu/qcom_iommu.c b/drivers/iommu/arm/arm-smmu/qcom_iommu.c index b98a7a598b89..3907924646a2 100644 --- a/drivers/iommu/arm/arm-smmu/qcom_iommu.c +++ b/drivers/iommu/arm/arm-smmu/qcom_iommu.c @@ -759,7 +759,7 @@ static struct platform_driver qcom_iommu_ctx_driver = {  		.of_match_table	= ctx_of_match,  	},  	.probe	= qcom_iommu_ctx_probe, -	.remove_new = qcom_iommu_ctx_remove, +	.remove = qcom_iommu_ctx_remove,  };  static bool qcom_iommu_has_secure_context(struct qcom_iommu_dev *qcom_iommu) @@ -931,7 +931,7 @@ static struct platform_driver qcom_iommu_driver = {  		.pm		= &qcom_iommu_pm_ops,  	},  	.probe	= qcom_iommu_device_probe, -	.remove_new = qcom_iommu_device_remove, +	.remove = qcom_iommu_device_remove,  };  static int __init qcom_iommu_init(void) diff --git a/drivers/iommu/intel/cache.c b/drivers/iommu/intel/cache.c index e5b89f728ad3..09694cca8752 100644 --- a/drivers/iommu/intel/cache.c +++ b/drivers/iommu/intel/cache.c @@ -105,12 +105,35 @@ static void cache_tag_unassign(struct dmar_domain *domain, u16 did,  	spin_unlock_irqrestore(&domain->cache_lock, flags);  } +/* domain->qi_batch will be freed in iommu_free_domain() path. */ +static int domain_qi_batch_alloc(struct dmar_domain *domain) +{ +	unsigned long flags; +	int ret = 0; + +	spin_lock_irqsave(&domain->cache_lock, flags); +	if (domain->qi_batch) +		goto out_unlock; + +	domain->qi_batch = kzalloc(sizeof(*domain->qi_batch), GFP_ATOMIC); +	if (!domain->qi_batch) +		ret = -ENOMEM; +out_unlock: +	spin_unlock_irqrestore(&domain->cache_lock, flags); + +	return ret; +} +  static int __cache_tag_assign_domain(struct dmar_domain *domain, u16 did,  				     struct device *dev, ioasid_t pasid)  {  	struct device_domain_info *info = dev_iommu_priv_get(dev);  	int ret; +	ret = domain_qi_batch_alloc(domain); +	if (ret) +		return ret; +  	ret = cache_tag_assign(domain, did, dev, pasid, CACHE_TAG_IOTLB);  	if (ret || !info->ats_enabled)  		return ret; @@ -139,6 +162,10 @@ static int __cache_tag_assign_parent_domain(struct dmar_domain *domain, u16 did,  	struct device_domain_info *info = dev_iommu_priv_get(dev);  	int ret; +	ret = domain_qi_batch_alloc(domain); +	if (ret) +		return ret; +  	ret = cache_tag_assign(domain, did, dev, pasid, CACHE_TAG_NESTING_IOTLB);  	if (ret || !info->ats_enabled)  		return ret; @@ -190,13 +217,6 @@ int cache_tag_assign_domain(struct dmar_domain *domain,  	u16 did = domain_get_id_for_dev(domain, dev);  	int ret; -	/* domain->qi_bach will be freed in iommu_free_domain() path. */ -	if (!domain->qi_batch) { -		domain->qi_batch = kzalloc(sizeof(*domain->qi_batch), GFP_KERNEL); -		if (!domain->qi_batch) -			return -ENOMEM; -	} -  	ret = __cache_tag_assign_domain(domain, did, dev, pasid);  	if (ret || domain->domain.type != IOMMU_DOMAIN_NESTED)  		return ret; diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 7d0acb74d5a5..79e0da9eb626 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -3220,6 +3220,9 @@ void device_block_translation(struct device *dev)  	struct intel_iommu *iommu = info->iommu;  	unsigned long flags; +	if (info->domain) +		cache_tag_unassign_domain(info->domain, dev, IOMMU_NO_PASID); +  	iommu_disable_pci_caps(info);  	if (!dev_is_real_dma_subdevice(dev)) {  		if (sm_supported(iommu)) @@ -3236,7 +3239,6 @@ void device_block_translation(struct device *dev)  	list_del(&info->link);  	spin_unlock_irqrestore(&info->domain->lock, flags); -	cache_tag_unassign_domain(info->domain, dev, IOMMU_NO_PASID);  	domain_detach_iommu(info->domain, iommu);  	info->domain = NULL;  } diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c index 0f2a926d3bd5..5b7d85f1e143 100644 --- a/drivers/iommu/intel/pasid.c +++ b/drivers/iommu/intel/pasid.c @@ -265,7 +265,8 @@ void intel_pasid_tear_down_entry(struct intel_iommu *iommu, struct device *dev,  		iommu->flush.flush_iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH);  	devtlb_invalidation_with_pasid(iommu, dev, pasid); -	intel_iommu_drain_pasid_prq(dev, pasid); +	if (!fault_ignore) +		intel_iommu_drain_pasid_prq(dev, pasid);  }  /* diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 9bc0c74cca3c..599030e1e890 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2211,7 +2211,7 @@ int iommu_group_replace_domain(struct iommu_group *group,  	mutex_unlock(&group->mutex);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iommu_group_replace_domain, IOMMUFD_INTERNAL); +EXPORT_SYMBOL_NS_GPL(iommu_group_replace_domain, "IOMMUFD_INTERNAL");  static int __iommu_device_set_domain(struct iommu_group *group,  				     struct device *dev, @@ -3482,7 +3482,7 @@ iommu_attach_handle_get(struct iommu_group *group, ioasid_t pasid, unsigned int  	return handle;  } -EXPORT_SYMBOL_NS_GPL(iommu_attach_handle_get, IOMMUFD_INTERNAL); +EXPORT_SYMBOL_NS_GPL(iommu_attach_handle_get, "IOMMUFD_INTERNAL");  /**   * iommu_attach_group_handle - Attach an IOMMU domain to an IOMMU group @@ -3522,7 +3522,7 @@ err_unlock:  	mutex_unlock(&group->mutex);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iommu_attach_group_handle, IOMMUFD_INTERNAL); +EXPORT_SYMBOL_NS_GPL(iommu_attach_group_handle, "IOMMUFD_INTERNAL");  /**   * iommu_detach_group_handle - Detach an IOMMU domain from an IOMMU group @@ -3540,7 +3540,7 @@ void iommu_detach_group_handle(struct iommu_domain *domain,  	xa_erase(&group->pasid_array, IOMMU_NO_PASID);  	mutex_unlock(&group->mutex);  } -EXPORT_SYMBOL_NS_GPL(iommu_detach_group_handle, IOMMUFD_INTERNAL); +EXPORT_SYMBOL_NS_GPL(iommu_detach_group_handle, "IOMMUFD_INTERNAL");  /**   * iommu_replace_group_handle - replace the domain that a group is attached to @@ -3586,4 +3586,4 @@ err_unlock:  	mutex_unlock(&group->mutex);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iommu_replace_group_handle, IOMMUFD_INTERNAL); +EXPORT_SYMBOL_NS_GPL(iommu_replace_group_handle, "IOMMUFD_INTERNAL"); diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c index 5fd3dd420290..dfd0898fb6c1 100644 --- a/drivers/iommu/iommufd/device.c +++ b/drivers/iommu/iommufd/device.c @@ -233,7 +233,7 @@ out_group_put:  	iommufd_put_group(igroup);  	return ERR_PTR(rc);  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_bind, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_bind, "IOMMUFD");  /**   * iommufd_ctx_has_group - True if any device within the group is bound @@ -264,7 +264,7 @@ bool iommufd_ctx_has_group(struct iommufd_ctx *ictx, struct iommu_group *group)  	xa_unlock(&ictx->objects);  	return false;  } -EXPORT_SYMBOL_NS_GPL(iommufd_ctx_has_group, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_has_group, "IOMMUFD");  /**   * iommufd_device_unbind - Undo iommufd_device_bind() @@ -279,19 +279,19 @@ void iommufd_device_unbind(struct iommufd_device *idev)  {  	iommufd_object_destroy_user(idev->ictx, &idev->obj);  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_unbind, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_unbind, "IOMMUFD");  struct iommufd_ctx *iommufd_device_to_ictx(struct iommufd_device *idev)  {  	return idev->ictx;  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_to_ictx, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_to_ictx, "IOMMUFD");  u32 iommufd_device_to_id(struct iommufd_device *idev)  {  	return idev->obj.id;  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_to_id, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_to_id, "IOMMUFD");  static int iommufd_group_setup_msi(struct iommufd_group *igroup,  				   struct iommufd_hwpt_paging *hwpt_paging) @@ -692,7 +692,7 @@ int iommufd_device_attach(struct iommufd_device *idev, u32 *pt_id)  	refcount_inc(&idev->obj.users);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_attach, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_attach, "IOMMUFD");  /**   * iommufd_device_replace - Change the device's iommu_domain @@ -714,7 +714,7 @@ int iommufd_device_replace(struct iommufd_device *idev, u32 *pt_id)  	return iommufd_device_change_pt(idev, pt_id,  					&iommufd_device_do_replace);  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_replace, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_replace, "IOMMUFD");  /**   * iommufd_device_detach - Disconnect a device to an iommu_domain @@ -731,7 +731,7 @@ void iommufd_device_detach(struct iommufd_device *idev)  	iommufd_hw_pagetable_put(idev->ictx, hwpt);  	refcount_dec(&idev->obj.users);  } -EXPORT_SYMBOL_NS_GPL(iommufd_device_detach, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_device_detach, "IOMMUFD");  /*   * On success, it will refcount_inc() at a valid new_ioas and refcount_dec() at @@ -853,7 +853,7 @@ iommufd_access_create(struct iommufd_ctx *ictx,  	mutex_init(&access->ioas_lock);  	return access;  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_create, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_create, "IOMMUFD");  /**   * iommufd_access_destroy - Destroy an iommufd_access @@ -865,7 +865,7 @@ void iommufd_access_destroy(struct iommufd_access *access)  {  	iommufd_object_destroy_user(access->ictx, &access->obj);  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, "IOMMUFD");  void iommufd_access_detach(struct iommufd_access *access)  { @@ -877,7 +877,7 @@ void iommufd_access_detach(struct iommufd_access *access)  	WARN_ON(iommufd_access_change_ioas(access, NULL));  	mutex_unlock(&access->ioas_lock);  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_detach, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_detach, "IOMMUFD");  int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)  { @@ -893,7 +893,7 @@ int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)  	mutex_unlock(&access->ioas_lock);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_attach, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_attach, "IOMMUFD");  int iommufd_access_replace(struct iommufd_access *access, u32 ioas_id)  { @@ -908,7 +908,7 @@ int iommufd_access_replace(struct iommufd_access *access, u32 ioas_id)  	mutex_unlock(&access->ioas_lock);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_replace, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_replace, "IOMMUFD");  /**   * iommufd_access_notify_unmap - Notify users of an iopt to stop using it @@ -991,7 +991,7 @@ void iommufd_access_unpin_pages(struct iommufd_access *access,  	up_read(&iopt->iova_rwsem);  	mutex_unlock(&access->ioas_lock);  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_unpin_pages, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_unpin_pages, "IOMMUFD");  static bool iopt_area_contig_is_aligned(struct iopt_area_contig_iter *iter)  { @@ -1106,7 +1106,7 @@ err_remove:  	mutex_unlock(&access->ioas_lock);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_pin_pages, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_pin_pages, "IOMMUFD");  /**   * iommufd_access_rw - Read or write data under the iova @@ -1170,7 +1170,7 @@ err_out:  	mutex_unlock(&access->ioas_lock);  	return rc;  } -EXPORT_SYMBOL_NS_GPL(iommufd_access_rw, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_access_rw, "IOMMUFD");  int iommufd_get_hw_info(struct iommufd_ucmd *ucmd)  { diff --git a/drivers/iommu/iommufd/driver.c b/drivers/iommu/iommufd/driver.c index 7b67fdf44134..2d98b04ff1cb 100644 --- a/drivers/iommu/iommufd/driver.c +++ b/drivers/iommu/iommufd/driver.c @@ -34,7 +34,7 @@ out_free:  	kfree(obj);  	return ERR_PTR(rc);  } -EXPORT_SYMBOL_NS_GPL(_iommufd_object_alloc, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(_iommufd_object_alloc, "IOMMUFD");  /* Caller should xa_lock(&viommu->vdevs) to protect the return value */  struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu, @@ -47,7 +47,7 @@ struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,  	vdev = xa_load(&viommu->vdevs, vdev_id);  	return vdev ? vdev->dev : NULL;  } -EXPORT_SYMBOL_NS_GPL(iommufd_viommu_find_dev, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_viommu_find_dev, "IOMMUFD");  MODULE_DESCRIPTION("iommufd code shared with builtin modules");  MODULE_LICENSE("GPL"); diff --git a/drivers/iommu/iommufd/fault.c b/drivers/iommu/iommufd/fault.c index 053b0e30f55a..1fe804e28a86 100644 --- a/drivers/iommu/iommufd/fault.c +++ b/drivers/iommu/iommufd/fault.c @@ -420,8 +420,6 @@ out_put_fdno:  	put_unused_fd(fdno);  out_fput:  	fput(filep); -	refcount_dec(&fault->obj.users); -	iommufd_ctx_put(fault->ictx);  out_abort:  	iommufd_object_abort_and_destroy(ucmd->ictx, &fault->obj); diff --git a/drivers/iommu/iommufd/iova_bitmap.c b/drivers/iommu/iommufd/iova_bitmap.c index d90b9e253412..ab665cf38ef4 100644 --- a/drivers/iommu/iommufd/iova_bitmap.c +++ b/drivers/iommu/iommufd/iova_bitmap.c @@ -272,7 +272,7 @@ err:  	iova_bitmap_free(bitmap);  	return ERR_PTR(rc);  } -EXPORT_SYMBOL_NS_GPL(iova_bitmap_alloc, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iova_bitmap_alloc, "IOMMUFD");  /**   * iova_bitmap_free() - Frees an IOVA bitmap object @@ -294,7 +294,7 @@ void iova_bitmap_free(struct iova_bitmap *bitmap)  	kfree(bitmap);  } -EXPORT_SYMBOL_NS_GPL(iova_bitmap_free, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iova_bitmap_free, "IOMMUFD");  /*   * Returns the remaining bitmap indexes from mapped_total_index to process for @@ -387,7 +387,7 @@ int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque,  {  	return fn(bitmap, bitmap->iova, bitmap->length, opaque);  } -EXPORT_SYMBOL_NS_GPL(iova_bitmap_for_each, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iova_bitmap_for_each, "IOMMUFD");  /**   * iova_bitmap_set() - Records an IOVA range in bitmap @@ -445,4 +445,4 @@ update_indexes:  		cur_bit += nbits;  	} while (cur_bit <= last_bit);  } -EXPORT_SYMBOL_NS_GPL(iova_bitmap_set, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iova_bitmap_set, "IOMMUFD"); diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c index 0a96cc8f27da..97c5e3567d33 100644 --- a/drivers/iommu/iommufd/main.c +++ b/drivers/iommu/iommufd/main.c @@ -427,7 +427,7 @@ void iommufd_ctx_get(struct iommufd_ctx *ictx)  {  	get_file(ictx->file);  } -EXPORT_SYMBOL_NS_GPL(iommufd_ctx_get, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_get, "IOMMUFD");  /**   * iommufd_ctx_from_file - Acquires a reference to the iommufd context @@ -447,7 +447,7 @@ struct iommufd_ctx *iommufd_ctx_from_file(struct file *file)  	iommufd_ctx_get(ictx);  	return ictx;  } -EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_file, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_file, "IOMMUFD");  /**   * iommufd_ctx_from_fd - Acquires a reference to the iommufd context @@ -471,7 +471,7 @@ struct iommufd_ctx *iommufd_ctx_from_fd(int fd)  	/* fget is the same as iommufd_ctx_get() */  	return file->private_data;  } -EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, "IOMMUFD");  /**   * iommufd_ctx_put - Put back a reference @@ -481,7 +481,7 @@ void iommufd_ctx_put(struct iommufd_ctx *ictx)  {  	fput(ictx->file);  } -EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, IOMMUFD); +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_put, "IOMMUFD");  static const struct iommufd_object_ops iommufd_object_ops[] = {  	[IOMMUFD_OBJ_ACCESS] = { @@ -575,7 +575,7 @@ module_exit(iommufd_exit);  MODULE_ALIAS_MISCDEV(VFIO_MINOR);  MODULE_ALIAS("devname:vfio/vfio");  #endif -MODULE_IMPORT_NS(IOMMUFD_INTERNAL); -MODULE_IMPORT_NS(IOMMUFD); +MODULE_IMPORT_NS("IOMMUFD_INTERNAL"); +MODULE_IMPORT_NS("IOMMUFD");  MODULE_DESCRIPTION("I/O Address Space Management for passthrough devices");  MODULE_LICENSE("GPL"); diff --git a/drivers/iommu/iommufd/vfio_compat.c b/drivers/iommu/iommufd/vfio_compat.c index 514aacd64009..a258ee2f4579 100644 --- a/drivers/iommu/iommufd/vfio_compat.c +++ b/drivers/iommu/iommufd/vfio_compat.c @@ -44,7 +44,7 @@ int iommufd_vfio_compat_ioas_get_id(struct iommufd_ctx *ictx, u32 *out_ioas_id)  	iommufd_put_object(ictx, &ioas->obj);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(iommufd_vfio_compat_ioas_get_id, IOMMUFD_VFIO); +EXPORT_SYMBOL_NS_GPL(iommufd_vfio_compat_ioas_get_id, "IOMMUFD_VFIO");  /**   * iommufd_vfio_compat_set_no_iommu - Called when a no-iommu device is attached @@ -66,7 +66,7 @@ int iommufd_vfio_compat_set_no_iommu(struct iommufd_ctx *ictx)  	xa_unlock(&ictx->objects);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iommufd_vfio_compat_set_no_iommu, IOMMUFD_VFIO); +EXPORT_SYMBOL_NS_GPL(iommufd_vfio_compat_set_no_iommu, "IOMMUFD_VFIO");  /**   * iommufd_vfio_compat_ioas_create - Ensure the compat IOAS is created @@ -118,7 +118,7 @@ out_abort:  	iommufd_object_abort(ictx, &ioas->obj);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(iommufd_vfio_compat_ioas_create, IOMMUFD_VFIO); +EXPORT_SYMBOL_NS_GPL(iommufd_vfio_compat_ioas_create, "IOMMUFD_VFIO");  int iommufd_vfio_ioas(struct iommufd_ucmd *ucmd)  { diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index ff55b8c30712..074daf1aac4e 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c @@ -1159,6 +1159,6 @@ static struct platform_driver ipmmu_driver = {  		.pm = pm_sleep_ptr(&ipmmu_pm),  	},  	.probe = ipmmu_probe, -	.remove_new = ipmmu_remove, +	.remove = ipmmu_remove,  };  builtin_platform_driver(ipmmu_driver); diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c index 989e0869d805..ce40f0a419ea 100644 --- a/drivers/iommu/msm_iommu.c +++ b/drivers/iommu/msm_iommu.c @@ -838,6 +838,6 @@ static struct platform_driver msm_iommu_driver = {  		.of_match_table = msm_iommu_dt_match,  	},  	.probe		= msm_iommu_probe, -	.remove_new	= msm_iommu_remove, +	.remove		= msm_iommu_remove,  };  builtin_platform_driver(msm_iommu_driver); diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index c45313c43b9e..ab60901f8f92 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -1794,7 +1794,7 @@ MODULE_DEVICE_TABLE(of, mtk_iommu_of_ids);  static struct platform_driver mtk_iommu_driver = {  	.probe	= mtk_iommu_probe, -	.remove_new = mtk_iommu_remove, +	.remove = mtk_iommu_remove,  	.driver	= {  		.name = "mtk-iommu",  		.of_match_table = mtk_iommu_of_ids, diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c index ee4e55b6b190..b6de1ca00cef 100644 --- a/drivers/iommu/mtk_iommu_v1.c +++ b/drivers/iommu/mtk_iommu_v1.c @@ -745,7 +745,7 @@ static const struct dev_pm_ops mtk_iommu_v1_pm_ops = {  static struct platform_driver mtk_iommu_v1_driver = {  	.probe	= mtk_iommu_v1_probe, -	.remove_new = mtk_iommu_v1_remove, +	.remove = mtk_iommu_v1_remove,  	.driver	= {  		.name = "mtk-iommu-v1",  		.of_match_table = mtk_iommu_v1_of_ids, diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c index 3f72aef8bd5b..3c62337f43c6 100644 --- a/drivers/iommu/omap-iommu.c +++ b/drivers/iommu/omap-iommu.c @@ -1285,7 +1285,7 @@ static const struct of_device_id omap_iommu_of_match[] = {  static struct platform_driver omap_iommu_driver = {  	.probe	= omap_iommu_probe, -	.remove_new = omap_iommu_remove, +	.remove = omap_iommu_remove,  	.driver	= {  		.name	= "omap-iommu",  		.pm	= &omap_iommu_pm_ops, diff --git a/drivers/iommu/riscv/iommu-platform.c b/drivers/iommu/riscv/iommu-platform.c index da336863f152..382ba2841849 100644 --- a/drivers/iommu/riscv/iommu-platform.c +++ b/drivers/iommu/riscv/iommu-platform.c @@ -81,7 +81,7 @@ static const struct of_device_id riscv_iommu_of_match[] = {  static struct platform_driver riscv_iommu_platform_driver = {  	.probe = riscv_iommu_platform_probe, -	.remove_new = riscv_iommu_platform_remove, +	.remove = riscv_iommu_platform_remove,  	.driver = {  		.name = "riscv,iommu",  		.of_match_table = riscv_iommu_of_match, diff --git a/drivers/iommu/sprd-iommu.c b/drivers/iommu/sprd-iommu.c index a2f4ffe6d949..941d1f361c8c 100644 --- a/drivers/iommu/sprd-iommu.c +++ b/drivers/iommu/sprd-iommu.c @@ -531,7 +531,7 @@ static struct platform_driver sprd_iommu_driver = {  		.suppress_bind_attrs = true,  	},  	.probe	= sprd_iommu_probe, -	.remove_new = sprd_iommu_remove, +	.remove = sprd_iommu_remove,  };  module_platform_driver(sprd_iommu_driver); diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index 55d7122121e2..9bee02db1643 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig @@ -415,7 +415,7 @@ config PARTITION_PERCPU  config STM32MP_EXTI  	tristate "STM32MP extended interrupts and event controller"  	depends on (ARCH_STM32 && !ARM_SINGLE_ARMV7M) || COMPILE_TEST -	default y +	default ARCH_STM32 && !ARM_SINGLE_ARMV7M  	select IRQ_DOMAIN_HIERARCHY  	select GENERIC_IRQ_CHIP  	help diff --git a/drivers/irqchip/irq-bcm2836.c b/drivers/irqchip/irq-bcm2836.c index e5f1059b989f..e366257684b5 100644 --- a/drivers/irqchip/irq-bcm2836.c +++ b/drivers/irqchip/irq-bcm2836.c @@ -58,6 +58,7 @@ static struct irq_chip bcm2836_arm_irqchip_timer = {  	.name		= "bcm2836-timer",  	.irq_mask	= bcm2836_arm_irqchip_mask_timer_irq,  	.irq_unmask	= bcm2836_arm_irqchip_unmask_timer_irq, +	.flags		= IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,  };  static void bcm2836_arm_irqchip_mask_pmu_irq(struct irq_data *d) @@ -74,6 +75,7 @@ static struct irq_chip bcm2836_arm_irqchip_pmu = {  	.name		= "bcm2836-pmu",  	.irq_mask	= bcm2836_arm_irqchip_mask_pmu_irq,  	.irq_unmask	= bcm2836_arm_irqchip_unmask_pmu_irq, +	.flags		= IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,  };  static void bcm2836_arm_irqchip_mask_gpu_irq(struct irq_data *d) @@ -88,6 +90,7 @@ static struct irq_chip bcm2836_arm_irqchip_gpu = {  	.name		= "bcm2836-gpu",  	.irq_mask	= bcm2836_arm_irqchip_mask_gpu_irq,  	.irq_unmask	= bcm2836_arm_irqchip_unmask_gpu_irq, +	.flags		= IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,  };  static void bcm2836_arm_irqchip_dummy_op(struct irq_data *d) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 92244cfa0464..8c3ec5734f1e 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -2045,7 +2045,7 @@ static int its_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu_info)  	if (!is_v4(its_dev->its))  		return -EINVAL; -	guard(raw_spinlock_irq)(&its_dev->event_map.vlpi_lock); +	guard(raw_spinlock)(&its_dev->event_map.vlpi_lock);  	/* Unmap request? */  	if (!info) diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 8b6159f4cdaf..76dce0aac246 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -161,7 +161,22 @@ static bool cpus_have_group0 __ro_after_init;  static void __init gic_prio_init(void)  { -	cpus_have_security_disabled = gic_dist_security_disabled(); +	bool ds; + +	ds = gic_dist_security_disabled(); +	if (!ds) { +		u32 val; + +		val = readl_relaxed(gic_data.dist_base + GICD_CTLR); +		val |= GICD_CTLR_DS; +		writel_relaxed(val, gic_data.dist_base + GICD_CTLR); + +		ds = gic_dist_security_disabled(); +		if (ds) +			pr_warn("Broken GIC integration, security disabled"); +	} + +	cpus_have_security_disabled = ds;  	cpus_have_group0 = gic_has_group0();  	/* @@ -817,7 +832,7 @@ static void gic_deactivate_unhandled(u32 irqnr)   *     register state is not stale, as these may have been indirectly written   *     *after* exception entry.   * - * (2) Deactivate the interrupt when EOI mode 1 is in use. + * (2) Execute an interrupt priority drop when EOI mode 1 is in use.   */  static inline void gic_complete_ack(u32 irqnr)  { @@ -1507,7 +1522,7 @@ static int gic_retrigger(struct irq_data *data)  static int gic_cpu_pm_notifier(struct notifier_block *self,  			       unsigned long cmd, void *v)  { -	if (cmd == CPU_PM_EXIT) { +	if (cmd == CPU_PM_EXIT || cmd == CPU_PM_ENTER_FAILED) {  		if (gic_dist_security_disabled())  			gic_enable_redist(true);  		gic_cpu_sys_reg_enable(); diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 8fae6dc01024..6503573557fd 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -64,7 +64,7 @@ static void gic_check_cpu_features(void)  union gic_base {  	void __iomem *common_base; -	void __percpu * __iomem *percpu_base; +	void __iomem * __percpu *percpu_base;  };  struct gic_chip_data { diff --git a/drivers/irqchip/irq-sunxi-nmi.c b/drivers/irqchip/irq-sunxi-nmi.c index bb92fd85e975..0b4312152024 100644 --- a/drivers/irqchip/irq-sunxi-nmi.c +++ b/drivers/irqchip/irq-sunxi-nmi.c @@ -186,7 +186,8 @@ static int __init sunxi_sc_nmi_irq_init(struct device_node *node,  	gc->chip_types[0].chip.irq_unmask	= irq_gc_mask_set_bit;  	gc->chip_types[0].chip.irq_eoi		= irq_gc_ack_set_bit;  	gc->chip_types[0].chip.irq_set_type	= sunxi_sc_nmi_set_type; -	gc->chip_types[0].chip.flags		= IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED; +	gc->chip_types[0].chip.flags		= IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED | +						  IRQCHIP_SKIP_SET_WAKE;  	gc->chip_types[0].regs.ack		= reg_offs->pend;  	gc->chip_types[0].regs.mask		= reg_offs->enable;  	gc->chip_types[0].regs.type		= reg_offs->ctrl; diff --git a/drivers/irqchip/irqchip.c b/drivers/irqchip/irqchip.c index 1eeb0d0156ce..0ee7b6b71f5f 100644 --- a/drivers/irqchip/irqchip.c +++ b/drivers/irqchip/irqchip.c @@ -35,11 +35,10 @@ void __init irqchip_init(void)  int platform_irqchip_probe(struct platform_device *pdev)  {  	struct device_node *np = pdev->dev.of_node; -	struct device_node *par_np = of_irq_find_parent(np); +	struct device_node *par_np __free(device_node) = of_irq_find_parent(np);  	of_irq_init_cb_t irq_init_cb = of_device_get_match_data(&pdev->dev);  	if (!irq_init_cb) { -		of_node_put(par_np);  		return -EINVAL;  	} @@ -55,7 +54,6 @@ int platform_irqchip_probe(struct platform_device *pdev)  	 * interrupt controller can check for specific domains as necessary.  	 */  	if (par_np && !irq_find_matching_host(par_np, DOMAIN_BUS_ANY)) { -		of_node_put(par_np);  		return -EPROBE_DEFER;  	} diff --git a/drivers/leds/flash/leds-ktd2692.c b/drivers/leds/flash/leds-ktd2692.c index 743830a10f99..0f16eefcfe4c 100644 --- a/drivers/leds/flash/leds-ktd2692.c +++ b/drivers/leds/flash/leds-ktd2692.c @@ -349,7 +349,7 @@ static struct platform_driver ktd2692_driver = {  module_platform_driver(ktd2692_driver); -MODULE_IMPORT_NS(EXPRESSWIRE); +MODULE_IMPORT_NS("EXPRESSWIRE");  MODULE_AUTHOR("Ingi Kim <ingi2.kim@samsung.com>");  MODULE_DESCRIPTION("Kinetic KTD2692 LED driver");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/leds/leds-expresswire.c b/drivers/leds/leds-expresswire.c index e4937a8e0f44..bb69be228a6d 100644 --- a/drivers/leds/leds-expresswire.c +++ b/drivers/leds/leds-expresswire.c @@ -18,7 +18,7 @@ void expresswire_power_off(struct expresswire_common_props *props)  	gpiod_set_value_cansleep(props->ctrl_gpio, 0);  	usleep_range(props->timing.poweroff_us, props->timing.poweroff_us * 2);  } -EXPORT_SYMBOL_NS_GPL(expresswire_power_off, EXPRESSWIRE); +EXPORT_SYMBOL_NS_GPL(expresswire_power_off, "EXPRESSWIRE");  void expresswire_enable(struct expresswire_common_props *props)  { @@ -28,14 +28,14 @@ void expresswire_enable(struct expresswire_common_props *props)  	udelay(props->timing.detect_us);  	gpiod_set_value(props->ctrl_gpio, 1);  } -EXPORT_SYMBOL_NS_GPL(expresswire_enable, EXPRESSWIRE); +EXPORT_SYMBOL_NS_GPL(expresswire_enable, "EXPRESSWIRE");  void expresswire_start(struct expresswire_common_props *props)  {  	gpiod_set_value(props->ctrl_gpio, 1);  	udelay(props->timing.data_start_us);  } -EXPORT_SYMBOL_NS_GPL(expresswire_start, EXPRESSWIRE); +EXPORT_SYMBOL_NS_GPL(expresswire_start, "EXPRESSWIRE");  void expresswire_end(struct expresswire_common_props *props)  { @@ -44,7 +44,7 @@ void expresswire_end(struct expresswire_common_props *props)  	gpiod_set_value(props->ctrl_gpio, 1);  	udelay(props->timing.end_of_data_high_us);  } -EXPORT_SYMBOL_NS_GPL(expresswire_end, EXPRESSWIRE); +EXPORT_SYMBOL_NS_GPL(expresswire_end, "EXPRESSWIRE");  void expresswire_set_bit(struct expresswire_common_props *props, bool bit)  { @@ -60,7 +60,7 @@ void expresswire_set_bit(struct expresswire_common_props *props, bool bit)  		udelay(props->timing.short_bitset_us);  	}  } -EXPORT_SYMBOL_NS_GPL(expresswire_set_bit, EXPRESSWIRE); +EXPORT_SYMBOL_NS_GPL(expresswire_set_bit, "EXPRESSWIRE");  void expresswire_write_u8(struct expresswire_common_props *props, u8 val)  { @@ -69,4 +69,4 @@ void expresswire_write_u8(struct expresswire_common_props *props, u8 val)  		expresswire_set_bit(props, val & BIT(i));  	expresswire_end(props);  } -EXPORT_SYMBOL_NS_GPL(expresswire_write_u8, EXPRESSWIRE); +EXPORT_SYMBOL_NS_GPL(expresswire_write_u8, "EXPRESSWIRE"); diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index fb38f684444f..d00e713c1092 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig @@ -120,6 +120,7 @@ config PMAC_MEDIABAY  config PMAC_BACKLIGHT  	bool "Backlight control for LCD screens"  	depends on PPC_PMAC && ADB_PMU && FB = y && (BROKEN || !PPC64) +	depends on BACKLIGHT_CLASS_DEVICE=y  	select FB_BACKLIGHT  	help  	  Say Y here to enable Macintosh specific extensions of the generic diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c index 2576a53f247e..0b2e08a1bee0 100644 --- a/drivers/macintosh/therm_windtunnel.c +++ b/drivers/macintosh/therm_windtunnel.c @@ -499,7 +499,7 @@ static struct platform_driver therm_of_driver = {  		.of_match_table = therm_of_match,  	},  	.probe		= therm_of_probe, -	.remove_new	= therm_of_remove, +	.remove		= therm_of_remove,  };  struct apple_thermal_info { diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c index 876b4d8cbe37..5bd6d1ccf246 100644 --- a/drivers/macintosh/windfarm_pm112.c +++ b/drivers/macintosh/windfarm_pm112.c @@ -669,7 +669,7 @@ static void wf_pm112_remove(struct platform_device *dev)  static struct platform_driver wf_pm112_driver = {  	.probe = wf_pm112_probe, -	.remove_new = wf_pm112_remove, +	.remove = wf_pm112_remove,  	.driver = {  		.name = "windfarm",  	}, diff --git a/drivers/macintosh/windfarm_pm121.c b/drivers/macintosh/windfarm_pm121.c index cd45fbc4fe1c..660180c843a3 100644 --- a/drivers/macintosh/windfarm_pm121.c +++ b/drivers/macintosh/windfarm_pm121.c @@ -999,7 +999,7 @@ static void pm121_remove(struct platform_device *ddev)  static struct platform_driver pm121_driver = {  	.probe = pm121_probe, -	.remove_new = pm121_remove, +	.remove = pm121_remove,  	.driver = {  		.name = "windfarm",  		.bus = &platform_bus_type, diff --git a/drivers/macintosh/windfarm_pm72.c b/drivers/macintosh/windfarm_pm72.c index 14fa1e9ac3e0..10aa14074c39 100644 --- a/drivers/macintosh/windfarm_pm72.c +++ b/drivers/macintosh/windfarm_pm72.c @@ -782,7 +782,7 @@ static void wf_pm72_remove(struct platform_device *dev)  static struct platform_driver wf_pm72_driver = {  	.probe	= wf_pm72_probe, -	.remove_new = wf_pm72_remove, +	.remove = wf_pm72_remove,  	.driver	= {  		.name = "windfarm",  	}, diff --git a/drivers/macintosh/windfarm_pm81.c b/drivers/macintosh/windfarm_pm81.c index 404d2454e33d..ada97377e19e 100644 --- a/drivers/macintosh/windfarm_pm81.c +++ b/drivers/macintosh/windfarm_pm81.c @@ -765,7 +765,7 @@ static void wf_smu_remove(struct platform_device *ddev)  static struct platform_driver wf_smu_driver = {  	.probe = wf_smu_probe, -	.remove_new = wf_smu_remove, +	.remove = wf_smu_remove,  	.driver = {  		.name = "windfarm",  	}, diff --git a/drivers/macintosh/windfarm_pm91.c b/drivers/macintosh/windfarm_pm91.c index fba02a375435..108d7938e714 100644 --- a/drivers/macintosh/windfarm_pm91.c +++ b/drivers/macintosh/windfarm_pm91.c @@ -695,7 +695,7 @@ static void wf_smu_remove(struct platform_device *ddev)  static struct platform_driver wf_smu_driver = {  	.probe = wf_smu_probe, -	.remove_new = wf_smu_remove, +	.remove = wf_smu_remove,  	.driver = {  		.name = "windfarm",  	}, diff --git a/drivers/macintosh/windfarm_rm31.c b/drivers/macintosh/windfarm_rm31.c index dc8f2c7ef103..44d86a410238 100644 --- a/drivers/macintosh/windfarm_rm31.c +++ b/drivers/macintosh/windfarm_rm31.c @@ -675,7 +675,7 @@ static void wf_rm31_remove(struct platform_device *dev)  static struct platform_driver wf_rm31_driver = {  	.probe	= wf_rm31_probe, -	.remove_new = wf_rm31_remove, +	.remove = wf_rm31_remove,  	.driver	= {  		.name = "windfarm",  	}, diff --git a/drivers/mcb/mcb-core.c b/drivers/mcb/mcb-core.c index 91bbd948ee93..9b8c40a6459a 100644 --- a/drivers/mcb/mcb-core.c +++ b/drivers/mcb/mcb-core.c @@ -191,7 +191,7 @@ int __mcb_register_driver(struct mcb_driver *drv, struct module *owner,  	return driver_register(&drv->driver);  } -EXPORT_SYMBOL_NS_GPL(__mcb_register_driver, MCB); +EXPORT_SYMBOL_NS_GPL(__mcb_register_driver, "MCB");  /**   * mcb_unregister_driver() - Unregister a @mcb_driver from the system @@ -203,7 +203,7 @@ void mcb_unregister_driver(struct mcb_driver *drv)  {  	driver_unregister(&drv->driver);  } -EXPORT_SYMBOL_NS_GPL(mcb_unregister_driver, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_unregister_driver, "MCB");  static void mcb_release_dev(struct device *dev)  { @@ -250,7 +250,7 @@ out:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(mcb_device_register, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_device_register, "MCB");  static void mcb_free_bus(struct device *dev)  { @@ -303,7 +303,7 @@ err_put:  	put_device(&bus->dev);  	return ERR_PTR(rc);  } -EXPORT_SYMBOL_NS_GPL(mcb_alloc_bus, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_alloc_bus, "MCB");  static int __mcb_devices_unregister(struct device *dev, void *data)  { @@ -325,7 +325,7 @@ void mcb_release_bus(struct mcb_bus *bus)  {  	mcb_devices_unregister(bus);  } -EXPORT_SYMBOL_NS_GPL(mcb_release_bus, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_release_bus, "MCB");  /**   * mcb_bus_get() - Increment refcnt @@ -340,7 +340,7 @@ struct mcb_bus *mcb_bus_get(struct mcb_bus *bus)  	return bus;  } -EXPORT_SYMBOL_NS_GPL(mcb_bus_get, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_bus_get, "MCB");  /**   * mcb_bus_put() - Decrement refcnt @@ -353,7 +353,7 @@ void mcb_bus_put(struct mcb_bus *bus)  	if (bus)  		put_device(&bus->dev);  } -EXPORT_SYMBOL_NS_GPL(mcb_bus_put, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_bus_put, "MCB");  /**   * mcb_alloc_dev() - Allocate a device @@ -373,7 +373,7 @@ struct mcb_device *mcb_alloc_dev(struct mcb_bus *bus)  	return dev;  } -EXPORT_SYMBOL_NS_GPL(mcb_alloc_dev, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_alloc_dev, "MCB");  /**   * mcb_free_dev() - Free @mcb_device @@ -385,7 +385,7 @@ void mcb_free_dev(struct mcb_device *dev)  {  	kfree(dev);  } -EXPORT_SYMBOL_NS_GPL(mcb_free_dev, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_free_dev, "MCB");  static int __mcb_bus_add_devices(struct device *dev, void *data)  { @@ -410,7 +410,7 @@ void mcb_bus_add_devices(const struct mcb_bus *bus)  {  	bus_for_each_dev(bus->dev.bus, NULL, NULL, __mcb_bus_add_devices);  } -EXPORT_SYMBOL_NS_GPL(mcb_bus_add_devices, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_bus_add_devices, "MCB");  /**   * mcb_get_resource() - get a resource for a mcb device @@ -426,7 +426,7 @@ struct resource *mcb_get_resource(struct mcb_device *dev, unsigned int type)  	else  		return NULL;  } -EXPORT_SYMBOL_NS_GPL(mcb_get_resource, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_get_resource, "MCB");  /**   * mcb_request_mem() - Request memory @@ -452,7 +452,7 @@ struct resource *mcb_request_mem(struct mcb_device *dev, const char *name)  	return mem;  } -EXPORT_SYMBOL_NS_GPL(mcb_request_mem, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_request_mem, "MCB");  /**   * mcb_release_mem() - Release memory requested by device @@ -467,7 +467,7 @@ void mcb_release_mem(struct resource *mem)  	size = resource_size(mem);  	release_mem_region(mem->start, size);  } -EXPORT_SYMBOL_NS_GPL(mcb_release_mem, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_release_mem, "MCB");  static int __mcb_get_irq(struct mcb_device *dev)  { @@ -493,7 +493,7 @@ int mcb_get_irq(struct mcb_device *dev)  	return __mcb_get_irq(dev);  } -EXPORT_SYMBOL_NS_GPL(mcb_get_irq, MCB); +EXPORT_SYMBOL_NS_GPL(mcb_get_irq, "MCB");  static int mcb_init(void)  { diff --git a/drivers/mcb/mcb-lpc.c b/drivers/mcb/mcb-lpc.c index 2bec2086ee17..070aa787abc6 100644 --- a/drivers/mcb/mcb-lpc.c +++ b/drivers/mcb/mcb-lpc.c @@ -138,7 +138,7 @@ static struct platform_driver mcb_lpc_driver = {  		.name = "mcb-lpc",  	},  	.probe		= mcb_lpc_probe, -	.remove_new	= mcb_lpc_remove, +	.remove		= mcb_lpc_remove,  };  static const struct dmi_system_id mcb_lpc_dmi_table[] = { @@ -184,4 +184,4 @@ module_exit(mcb_lpc_exit);  MODULE_AUTHOR("Andreas Werner <andreas.werner@men.de>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("MCB over LPC support"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/mcb/mcb-parse.c b/drivers/mcb/mcb-parse.c index a5f8ab9a0910..02a680c73979 100644 --- a/drivers/mcb/mcb-parse.c +++ b/drivers/mcb/mcb-parse.c @@ -251,4 +251,4 @@ free_header:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(chameleon_parse_cells, MCB); +EXPORT_SYMBOL_NS_GPL(chameleon_parse_cells, "MCB"); diff --git a/drivers/mcb/mcb-pci.c b/drivers/mcb/mcb-pci.c index 3b634ea318c7..f1353da6ef4f 100644 --- a/drivers/mcb/mcb-pci.c +++ b/drivers/mcb/mcb-pci.c @@ -154,4 +154,4 @@ module_pci_driver(mcb_pci_driver);  MODULE_AUTHOR("Johannes Thumshirn <johannes.thumshirn@men.de>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("MCB over PCI support"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index e7abfdd77c3b..e42f1400cea9 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1718,7 +1718,7 @@ static CLOSURE_CALLBACK(cache_set_flush)  	if (!IS_ERR_OR_NULL(c->gc_thread))  		kthread_stop(c->gc_thread); -	if (!IS_ERR(c->root)) +	if (!IS_ERR_OR_NULL(c->root))  		list_add(&c->root->list, &c->btree_cache);  	/* diff --git a/drivers/md/dm-ebs-target.c b/drivers/md/dm-ebs-target.c index ec5db1478b2f..18ae45dcbfb2 100644 --- a/drivers/md/dm-ebs-target.c +++ b/drivers/md/dm-ebs-target.c @@ -442,7 +442,7 @@ static int ebs_iterate_devices(struct dm_target *ti,  static struct target_type ebs_target = {  	.name		 = "ebs",  	.version	 = {1, 0, 1}, -	.features	 = DM_TARGET_PASSES_INTEGRITY, +	.features	 = 0,  	.module		 = THIS_MODULE,  	.ctr		 = ebs_ctr,  	.dtr		 = ebs_dtr, diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index bf0f9dddd146..05cf4e3f2bbe 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -2332,10 +2332,9 @@ static struct thin_c *get_first_thin(struct pool *pool)  	struct thin_c *tc = NULL;  	rcu_read_lock(); -	if (!list_empty(&pool->active_thins)) { -		tc = list_entry_rcu(pool->active_thins.next, struct thin_c, list); +	tc = list_first_or_null_rcu(&pool->active_thins, struct thin_c, list); +	if (tc)  		thin_get(tc); -	}  	rcu_read_unlock();  	return tc; diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c index 62b1a44b8dd2..e61855da6461 100644 --- a/drivers/md/dm-verity-fec.c +++ b/drivers/md/dm-verity-fec.c @@ -40,35 +40,23 @@ static inline u64 fec_interleave(struct dm_verity *v, u64 offset)  }  /* - * Decode an RS block using Reed-Solomon. - */ -static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio, -			  u8 *data, u8 *fec, int neras) -{ -	int i; -	uint16_t par[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN]; - -	for (i = 0; i < v->fec->roots; i++) -		par[i] = fec[i]; - -	return decode_rs8(fio->rs, data, par, v->fec->rsn, NULL, neras, -			  fio->erasures, 0, NULL); -} - -/*   * Read error-correcting codes for the requested RS block. Returns a pointer   * to the data block. Caller is responsible for releasing buf.   */  static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index, -			   unsigned int *offset, struct dm_buffer **buf, -			   unsigned short ioprio) +			   unsigned int *offset, unsigned int par_buf_offset, +			   struct dm_buffer **buf, unsigned short ioprio)  {  	u64 position, block, rem;  	u8 *res; +	/* We have already part of parity bytes read, skip to the next block */ +	if (par_buf_offset) +		index++; +  	position = (index + rsb) * v->fec->roots;  	block = div64_u64_rem(position, v->fec->io_size, &rem); -	*offset = (unsigned int)rem; +	*offset = par_buf_offset ? 0 : (unsigned int)rem;  	res = dm_bufio_read_with_ioprio(v->fec->bufio, block, buf, ioprio);  	if (IS_ERR(res)) { @@ -128,11 +116,13 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,  {  	int r, corrected = 0, res;  	struct dm_buffer *buf; -	unsigned int n, i, offset; +	unsigned int n, i, j, offset, par_buf_offset = 0; +	uint16_t par_buf[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];  	u8 *par, *block;  	struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size); -	par = fec_read_parity(v, rsb, block_offset, &offset, &buf, bio_prio(bio)); +	par = fec_read_parity(v, rsb, block_offset, &offset, +			      par_buf_offset, &buf, bio_prio(bio));  	if (IS_ERR(par))  		return PTR_ERR(par); @@ -142,7 +132,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,  	 */  	fec_for_each_buffer_rs_block(fio, n, i) {  		block = fec_buffer_rs_block(v, fio, n, i); -		res = fec_decode_rs8(v, fio, block, &par[offset], neras); +		for (j = 0; j < v->fec->roots - par_buf_offset; j++) +			par_buf[par_buf_offset + j] = par[offset + j]; +		/* Decode an RS block using Reed-Solomon */ +		res = decode_rs8(fio->rs, block, par_buf, v->fec->rsn, +				 NULL, neras, fio->erasures, 0, NULL);  		if (res < 0) {  			r = res;  			goto error; @@ -155,12 +149,22 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,  		if (block_offset >= 1 << v->data_dev_block_bits)  			goto done; -		/* read the next block when we run out of parity bytes */ -		offset += v->fec->roots; +		/* Read the next block when we run out of parity bytes */ +		offset += (v->fec->roots - par_buf_offset); +		/* Check if parity bytes are split between blocks */ +		if (offset < v->fec->io_size && (offset + v->fec->roots) > v->fec->io_size) { +			par_buf_offset = v->fec->io_size - offset; +			for (j = 0; j < par_buf_offset; j++) +				par_buf[j] = par[offset + j]; +			offset += par_buf_offset; +		} else +			par_buf_offset = 0; +  		if (offset >= v->fec->io_size) {  			dm_bufio_release(buf); -			par = fec_read_parity(v, rsb, block_offset, &offset, &buf, bio_prio(bio)); +			par = fec_read_parity(v, rsb, block_offset, &offset, +					      par_buf_offset, &buf, bio_prio(bio));  			if (IS_ERR(par))  				return PTR_ERR(par);  		} @@ -724,10 +728,7 @@ int verity_fec_ctr(struct dm_verity *v)  		return -E2BIG;  	} -	if ((f->roots << SECTOR_SHIFT) & ((1 << v->data_dev_block_bits) - 1)) -		f->io_size = 1 << v->data_dev_block_bits; -	else -		f->io_size = v->fec->roots << SECTOR_SHIFT; +	f->io_size = 1 << v->data_dev_block_bits;  	f->bufio = dm_bufio_client_create(f->dev->bdev,  					  f->io_size, diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c index d58db9a27e6c..76e2c6868548 100644 --- a/drivers/md/dm-zoned-reclaim.c +++ b/drivers/md/dm-zoned-reclaim.c @@ -76,9 +76,9 @@ static int dmz_reclaim_align_wp(struct dmz_reclaim *zrc, struct dm_zone *zone,  	 * pointer and the requested position.  	 */  	nr_blocks = block - wp_block; -	ret = blkdev_issue_zeroout(dev->bdev, -				   dmz_start_sect(zmd, zone) + dmz_blk2sect(wp_block), -				   dmz_blk2sect(nr_blocks), GFP_NOIO, 0); +	ret = blk_zone_issue_zeroout(dev->bdev, +			dmz_start_sect(zmd, zone) + dmz_blk2sect(wp_block), +			dmz_blk2sect(nr_blocks), GFP_NOIO);  	if (ret) {  		dmz_dev_err(dev,  			    "Align zone %u wp %llu to %llu (wp+%u) blocks failed %d", diff --git a/drivers/md/persistent-data/dm-array.c b/drivers/md/persistent-data/dm-array.c index 157c9bd2fed7..8f8792e55806 100644 --- a/drivers/md/persistent-data/dm-array.c +++ b/drivers/md/persistent-data/dm-array.c @@ -917,23 +917,27 @@ static int load_ablock(struct dm_array_cursor *c)  	if (c->block)  		unlock_ablock(c->info, c->block); -	c->block = NULL; -	c->ab = NULL;  	c->index = 0;  	r = dm_btree_cursor_get_value(&c->cursor, &key, &value_le);  	if (r) {  		DMERR("dm_btree_cursor_get_value failed"); -		dm_btree_cursor_end(&c->cursor); +		goto out;  	} else {  		r = get_ablock(c->info, le64_to_cpu(value_le), &c->block, &c->ab);  		if (r) {  			DMERR("get_ablock failed"); -			dm_btree_cursor_end(&c->cursor); +			goto out;  		}  	} +	return 0; + +out: +	dm_btree_cursor_end(&c->cursor); +	c->block = NULL; +	c->ab = NULL;  	return r;  } @@ -956,10 +960,10 @@ EXPORT_SYMBOL_GPL(dm_array_cursor_begin);  void dm_array_cursor_end(struct dm_array_cursor *c)  { -	if (c->block) { +	if (c->block)  		unlock_ablock(c->info, c->block); -		dm_btree_cursor_end(&c->cursor); -	} + +	dm_btree_cursor_end(&c->cursor);  }  EXPORT_SYMBOL_GPL(dm_array_cursor_end); @@ -999,6 +1003,7 @@ int dm_array_cursor_skip(struct dm_array_cursor *c, uint32_t count)  		}  		count -= remaining; +		c->index += (remaining - 1);  		r = dm_array_cursor_next(c);  	} while (!r); diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c index c0cc441b5164..2df566f409b6 100644 --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c @@ -3334,4 +3334,4 @@ EXPORT_SYMBOL_GPL(vb2_thread_stop);  MODULE_DESCRIPTION("Media buffer core framework");  MODULE_AUTHOR("Pawel Osciak <pawel@osciak.com>, Marek Szyprowski");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF"); diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/drivers/media/common/videobuf2/videobuf2-dma-contig.c index bb0b7fa67b53..a13ec569c82f 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c @@ -862,4 +862,4 @@ EXPORT_SYMBOL_GPL(vb2_dma_contig_set_max_seg_size);  MODULE_DESCRIPTION("DMA-contig memory handling routines for videobuf2");  MODULE_AUTHOR("Pawel Osciak <pawel@osciak.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF"); diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c index 6975a71d740f..c6ddf2357c58 100644 --- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c +++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c @@ -676,4 +676,4 @@ EXPORT_SYMBOL_GPL(vb2_dma_sg_memops);  MODULE_DESCRIPTION("dma scatter/gather memory handling routines for videobuf2");  MODULE_AUTHOR("Andrzej Pietrasiewicz");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF"); diff --git a/drivers/media/common/videobuf2/videobuf2-vmalloc.c b/drivers/media/common/videobuf2/videobuf2-vmalloc.c index 7d953706f3f8..3f777068cd34 100644 --- a/drivers/media/common/videobuf2/videobuf2-vmalloc.c +++ b/drivers/media/common/videobuf2/videobuf2-vmalloc.c @@ -442,4 +442,4 @@ EXPORT_SYMBOL_GPL(vb2_vmalloc_memops);  MODULE_DESCRIPTION("vmalloc memory handling routines for videobuf2");  MODULE_AUTHOR("Pawel Osciak <pawel@osciak.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF"); diff --git a/drivers/media/dvb-frontends/dib3000mb.c b/drivers/media/dvb-frontends/dib3000mb.c index 822639f11c04..63bc7b74bc8b 100644 --- a/drivers/media/dvb-frontends/dib3000mb.c +++ b/drivers/media/dvb-frontends/dib3000mb.c @@ -51,7 +51,7 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,2=xfer,4=setfe,8=getfe (|-a  static int dib3000_read_reg(struct dib3000_state *state, u16 reg)  {  	u8 wb[] = { ((reg >> 8) | 0x80) & 0xff, reg & 0xff }; -	u8 rb[2]; +	u8 rb[2] = {};  	struct i2c_msg msg[] = {  		{ .addr = state->config.demod_address, .flags = 0,        .buf = wb, .len = 2 },  		{ .addr = state->config.demod_address, .flags = I2C_M_RD, .buf = rb, .len = 2 }, diff --git a/drivers/media/i2c/ds90ub913.c b/drivers/media/i2c/ds90ub913.c index 8eed4a200fd8..79bddfee2e2e 100644 --- a/drivers/media/i2c/ds90ub913.c +++ b/drivers/media/i2c/ds90ub913.c @@ -904,4 +904,4 @@ MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Texas Instruments DS90UB913 FPD-Link III Serializer Driver");  MODULE_AUTHOR("Luca Ceresoli <luca@lucaceresoli.net>");  MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>"); -MODULE_IMPORT_NS(I2C_ATR); +MODULE_IMPORT_NS("I2C_ATR"); diff --git a/drivers/media/i2c/ds90ub953.c b/drivers/media/i2c/ds90ub953.c index 8b028a84f5bc..725589b3e1c5 100644 --- a/drivers/media/i2c/ds90ub953.c +++ b/drivers/media/i2c/ds90ub953.c @@ -1425,4 +1425,4 @@ MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Texas Instruments FPD-Link III/IV CSI-2 Serializers Driver");  MODULE_AUTHOR("Luca Ceresoli <luca@lucaceresoli.net>");  MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>"); -MODULE_IMPORT_NS(I2C_ATR); +MODULE_IMPORT_NS("I2C_ATR"); diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c index 33f362a00875..1b1ff7f7505b 100644 --- a/drivers/media/i2c/ds90ub960.c +++ b/drivers/media/i2c/ds90ub960.c @@ -4052,4 +4052,4 @@ MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Texas Instruments FPD-Link III/IV Deserializers Driver");  MODULE_AUTHOR("Luca Ceresoli <luca@lucaceresoli.net>");  MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>"); -MODULE_IMPORT_NS(I2C_ATR); +MODULE_IMPORT_NS("I2C_ATR"); diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel/ipu-bridge.c index a0e9a71580b5..1bf249f446a9 100644 --- a/drivers/media/pci/intel/ipu-bridge.c +++ b/drivers/media/pci/intel/ipu-bridge.c @@ -323,7 +323,7 @@ int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu_bridge_parse_ssdb, INTEL_IPU_BRIDGE); +EXPORT_SYMBOL_NS_GPL(ipu_bridge_parse_ssdb, "INTEL_IPU_BRIDGE");  static void ipu_bridge_create_fwnode_properties(  	struct ipu_sensor *sensor, @@ -631,7 +631,7 @@ int ipu_bridge_instantiate_vcm(struct device *sensor)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu_bridge_instantiate_vcm, INTEL_IPU_BRIDGE); +EXPORT_SYMBOL_NS_GPL(ipu_bridge_instantiate_vcm, "INTEL_IPU_BRIDGE");  static int ipu_bridge_instantiate_ivsc(struct ipu_sensor *sensor)  { @@ -882,7 +882,7 @@ err_free_bridge:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ipu_bridge_init, INTEL_IPU_BRIDGE); +EXPORT_SYMBOL_NS_GPL(ipu_bridge_init, "INTEL_IPU_BRIDGE");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Intel IPU Sensors Bridge driver"); diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2.c b/drivers/media/pci/intel/ipu3/ipu3-cio2.c index 4e98f432ed55..dd73d534ac49 100644 --- a/drivers/media/pci/intel/ipu3/ipu3-cio2.c +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2.c @@ -2000,4 +2000,4 @@ MODULE_AUTHOR("Yuning Pu");  MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("IPU3 CIO2 driver"); -MODULE_IMPORT_NS(INTEL_IPU_BRIDGE); +MODULE_IMPORT_NS("INTEL_IPU_BRIDGE"); diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.c b/drivers/media/pci/intel/ipu6/ipu6-buttress.c index 277e101da137..e898902e83f3 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-buttress.c +++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.c @@ -506,7 +506,7 @@ bool ipu6_buttress_auth_done(struct ipu6_device *isp)  	return val == BUTTRESS_SECURITY_CTL_AUTH_DONE;  } -EXPORT_SYMBOL_NS_GPL(ipu6_buttress_auth_done, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_buttress_auth_done, "INTEL_IPU6");  int ipu6_buttress_reset_authentication(struct ipu6_device *isp)  { @@ -598,7 +598,7 @@ out:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(ipu6_buttress_map_fw_image, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_buttress_map_fw_image, "INTEL_IPU6");  void ipu6_buttress_unmap_fw_image(struct ipu6_bus_device *sys,  				  struct sg_table *sgt) @@ -609,7 +609,7 @@ void ipu6_buttress_unmap_fw_image(struct ipu6_bus_device *sys,  	dma_unmap_sgtable(&pdev->dev, sgt, DMA_TO_DEVICE, 0);  	sg_free_table(sgt);  } -EXPORT_SYMBOL_NS_GPL(ipu6_buttress_unmap_fw_image, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_buttress_unmap_fw_image, "INTEL_IPU6");  int ipu6_buttress_authenticate(struct ipu6_device *isp)  { @@ -774,7 +774,7 @@ int ipu6_buttress_start_tsc_sync(struct ipu6_device *isp)  	return -ETIMEDOUT;  } -EXPORT_SYMBOL_NS_GPL(ipu6_buttress_start_tsc_sync, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_buttress_start_tsc_sync, "INTEL_IPU6");  void ipu6_buttress_tsc_read(struct ipu6_device *isp, u64 *val)  { @@ -796,7 +796,7 @@ void ipu6_buttress_tsc_read(struct ipu6_device *isp, u64 *val)  	}  	local_irq_restore(flags);  } -EXPORT_SYMBOL_NS_GPL(ipu6_buttress_tsc_read, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_buttress_tsc_read, "INTEL_IPU6");  u64 ipu6_buttress_tsc_ticks_to_ns(u64 ticks, const struct ipu6_device *isp)  { @@ -811,7 +811,7 @@ u64 ipu6_buttress_tsc_ticks_to_ns(u64 ticks, const struct ipu6_device *isp)  	 */  	return div_u64(ns, isp->buttress.ref_clk);  } -EXPORT_SYMBOL_NS_GPL(ipu6_buttress_tsc_ticks_to_ns, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_buttress_tsc_ticks_to_ns, "INTEL_IPU6");  void ipu6_buttress_restore(struct ipu6_device *isp)  { diff --git a/drivers/media/pci/intel/ipu6/ipu6-cpd.c b/drivers/media/pci/intel/ipu6/ipu6-cpd.c index 55ffd988ae4f..8b8142bcb2d5 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-cpd.c +++ b/drivers/media/pci/intel/ipu6/ipu6-cpd.c @@ -216,14 +216,14 @@ int ipu6_cpd_create_pkg_dir(struct ipu6_bus_device *adev, const void *src)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_cpd_create_pkg_dir, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_cpd_create_pkg_dir, "INTEL_IPU6");  void ipu6_cpd_free_pkg_dir(struct ipu6_bus_device *adev)  {  	ipu6_dma_free(adev, adev->pkg_dir_size, adev->pkg_dir,  		      adev->pkg_dir_dma_addr, 0);  } -EXPORT_SYMBOL_NS_GPL(ipu6_cpd_free_pkg_dir, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_cpd_free_pkg_dir, "INTEL_IPU6");  static int ipu6_cpd_validate_cpd(struct ipu6_device *isp, const void *cpd,  				 unsigned long cpd_size, diff --git a/drivers/media/pci/intel/ipu6/ipu6-dma.c b/drivers/media/pci/intel/ipu6/ipu6-dma.c index 287b77a6aeab..b34022bad83b 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-dma.c +++ b/drivers/media/pci/intel/ipu6/ipu6-dma.c @@ -130,7 +130,7 @@ void ipu6_dma_sync_single(struct ipu6_bus_device *sys, dma_addr_t dma_handle,  	vaddr = info->vaddr + offset;  	clflush_cache_range(vaddr, size);  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_sync_single, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_sync_single, "INTEL_IPU6");  void ipu6_dma_sync_sg(struct ipu6_bus_device *sys, struct scatterlist *sglist,  		      int nents) @@ -141,13 +141,13 @@ void ipu6_dma_sync_sg(struct ipu6_bus_device *sys, struct scatterlist *sglist,  	for_each_sg(sglist, sg, nents, i)  		clflush_cache_range(sg_virt(sg), sg->length);  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_sync_sg, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_sync_sg, "INTEL_IPU6");  void ipu6_dma_sync_sgtable(struct ipu6_bus_device *sys, struct sg_table *sgt)  {  	ipu6_dma_sync_sg(sys, sgt->sgl, sgt->orig_nents);  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_sync_sgtable, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_sync_sgtable, "INTEL_IPU6");  void *ipu6_dma_alloc(struct ipu6_bus_device *sys, size_t size,  		     dma_addr_t *dma_handle, gfp_t gfp, @@ -239,7 +239,7 @@ out_kfree:  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_alloc, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_alloc, "INTEL_IPU6");  void ipu6_dma_free(struct ipu6_bus_device *sys, size_t size, void *vaddr,  		   dma_addr_t dma_handle, unsigned long attrs) @@ -292,7 +292,7 @@ void ipu6_dma_free(struct ipu6_bus_device *sys, size_t size, void *vaddr,  	kfree(info);  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_free, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_free, "INTEL_IPU6");  int ipu6_dma_mmap(struct ipu6_bus_device *sys, struct vm_area_struct *vma,  		  void *addr, dma_addr_t iova, size_t size, @@ -369,7 +369,7 @@ void ipu6_dma_unmap_sg(struct ipu6_bus_device *sys, struct scatterlist *sglist,  	mmu->tlb_invalidate(mmu);  	__free_iova(&mmu->dmap->iovad, iova);  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_unmap_sg, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_unmap_sg, "INTEL_IPU6");  int ipu6_dma_map_sg(struct ipu6_bus_device *sys, struct scatterlist *sglist,  		    int nents, enum dma_data_direction dir, @@ -434,7 +434,7 @@ out_fail:  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_map_sg, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_map_sg, "INTEL_IPU6");  int ipu6_dma_map_sgtable(struct ipu6_bus_device *sys, struct sg_table *sgt,  			 enum dma_data_direction dir, unsigned long attrs) @@ -449,14 +449,14 @@ int ipu6_dma_map_sgtable(struct ipu6_bus_device *sys, struct sg_table *sgt,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_map_sgtable, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_map_sgtable, "INTEL_IPU6");  void ipu6_dma_unmap_sgtable(struct ipu6_bus_device *sys, struct sg_table *sgt,  			    enum dma_data_direction dir, unsigned long attrs)  {  	ipu6_dma_unmap_sg(sys, sgt->sgl, sgt->nents, dir, attrs);  } -EXPORT_SYMBOL_NS_GPL(ipu6_dma_unmap_sgtable, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_dma_unmap_sgtable, "INTEL_IPU6");  /*   * Create scatter-list for the already allocated DMA buffer diff --git a/drivers/media/pci/intel/ipu6/ipu6-fw-com.c b/drivers/media/pci/intel/ipu6/ipu6-fw-com.c index 53edb445d939..40d8ce138a67 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-fw-com.c +++ b/drivers/media/pci/intel/ipu6/ipu6-fw-com.c @@ -261,7 +261,7 @@ void *ipu6_fw_com_prepare(struct ipu6_fw_com_cfg *cfg,  	return ctx;  } -EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_prepare, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_prepare, "INTEL_IPU6");  int ipu6_fw_com_open(struct ipu6_fw_com_context *ctx)  { @@ -289,7 +289,7 @@ int ipu6_fw_com_open(struct ipu6_fw_com_context *ctx)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_open, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_open, "INTEL_IPU6");  int ipu6_fw_com_close(struct ipu6_fw_com_context *ctx)  { @@ -307,7 +307,7 @@ int ipu6_fw_com_close(struct ipu6_fw_com_context *ctx)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_close, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_close, "INTEL_IPU6");  int ipu6_fw_com_release(struct ipu6_fw_com_context *ctx, unsigned int force)  { @@ -320,7 +320,7 @@ int ipu6_fw_com_release(struct ipu6_fw_com_context *ctx, unsigned int force)  	kfree(ctx);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_release, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_release, "INTEL_IPU6");  bool ipu6_fw_com_ready(struct ipu6_fw_com_context *ctx)  { @@ -332,7 +332,7 @@ bool ipu6_fw_com_ready(struct ipu6_fw_com_context *ctx)  	return state == SYSCOM_STATE_READY;  } -EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_ready, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_fw_com_ready, "INTEL_IPU6");  void *ipu6_send_get_token(struct ipu6_fw_com_context *ctx, int q_nbr)  { @@ -360,7 +360,7 @@ void *ipu6_send_get_token(struct ipu6_fw_com_context *ctx, int q_nbr)  	return (void *)((uintptr_t)q->host_address + index * q->token_size);  } -EXPORT_SYMBOL_NS_GPL(ipu6_send_get_token, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_send_get_token, "INTEL_IPU6");  void ipu6_send_put_token(struct ipu6_fw_com_context *ctx, int q_nbr)  { @@ -373,7 +373,7 @@ void ipu6_send_put_token(struct ipu6_fw_com_context *ctx, int q_nbr)  	writel(wr, q_dmem + FW_COM_WR_REG);  } -EXPORT_SYMBOL_NS_GPL(ipu6_send_put_token, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_send_put_token, "INTEL_IPU6");  void *ipu6_recv_get_token(struct ipu6_fw_com_context *ctx, int q_nbr)  { @@ -397,7 +397,7 @@ void *ipu6_recv_get_token(struct ipu6_fw_com_context *ctx, int q_nbr)  	return (void *)((uintptr_t)q->host_address + rd * q->token_size);  } -EXPORT_SYMBOL_NS_GPL(ipu6_recv_get_token, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_recv_get_token, "INTEL_IPU6");  void ipu6_recv_put_token(struct ipu6_fw_com_context *ctx, int q_nbr)  { @@ -410,4 +410,4 @@ void ipu6_recv_put_token(struct ipu6_fw_com_context *ctx, int q_nbr)  	writel(rd, q_dmem + FW_COM_RD_REG);  } -EXPORT_SYMBOL_NS_GPL(ipu6_recv_put_token, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_recv_put_token, "INTEL_IPU6"); diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.c b/drivers/media/pci/intel/ipu6/ipu6-isys.c index 7148f8fe23f5..77f9c7319868 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-isys.c +++ b/drivers/media/pci/intel/ipu6/ipu6-isys.c @@ -1377,5 +1377,5 @@ MODULE_AUTHOR("Yunliang Ding <yunliang.ding@intel.com>");  MODULE_AUTHOR("Hongju Wang <hongju.wang@intel.com>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Intel IPU6 input system driver"); -MODULE_IMPORT_NS(INTEL_IPU6); -MODULE_IMPORT_NS(INTEL_IPU_BRIDGE); +MODULE_IMPORT_NS("INTEL_IPU6"); +MODULE_IMPORT_NS("INTEL_IPU_BRIDGE"); diff --git a/drivers/media/pci/intel/ipu6/ipu6-mmu.c b/drivers/media/pci/intel/ipu6/ipu6-mmu.c index a81e9b09a3c5..6d1c0b90169d 100644 --- a/drivers/media/pci/intel/ipu6/ipu6-mmu.c +++ b/drivers/media/pci/intel/ipu6/ipu6-mmu.c @@ -542,7 +542,7 @@ int ipu6_mmu_hw_init(struct ipu6_mmu *mmu)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ipu6_mmu_hw_init, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_mmu_hw_init, "INTEL_IPU6");  static struct ipu6_mmu_info *ipu6_mmu_alloc(struct ipu6_device *isp)  { @@ -607,7 +607,7 @@ void ipu6_mmu_hw_cleanup(struct ipu6_mmu *mmu)  	mmu->ready = false;  	spin_unlock_irqrestore(&mmu->ready_lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ipu6_mmu_hw_cleanup, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_mmu_hw_cleanup, "INTEL_IPU6");  static struct ipu6_dma_mapping *alloc_dma_mapping(struct ipu6_device *isp)  { diff --git a/drivers/media/pci/intel/ipu6/ipu6.c b/drivers/media/pci/intel/ipu6/ipu6.c index a38292e8eaac..277af7cda8ee 100644 --- a/drivers/media/pci/intel/ipu6/ipu6.c +++ b/drivers/media/pci/intel/ipu6/ipu6.c @@ -281,7 +281,7 @@ void ipu6_configure_spc(struct ipu6_device *isp,  		ipu6_pkg_dir_configure_spc(isp, hw_variant, pkg_dir_idx, base,  					   pkg_dir, pkg_dir_dma_addr);  } -EXPORT_SYMBOL_NS_GPL(ipu6_configure_spc, INTEL_IPU6); +EXPORT_SYMBOL_NS_GPL(ipu6_configure_spc, "INTEL_IPU6");  #define IPU6_ISYS_CSI2_NPORTS		4  #define IPU6SE_ISYS_CSI2_NPORTS		4 @@ -840,7 +840,7 @@ static struct pci_driver ipu6_pci_driver = {  module_pci_driver(ipu6_pci_driver); -MODULE_IMPORT_NS(INTEL_IPU_BRIDGE); +MODULE_IMPORT_NS("INTEL_IPU_BRIDGE");  MODULE_AUTHOR("Sakari Ailus <sakari.ailus@linux.intel.com>");  MODULE_AUTHOR("Tianshu Qiu <tian.shu.qiu@intel.com>");  MODULE_AUTHOR("Bingbu Cao <bingbu.cao@intel.com>"); diff --git a/drivers/media/pci/intel/ivsc/mei_csi.c b/drivers/media/pci/intel/ivsc/mei_csi.c index 2a9c12c975ca..6a893c4547b2 100644 --- a/drivers/media/pci/intel/ivsc/mei_csi.c +++ b/drivers/media/pci/intel/ivsc/mei_csi.c @@ -808,7 +808,7 @@ static struct mei_cl_driver mei_csi_driver = {  module_mei_cl_driver(mei_csi_driver); -MODULE_IMPORT_NS(INTEL_IPU_BRIDGE); +MODULE_IMPORT_NS("INTEL_IPU_BRIDGE");  MODULE_AUTHOR("Wentong Wu <wentong.wu@intel.com>");  MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");  MODULE_DESCRIPTION("Device driver for IVSC CSI"); diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c index eea709d93820..47c302745c1d 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_if.c @@ -1188,7 +1188,8 @@ err:  	return ret;  } -static +/* clang stack usage explodes if this is inlined */ +static noinline_for_stack  void vdec_vp9_slice_map_counts_eob_coef(unsigned int i, unsigned int j, unsigned int k,  					struct vdec_vp9_slice_frame_counts *counts,  					struct v4l2_vp9_frame_symbol_counts *counts_helper) diff --git a/drivers/media/platform/nvidia/tegra-vde/dmabuf-cache.c b/drivers/media/platform/nvidia/tegra-vde/dmabuf-cache.c index 1c5b94989aec..b34244ea14dd 100644 --- a/drivers/media/platform/nvidia/tegra-vde/dmabuf-cache.c +++ b/drivers/media/platform/nvidia/tegra-vde/dmabuf-cache.c @@ -16,7 +16,7 @@  #include "vde.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  struct tegra_vde_cache_entry {  	enum dma_data_direction dma_dir; diff --git a/drivers/memory/brcmstb_dpfe.c b/drivers/memory/brcmstb_dpfe.c index 5028467b2dc9..08d9e05b1b33 100644 --- a/drivers/memory/brcmstb_dpfe.c +++ b/drivers/memory/brcmstb_dpfe.c @@ -934,7 +934,7 @@ static struct platform_driver brcmstb_dpfe_driver = {  		.of_match_table = brcmstb_dpfe_of_match,  	},  	.probe = brcmstb_dpfe_probe, -	.remove_new = brcmstb_dpfe_remove, +	.remove = brcmstb_dpfe_remove,  	.resume = brcmstb_dpfe_resume,  }; diff --git a/drivers/memory/brcmstb_memc.c b/drivers/memory/brcmstb_memc.c index 4f17a93aa028..c87b37e2c1f0 100644 --- a/drivers/memory/brcmstb_memc.c +++ b/drivers/memory/brcmstb_memc.c @@ -283,7 +283,7 @@ static DEFINE_SIMPLE_DEV_PM_OPS(brcmstb_memc_pm_ops, brcmstb_memc_suspend,  static struct platform_driver brcmstb_memc_driver = {  	.probe = brcmstb_memc_probe, -	.remove_new = brcmstb_memc_remove, +	.remove = brcmstb_memc_remove,  	.driver = {  		.name		= "brcmstb_memc",  		.of_match_table	= brcmstb_memc_of_match, diff --git a/drivers/memory/emif.c b/drivers/memory/emif.c index 99eb7d1baa5f..2e1ecae9e959 100644 --- a/drivers/memory/emif.c +++ b/drivers/memory/emif.c @@ -1159,7 +1159,7 @@ MODULE_DEVICE_TABLE(of, emif_of_match);  static struct platform_driver emif_driver = {  	.probe		= emif_probe, -	.remove_new	= emif_remove, +	.remove		= emif_remove,  	.shutdown	= emif_shutdown,  	.driver = {  		.name = "emif", diff --git a/drivers/memory/fsl-corenet-cf.c b/drivers/memory/fsl-corenet-cf.c index f47d05f7c5c5..ecd6c1955153 100644 --- a/drivers/memory/fsl-corenet-cf.c +++ b/drivers/memory/fsl-corenet-cf.c @@ -249,7 +249,7 @@ static struct platform_driver ccf_driver = {  		.of_match_table = ccf_matches,  	},  	.probe = ccf_probe, -	.remove_new = ccf_remove, +	.remove = ccf_remove,  };  module_platform_driver(ccf_driver); diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c index 15e919c24f81..e89e0c6cc4bc 100644 --- a/drivers/memory/fsl_ifc.c +++ b/drivers/memory/fsl_ifc.c @@ -316,7 +316,7 @@ static struct platform_driver fsl_ifc_ctrl_driver = {  		.of_match_table = fsl_ifc_match,  	},  	.probe       = fsl_ifc_ctrl_probe, -	.remove_new  = fsl_ifc_ctrl_remove, +	.remove  = fsl_ifc_ctrl_remove,  };  static int __init fsl_ifc_init(void) diff --git a/drivers/memory/jz4780-nemc.c b/drivers/memory/jz4780-nemc.c index fb6db2ffe71b..1a8161514d03 100644 --- a/drivers/memory/jz4780-nemc.c +++ b/drivers/memory/jz4780-nemc.c @@ -407,7 +407,7 @@ static const struct of_device_id jz4780_nemc_dt_match[] = {  static struct platform_driver jz4780_nemc_driver = {  	.probe		= jz4780_nemc_probe, -	.remove_new	= jz4780_nemc_remove, +	.remove		= jz4780_nemc_remove,  	.driver	= {  		.name	= "jz4780-nemc",  		.of_match_table = of_match_ptr(jz4780_nemc_dt_match), diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c index 2bc034dff691..5710348f72f6 100644 --- a/drivers/memory/mtk-smi.c +++ b/drivers/memory/mtk-smi.c @@ -616,7 +616,7 @@ static const struct dev_pm_ops smi_larb_pm_ops = {  static struct platform_driver mtk_smi_larb_driver = {  	.probe	= mtk_smi_larb_probe, -	.remove_new = mtk_smi_larb_remove, +	.remove = mtk_smi_larb_remove,  	.driver	= {  		.name = "mtk-smi-larb",  		.of_match_table = mtk_smi_larb_of_ids, @@ -838,7 +838,7 @@ static const struct dev_pm_ops smi_common_pm_ops = {  static struct platform_driver mtk_smi_common_driver = {  	.probe	= mtk_smi_common_probe, -	.remove_new = mtk_smi_common_remove, +	.remove = mtk_smi_common_remove,  	.driver	= {  		.name = "mtk-smi-common",  		.of_match_table = mtk_smi_common_of_ids, diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c index c8a0d82f9c27..50eb9f49512b 100644 --- a/drivers/memory/omap-gpmc.c +++ b/drivers/memory/omap-gpmc.c @@ -2743,7 +2743,7 @@ MODULE_DEVICE_TABLE(of, gpmc_dt_ids);  static struct platform_driver gpmc_driver = {  	.probe		= gpmc_probe, -	.remove_new	= gpmc_remove, +	.remove		= gpmc_remove,  	.driver		= {  		.name	= DEVICE_NAME,  		.of_match_table = of_match_ptr(gpmc_dt_ids), diff --git a/drivers/memory/renesas-rpc-if.c b/drivers/memory/renesas-rpc-if.c index 7fbd36fa1a1b..15b4706aafee 100644 --- a/drivers/memory/renesas-rpc-if.c +++ b/drivers/memory/renesas-rpc-if.c @@ -795,7 +795,7 @@ MODULE_DEVICE_TABLE(of, rpcif_of_match);  static struct platform_driver rpcif_driver = {  	.probe	= rpcif_probe, -	.remove_new = rpcif_remove, +	.remove = rpcif_remove,  	.driver = {  		.name =	"rpc-if",  		.of_match_table = rpcif_of_match, diff --git a/drivers/memory/samsung/exynos5422-dmc.c b/drivers/memory/samsung/exynos5422-dmc.c index 7d80322754fa..788d49c688b1 100644 --- a/drivers/memory/samsung/exynos5422-dmc.c +++ b/drivers/memory/samsung/exynos5422-dmc.c @@ -1571,7 +1571,7 @@ MODULE_DEVICE_TABLE(of, exynos5_dmc_of_match);  static struct platform_driver exynos5_dmc_platdrv = {  	.probe	= exynos5_dmc_probe, -	.remove_new = exynos5_dmc_remove, +	.remove = exynos5_dmc_remove,  	.driver = {  		.name	= "exynos5-dmc",  		.of_match_table = exynos5_dmc_of_match, diff --git a/drivers/memory/stm32-fmc2-ebi.c b/drivers/memory/stm32-fmc2-ebi.c index 566c225f71c0..6e386ab54091 100644 --- a/drivers/memory/stm32-fmc2-ebi.c +++ b/drivers/memory/stm32-fmc2-ebi.c @@ -1815,7 +1815,7 @@ MODULE_DEVICE_TABLE(of, stm32_fmc2_ebi_match);  static struct platform_driver stm32_fmc2_ebi_driver = {  	.probe	= stm32_fmc2_ebi_probe, -	.remove_new = stm32_fmc2_ebi_remove, +	.remove = stm32_fmc2_ebi_remove,  	.driver	= {  		.name = "stm32_fmc2_ebi",  		.of_match_table = stm32_fmc2_ebi_match, diff --git a/drivers/memory/tegra/tegra186-emc.c b/drivers/memory/tegra/tegra186-emc.c index 33d67d251719..bc807d7fcd4e 100644 --- a/drivers/memory/tegra/tegra186-emc.c +++ b/drivers/memory/tegra/tegra186-emc.c @@ -406,7 +406,7 @@ static struct platform_driver tegra186_emc_driver = {  		.sync_state = icc_sync_state,  	},  	.probe = tegra186_emc_probe, -	.remove_new = tegra186_emc_remove, +	.remove = tegra186_emc_remove,  };  module_platform_driver(tegra186_emc_driver); diff --git a/drivers/memory/tegra/tegra210-emc-core.c b/drivers/memory/tegra/tegra210-emc-core.c index 78ca1d6c0977..2d5d8245a1d3 100644 --- a/drivers/memory/tegra/tegra210-emc-core.c +++ b/drivers/memory/tegra/tegra210-emc-core.c @@ -2051,7 +2051,7 @@ static struct platform_driver tegra210_emc_driver = {  		.pm = &tegra210_emc_pm_ops,  	},  	.probe = tegra210_emc_probe, -	.remove_new = tegra210_emc_remove, +	.remove = tegra210_emc_remove,  };  module_platform_driver(tegra210_emc_driver); diff --git a/drivers/memory/ti-emif-pm.c b/drivers/memory/ti-emif-pm.c index 592f70e9c8e5..df362ecc59e9 100644 --- a/drivers/memory/ti-emif-pm.c +++ b/drivers/memory/ti-emif-pm.c @@ -330,7 +330,7 @@ static const struct dev_pm_ops ti_emif_pm_ops = {  static struct platform_driver ti_emif_driver = {  	.probe = ti_emif_probe, -	.remove_new = ti_emif_remove, +	.remove = ti_emif_remove,  	.driver = {  		.name = KBUILD_MODNAME,  		.of_match_table = ti_emif_of_match, diff --git a/drivers/memstick/host/rtsx_usb_ms.c b/drivers/memstick/host/rtsx_usb_ms.c index ffdd8de9ec5d..6eb892fd4d34 100644 --- a/drivers/memstick/host/rtsx_usb_ms.c +++ b/drivers/memstick/host/rtsx_usb_ms.c @@ -853,7 +853,7 @@ MODULE_DEVICE_TABLE(platform, rtsx_usb_ms_ids);  static struct platform_driver rtsx_usb_ms_driver = {  	.probe		= rtsx_usb_ms_drv_probe, -	.remove_new	= rtsx_usb_ms_drv_remove, +	.remove		= rtsx_usb_ms_drv_remove,  	.id_table       = rtsx_usb_ms_ids,  	.driver		= {  		.name	= "rtsx_usb_ms", diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index 91242f26defb..ee61b70aa677 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c @@ -137,7 +137,7 @@ static const struct scsi_host_template mptfc_driver_template = {   * Supported hardware   */ -static struct pci_device_id mptfc_pci_table[] = { +static const struct pci_device_id mptfc_pci_table[] = {  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC909,  		PCI_ANY_ID, PCI_ANY_ID },  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC919, diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index a798e26c6402..d0549a4daf76 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c @@ -5377,7 +5377,7 @@ static void mptsas_remove(struct pci_dev *pdev)  	mptscsih_remove(pdev);  } -static struct pci_device_id mptsas_pci_table[] = { +static const struct pci_device_id mptsas_pci_table[] = {  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,  		PCI_ANY_ID, PCI_ANY_ID },  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068, diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 574b882c9a85..4184d0c70ac3 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c @@ -1238,7 +1238,7 @@ static struct spi_function_template mptspi_transport_functions = {   * Supported hardware   */ -static struct pci_device_id mptspi_pci_table[] = { +static const struct pci_device_id mptspi_pci_table[] = {  	{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,  		PCI_ANY_ID, PCI_ANY_ID },  	{ PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030, diff --git a/drivers/mfd/cs40l50-core.c b/drivers/mfd/cs40l50-core.c index 26e7a769eb14..4859a33777a0 100644 --- a/drivers/mfd/cs40l50-core.c +++ b/drivers/mfd/cs40l50-core.c @@ -567,4 +567,4 @@ EXPORT_GPL_DEV_PM_OPS(cs40l50_pm_ops) = {  MODULE_DESCRIPTION("CS40L50 Advanced Haptic Driver");  MODULE_AUTHOR("James Ogletree, Cirrus Logic Inc. <james.ogletree@cirrus.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(FW_CS_DSP); +MODULE_IMPORT_NS("FW_CS_DSP"); diff --git a/drivers/mfd/cs42l43-i2c.c b/drivers/mfd/cs42l43-i2c.c index c9e4ea76149a..f0ad4002652d 100644 --- a/drivers/mfd/cs42l43-i2c.c +++ b/drivers/mfd/cs42l43-i2c.c @@ -92,7 +92,7 @@ static struct i2c_driver cs42l43_i2c_driver = {  };  module_i2c_driver(cs42l43_i2c_driver); -MODULE_IMPORT_NS(MFD_CS42L43); +MODULE_IMPORT_NS("MFD_CS42L43");  MODULE_DESCRIPTION("CS42L43 I2C Driver");  MODULE_AUTHOR("Charles Keepax <ckeepax@opensource.cirrus.com>"); diff --git a/drivers/mfd/cs42l43-sdw.c b/drivers/mfd/cs42l43-sdw.c index 65f7b1d78248..3938d48039c4 100644 --- a/drivers/mfd/cs42l43-sdw.c +++ b/drivers/mfd/cs42l43-sdw.c @@ -215,7 +215,7 @@ static struct sdw_driver cs42l43_sdw_driver = {  };  module_sdw_driver(cs42l43_sdw_driver); -MODULE_IMPORT_NS(MFD_CS42L43); +MODULE_IMPORT_NS("MFD_CS42L43");  MODULE_DESCRIPTION("CS42L43 SoundWire Driver");  MODULE_AUTHOR("Lucas Tanure <tanureal@opensource.cirrus.com>"); diff --git a/drivers/mfd/cs42l43.c b/drivers/mfd/cs42l43.c index e5f17fc430e4..b5ab5e613db7 100644 --- a/drivers/mfd/cs42l43.c +++ b/drivers/mfd/cs42l43.c @@ -264,7 +264,7 @@ const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = {  	{ CS42L43_ASRC_MASK,				0x0000000F },  	{ CS42L43_HPOUT_MASK,				0x00000003 },  }; -EXPORT_SYMBOL_NS_GPL(cs42l43_reg_default, MFD_CS42L43); +EXPORT_SYMBOL_NS_GPL(cs42l43_reg_default, "MFD_CS42L43");  bool cs42l43_readable_register(struct device *dev, unsigned int reg)  { @@ -392,7 +392,7 @@ bool cs42l43_readable_register(struct device *dev, unsigned int reg)  		return false;  	}  } -EXPORT_SYMBOL_NS_GPL(cs42l43_readable_register, MFD_CS42L43); +EXPORT_SYMBOL_NS_GPL(cs42l43_readable_register, "MFD_CS42L43");  bool cs42l43_precious_register(struct device *dev, unsigned int reg)  { @@ -407,7 +407,7 @@ bool cs42l43_precious_register(struct device *dev, unsigned int reg)  		return false;  	}  } -EXPORT_SYMBOL_NS_GPL(cs42l43_precious_register, MFD_CS42L43); +EXPORT_SYMBOL_NS_GPL(cs42l43_precious_register, "MFD_CS42L43");  bool cs42l43_volatile_register(struct device *dev, unsigned int reg)  { @@ -435,7 +435,7 @@ bool cs42l43_volatile_register(struct device *dev, unsigned int reg)  		return cs42l43_precious_register(dev, reg);  	}  } -EXPORT_SYMBOL_NS_GPL(cs42l43_volatile_register, MFD_CS42L43); +EXPORT_SYMBOL_NS_GPL(cs42l43_volatile_register, "MFD_CS42L43");  #define CS42L43_IRQ_OFFSET(reg) ((CS42L43_##reg##_INT) - CS42L43_DECIM_INT) @@ -1096,7 +1096,7 @@ int cs42l43_dev_probe(struct cs42l43 *cs42l43)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(cs42l43_dev_probe, MFD_CS42L43); +EXPORT_SYMBOL_NS_GPL(cs42l43_dev_probe, "MFD_CS42L43");  void cs42l43_dev_remove(struct cs42l43 *cs42l43)  { @@ -1104,7 +1104,7 @@ void cs42l43_dev_remove(struct cs42l43 *cs42l43)  	cs42l43_power_down(cs42l43);  } -EXPORT_SYMBOL_NS_GPL(cs42l43_dev_remove, MFD_CS42L43); +EXPORT_SYMBOL_NS_GPL(cs42l43_dev_remove, "MFD_CS42L43");  static int cs42l43_suspend(struct device *dev)  { diff --git a/drivers/mfd/intel-lpss-acpi.c b/drivers/mfd/intel-lpss-acpi.c index 557061856e58..63406026d809 100644 --- a/drivers/mfd/intel-lpss-acpi.c +++ b/drivers/mfd/intel-lpss-acpi.c @@ -222,4 +222,4 @@ MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel LPSS ACPI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(INTEL_LPSS); +MODULE_IMPORT_NS("INTEL_LPSS"); diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c index 1d8cdc4d5819..1a5b8b13f8d0 100644 --- a/drivers/mfd/intel-lpss-pci.c +++ b/drivers/mfd/intel-lpss-pci.c @@ -653,4 +653,4 @@ MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel LPSS PCI driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(INTEL_LPSS); +MODULE_IMPORT_NS("INTEL_LPSS"); diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c index 2a9018112dfc..3ba05ebb9035 100644 --- a/drivers/mfd/intel-lpss.c +++ b/drivers/mfd/intel-lpss.c @@ -464,7 +464,7 @@ err_clk_register:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(intel_lpss_probe, INTEL_LPSS); +EXPORT_SYMBOL_NS_GPL(intel_lpss_probe, "INTEL_LPSS");  void intel_lpss_remove(struct device *dev)  { @@ -476,7 +476,7 @@ void intel_lpss_remove(struct device *dev)  	intel_lpss_unregister_clock(lpss);  	ida_free(&intel_lpss_devid_ida, lpss->devid);  } -EXPORT_SYMBOL_NS_GPL(intel_lpss_remove, INTEL_LPSS); +EXPORT_SYMBOL_NS_GPL(intel_lpss_remove, "INTEL_LPSS");  static int resume_lpss_device(struct device *dev, void *data)  { diff --git a/drivers/mfd/intel-m10-bmc-core.c b/drivers/mfd/intel-m10-bmc-core.c index 8ad5b3821584..e930161bf65e 100644 --- a/drivers/mfd/intel-m10-bmc-core.c +++ b/drivers/mfd/intel-m10-bmc-core.c @@ -22,7 +22,7 @@ void m10bmc_fw_state_set(struct intel_m10bmc *m10bmc, enum m10bmc_fw_state new_s  	m10bmc->bmcfw_state = new_state;  	up_write(&m10bmc->bmcfw_lock);  } -EXPORT_SYMBOL_NS_GPL(m10bmc_fw_state_set, INTEL_M10_BMC_CORE); +EXPORT_SYMBOL_NS_GPL(m10bmc_fw_state_set, "INTEL_M10_BMC_CORE");  /*   * For some Intel FPGA devices, the BMC firmware is not available to service @@ -75,7 +75,7 @@ int m10bmc_sys_read(struct intel_m10bmc *m10bmc, unsigned int offset, unsigned i  	return ret;  } -EXPORT_SYMBOL_NS_GPL(m10bmc_sys_read, INTEL_M10_BMC_CORE); +EXPORT_SYMBOL_NS_GPL(m10bmc_sys_read, "INTEL_M10_BMC_CORE");  int m10bmc_sys_update_bits(struct intel_m10bmc *m10bmc, unsigned int offset,  			   unsigned int msk, unsigned int val) @@ -95,7 +95,7 @@ int m10bmc_sys_update_bits(struct intel_m10bmc *m10bmc, unsigned int offset,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(m10bmc_sys_update_bits, INTEL_M10_BMC_CORE); +EXPORT_SYMBOL_NS_GPL(m10bmc_sys_update_bits, "INTEL_M10_BMC_CORE");  static ssize_t bmc_version_show(struct device *dev,  				struct device_attribute *attr, char *buf) @@ -183,7 +183,7 @@ const struct attribute_group *m10bmc_dev_groups[] = {  	&m10bmc_group,  	NULL,  }; -EXPORT_SYMBOL_NS_GPL(m10bmc_dev_groups, INTEL_M10_BMC_CORE); +EXPORT_SYMBOL_NS_GPL(m10bmc_dev_groups, "INTEL_M10_BMC_CORE");  int m10bmc_dev_init(struct intel_m10bmc *m10bmc, const struct intel_m10bmc_platform_info *info)  { @@ -201,7 +201,7 @@ int m10bmc_dev_init(struct intel_m10bmc *m10bmc, const struct intel_m10bmc_platf  	return ret;  } -EXPORT_SYMBOL_NS_GPL(m10bmc_dev_init, INTEL_M10_BMC_CORE); +EXPORT_SYMBOL_NS_GPL(m10bmc_dev_init, "INTEL_M10_BMC_CORE");  MODULE_DESCRIPTION("Intel MAX 10 BMC core driver");  MODULE_AUTHOR("Intel Corporation"); diff --git a/drivers/mfd/intel-m10-bmc-pmci.c b/drivers/mfd/intel-m10-bmc-pmci.c index 4fa9d380c62b..d213c6ec04ba 100644 --- a/drivers/mfd/intel-m10-bmc-pmci.c +++ b/drivers/mfd/intel-m10-bmc-pmci.c @@ -454,4 +454,4 @@ module_dfl_driver(m10bmc_pmci_driver);  MODULE_DESCRIPTION("MAX10 BMC PMCI-based interface");  MODULE_AUTHOR("Intel Corporation");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(INTEL_M10_BMC_CORE); +MODULE_IMPORT_NS("INTEL_M10_BMC_CORE"); diff --git a/drivers/mfd/intel-m10-bmc-spi.c b/drivers/mfd/intel-m10-bmc-spi.c index 36f631ef7a67..cfa620f0c70e 100644 --- a/drivers/mfd/intel-m10-bmc-spi.c +++ b/drivers/mfd/intel-m10-bmc-spi.c @@ -181,4 +181,4 @@ MODULE_DESCRIPTION("Intel MAX 10 BMC SPI bus interface");  MODULE_AUTHOR("Intel Corporation");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("spi:intel-m10-bmc"); -MODULE_IMPORT_NS(INTEL_M10_BMC_CORE); +MODULE_IMPORT_NS("INTEL_M10_BMC_CORE"); diff --git a/drivers/mfd/ocelot-core.c b/drivers/mfd/ocelot-core.c index 9cccf54fc9c8..41aff2708854 100644 --- a/drivers/mfd/ocelot-core.c +++ b/drivers/mfd/ocelot-core.c @@ -113,7 +113,7 @@ int ocelot_chip_reset(struct device *dev)  	return readx_poll_timeout(ocelot_gcb_chip_rst_status, ddata, val, !val,  				  VSC7512_GCB_RST_SLEEP_US, VSC7512_GCB_RST_TIMEOUT_US);  } -EXPORT_SYMBOL_NS(ocelot_chip_reset, MFD_OCELOT); +EXPORT_SYMBOL_NS(ocelot_chip_reset, "MFD_OCELOT");  static const struct resource vsc7512_miim0_resources[] = {  	DEFINE_RES_REG_NAMED(VSC7512_MIIM0_RES_START, VSC7512_MIIM_RES_SIZE, "gcb_miim0"), @@ -226,9 +226,9 @@ int ocelot_core_init(struct device *dev)  	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, vsc7512_devs, ndevs, NULL, 0, NULL);  } -EXPORT_SYMBOL_NS(ocelot_core_init, MFD_OCELOT); +EXPORT_SYMBOL_NS(ocelot_core_init, "MFD_OCELOT");  MODULE_DESCRIPTION("Externally Controlled Ocelot Chip Driver");  MODULE_AUTHOR("Colin Foster <colin.foster@in-advantage.com>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(MFD_OCELOT_SPI); +MODULE_IMPORT_NS("MFD_OCELOT_SPI"); diff --git a/drivers/mfd/ocelot-spi.c b/drivers/mfd/ocelot-spi.c index b015c8683f1b..1fed9878c323 100644 --- a/drivers/mfd/ocelot-spi.c +++ b/drivers/mfd/ocelot-spi.c @@ -193,7 +193,7 @@ struct regmap *ocelot_spi_init_regmap(struct device *dev, const struct resource  	return devm_regmap_init(dev, &ocelot_spi_regmap_bus, dev, ®map_config);  } -EXPORT_SYMBOL_NS(ocelot_spi_init_regmap, MFD_OCELOT_SPI); +EXPORT_SYMBOL_NS(ocelot_spi_init_regmap, "MFD_OCELOT_SPI");  static int ocelot_spi_probe(struct spi_device *spi)  { @@ -295,4 +295,4 @@ module_spi_driver(ocelot_spi_driver);  MODULE_DESCRIPTION("SPI Controlled Ocelot Chip Driver");  MODULE_AUTHOR("Colin Foster <colin.foster@in-advantage.com>");  MODULE_LICENSE("Dual MIT/GPL"); -MODULE_IMPORT_NS(MFD_OCELOT); +MODULE_IMPORT_NS("MFD_OCELOT"); diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c index 1d0322dfaf79..35a196341534 100644 --- a/drivers/misc/atmel-ssc.c +++ b/drivers/misc/atmel-ssc.c @@ -269,7 +269,7 @@ static struct platform_driver ssc_driver = {  	},  	.id_table	= atmel_ssc_devtypes,  	.probe		= ssc_probe, -	.remove_new	= ssc_remove, +	.remove		= ssc_remove,  };  module_platform_driver(ssc_driver); diff --git a/drivers/misc/cxl/of.c b/drivers/misc/cxl/of.c index 03633cccd043..cf6bd8a43056 100644 --- a/drivers/misc/cxl/of.c +++ b/drivers/misc/cxl/of.c @@ -339,6 +339,6 @@ struct platform_driver cxl_of_driver = {  		.owner = THIS_MODULE  	},  	.probe = cxl_of_probe, -	.remove_new = cxl_of_remove, +	.remove = cxl_of_remove,  	.shutdown = cxl_of_shutdown,  }; diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index 74181b8c386b..48d08eeb2d20 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -2215,7 +2215,7 @@ static const struct of_device_id fastrpc_match_table[] = {  static struct platform_driver fastrpc_cb_driver = {  	.probe = fastrpc_cb_probe, -	.remove_new = fastrpc_cb_remove, +	.remove = fastrpc_cb_remove,  	.driver = {  		.name = "qcom,fastrpc-cb",  		.of_match_table = fastrpc_match_table, @@ -2505,4 +2505,4 @@ module_exit(fastrpc_exit);  MODULE_DESCRIPTION("Qualcomm FastRPC");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF"); diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c index fb9be37057a8..ffe7b945a298 100644 --- a/drivers/misc/hisi_hikey_usb.c +++ b/drivers/misc/hisi_hikey_usb.c @@ -260,7 +260,7 @@ MODULE_DEVICE_TABLE(of, id_table_hisi_hikey_usb);  static struct platform_driver hisi_hikey_usb_driver = {  	.probe = hisi_hikey_usb_probe, -	.remove_new = hisi_hikey_usb_remove, +	.remove = hisi_hikey_usb_remove,  	.driver = {  		.name = DEVICE_DRIVER_NAME,  		.of_match_table = id_table_hisi_hikey_usb, diff --git a/drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c b/drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c index e616e3ec2b42..3c1359d8d4e6 100644 --- a/drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c +++ b/drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c @@ -148,7 +148,7 @@ static int pci1xxxx_gpio_set_config(struct gpio_chip *gpio, unsigned int offset,  		pci1xxx_assign_bit(priv->reg_base, OPENDRAIN_OFFSET(offset), (offset % 32), true);  		break;  	default: -		ret = -EOPNOTSUPP; +		ret = -ENOTSUPP;  		break;  	}  	spin_unlock_irqrestore(&priv->lock, flags); @@ -277,7 +277,7 @@ static irqreturn_t pci1xxxx_gpio_irq_handler(int irq, void *dev_id)  			writel(BIT(bit), priv->reg_base + INTR_STATUS_OFFSET(gpiobank));  			spin_unlock_irqrestore(&priv->lock, flags);  			irq = irq_find_mapping(gc->irq.domain, (bit + (gpiobank * 32))); -			generic_handle_irq(irq); +			handle_nested_irq(irq);  		}  	}  	spin_lock_irqsave(&priv->lock, flags); diff --git a/drivers/misc/mei/platform-vsc.c b/drivers/misc/mei/platform-vsc.c index 71f9994da2cc..435760b1e86f 100644 --- a/drivers/misc/mei/platform-vsc.c +++ b/drivers/misc/mei/platform-vsc.c @@ -435,7 +435,7 @@ MODULE_DEVICE_TABLE(platform, mei_vsc_id_table);  static struct platform_driver mei_vsc_drv = {  	.probe = mei_vsc_probe, -	.remove_new = mei_vsc_remove, +	.remove = mei_vsc_remove,  	.id_table = mei_vsc_id_table,  	.driver = {  		.name = MEI_VSC_DRV_NAME, @@ -449,4 +449,4 @@ MODULE_AUTHOR("Wentong Wu <wentong.wu@intel.com>");  MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");  MODULE_DESCRIPTION("Intel Visual Sensing Controller Interface");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(VSC_TP); +MODULE_IMPORT_NS("VSC_TP"); diff --git a/drivers/misc/mei/vsc-fw-loader.c b/drivers/misc/mei/vsc-fw-loader.c index 308b090d81bb..43abefa806e1 100644 --- a/drivers/misc/mei/vsc-fw-loader.c +++ b/drivers/misc/mei/vsc-fw-loader.c @@ -773,4 +773,4 @@ err_release_csi:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_init, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_init, "VSC_TP"); diff --git a/drivers/misc/mei/vsc-tp.c b/drivers/misc/mei/vsc-tp.c index 107177b05dcd..35d349fee769 100644 --- a/drivers/misc/mei/vsc-tp.c +++ b/drivers/misc/mei/vsc-tp.c @@ -299,7 +299,7 @@ int vsc_tp_xfer(struct vsc_tp *tp, u8 cmd, const void *obuf, size_t olen,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_xfer, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_xfer, "VSC_TP");  /**   * vsc_tp_rom_xfer - transfer data to rom code @@ -365,7 +365,7 @@ void vsc_tp_reset(struct vsc_tp *tp)  	atomic_set(&tp->assert_cnt, 0);  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_reset, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_reset, "VSC_TP");  /**   * vsc_tp_need_read - check if device has data to sent @@ -383,7 +383,7 @@ bool vsc_tp_need_read(struct vsc_tp *tp)  	return true;  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_need_read, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_need_read, "VSC_TP");  /**   * vsc_tp_register_event_cb - register a callback function to receive event @@ -400,7 +400,7 @@ int vsc_tp_register_event_cb(struct vsc_tp *tp, vsc_tp_event_cb_t event_cb,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_register_event_cb, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_register_event_cb, "VSC_TP");  /**   * vsc_tp_request_irq - request irq for vsc_tp device @@ -421,7 +421,7 @@ int vsc_tp_request_irq(struct vsc_tp *tp)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_request_irq, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_request_irq, "VSC_TP");  /**   * vsc_tp_free_irq - free irq for vsc_tp device @@ -431,7 +431,7 @@ void vsc_tp_free_irq(struct vsc_tp *tp)  {  	free_irq(tp->spi->irq, tp);  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_free_irq, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_free_irq, "VSC_TP");  /**   * vsc_tp_intr_synchronize - synchronize vsc_tp interrupt @@ -441,7 +441,7 @@ void vsc_tp_intr_synchronize(struct vsc_tp *tp)  {  	synchronize_irq(tp->spi->irq);  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_intr_synchronize, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_intr_synchronize, "VSC_TP");  /**   * vsc_tp_intr_enable - enable vsc_tp interrupt @@ -451,7 +451,7 @@ void vsc_tp_intr_enable(struct vsc_tp *tp)  {  	enable_irq(tp->spi->irq);  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_intr_enable, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_intr_enable, "VSC_TP");  /**   * vsc_tp_intr_disable - disable vsc_tp interrupt @@ -461,7 +461,7 @@ void vsc_tp_intr_disable(struct vsc_tp *tp)  {  	disable_irq(tp->spi->irq);  } -EXPORT_SYMBOL_NS_GPL(vsc_tp_intr_disable, VSC_TP); +EXPORT_SYMBOL_NS_GPL(vsc_tp_intr_disable, "VSC_TP");  static int vsc_tp_match_any(struct acpi_device *adev, void *data)  { diff --git a/drivers/misc/open-dice.c b/drivers/misc/open-dice.c index e6a61e6d9427..24c29e0f00ef 100644 --- a/drivers/misc/open-dice.c +++ b/drivers/misc/open-dice.c @@ -178,7 +178,7 @@ static const struct of_device_id open_dice_of_match[] = {  };  static struct platform_driver open_dice_driver = { -	.remove_new = open_dice_remove, +	.remove = open_dice_remove,  	.driver = {  		.name = DRIVER_NAME,  		.of_match_table = open_dice_of_match, diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c index 546eb06a40d0..e40b027a88e2 100644 --- a/drivers/misc/sram.c +++ b/drivers/misc/sram.c @@ -451,7 +451,7 @@ static struct platform_driver sram_driver = {  		.of_match_table = sram_dt_ids,  	},  	.probe = sram_probe, -	.remove_new = sram_remove, +	.remove = sram_remove,  };  static int __init sram_init(void) diff --git a/drivers/misc/tps6594-esm.c b/drivers/misc/tps6594-esm.c index b4d67a1a24e4..2fbd3fbdf713 100644 --- a/drivers/misc/tps6594-esm.c +++ b/drivers/misc/tps6594-esm.c @@ -135,7 +135,7 @@ static struct platform_driver tps6594_esm_driver = {  		.pm = pm_sleep_ptr(&tps6594_esm_pm_ops),  	},  	.probe = tps6594_esm_probe, -	.remove_new = tps6594_esm_remove, +	.remove = tps6594_esm_remove,  };  module_platform_driver(tps6594_esm_driver); diff --git a/drivers/misc/tps6594-pfsm.c b/drivers/misc/tps6594-pfsm.c index 9bcca1856bfe..0a24ce44cc37 100644 --- a/drivers/misc/tps6594-pfsm.c +++ b/drivers/misc/tps6594-pfsm.c @@ -314,7 +314,7 @@ static struct platform_driver tps6594_pfsm_driver = {  		.name = "tps6594-pfsm",  	},  	.probe = tps6594_pfsm_probe, -	.remove_new = tps6594_pfsm_remove, +	.remove = tps6594_pfsm_remove,  };  module_platform_driver(tps6594_pfsm_driver); diff --git a/drivers/misc/vcpu_stall_detector.c b/drivers/misc/vcpu_stall_detector.c index 41b8c2119e20..f0b1fc87490e 100644 --- a/drivers/misc/vcpu_stall_detector.c +++ b/drivers/misc/vcpu_stall_detector.c @@ -233,7 +233,7 @@ MODULE_DEVICE_TABLE(of, vcpu_stall_detect_of_match);  static struct platform_driver vcpu_stall_detect_driver = {  	.probe  = vcpu_stall_detect_probe, -	.remove_new = vcpu_stall_detect_remove, +	.remove = vcpu_stall_detect_remove,  	.driver = {  		.name           = KBUILD_MODNAME,  		.of_match_table = vcpu_stall_detect_of_match, diff --git a/drivers/misc/xilinx_sdfec.c b/drivers/misc/xilinx_sdfec.c index ea433695f4c4..3135ba3a58ee 100644 --- a/drivers/misc/xilinx_sdfec.c +++ b/drivers/misc/xilinx_sdfec.c @@ -1444,7 +1444,7 @@ static struct platform_driver xsdfec_driver = {  		.of_match_table = xsdfec_of_match,  	},  	.probe = xsdfec_probe, -	.remove_new =  xsdfec_remove, +	.remove = xsdfec_remove,  };  module_platform_driver(xsdfec_driver); diff --git a/drivers/misc/xilinx_tmr_inject.c b/drivers/misc/xilinx_tmr_inject.c index 734fdfac19ef..6284606ffb9f 100644 --- a/drivers/misc/xilinx_tmr_inject.c +++ b/drivers/misc/xilinx_tmr_inject.c @@ -164,7 +164,7 @@ static struct platform_driver xtmr_inject_driver = {  		.of_match_table = xtmr_inject_of_match,  	},  	.probe = xtmr_inject_probe, -	.remove_new = xtmr_inject_remove, +	.remove = xtmr_inject_remove,  };  module_platform_driver(xtmr_inject_driver);  MODULE_AUTHOR("Advanced Micro Devices, Inc"); diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 9283b28bc69f..1cf64e0952fb 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c @@ -149,6 +149,8 @@ static void mmc_bus_shutdown(struct device *dev)  	if (dev->driver && drv->shutdown)  		drv->shutdown(card); +	__mmc_stop_host(host); +  	if (host->bus_ops->shutdown) {  		ret = host->bus_ops->shutdown(host);  		if (ret) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index a499f3c59de5..d996d39c0d6f 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2335,6 +2335,9 @@ void mmc_start_host(struct mmc_host *host)  void __mmc_stop_host(struct mmc_host *host)  { +	if (host->rescan_disable) +		return; +  	if (host->slot.cd_irq >= 0) {  		mmc_gpio_set_cd_wake(host, false);  		disable_irq(host->slot.cd_irq); diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index efb0d2d5716b..af445d3f8e2a 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -3070,6 +3070,7 @@ release_clk:  	msdc_gate_clock(host);  	platform_set_drvdata(pdev, NULL);  release_mem: +	device_init_wakeup(&pdev->dev, false);  	if (host->dma.gpd)  		dma_free_coherent(&pdev->dev,  			2 * sizeof(struct mt_gpdma_desc), @@ -3103,6 +3104,7 @@ static void msdc_drv_remove(struct platform_device *pdev)  			host->dma.gpd, host->dma.gpd_addr);  	dma_free_coherent(&pdev->dev, MAX_BD_NUM * sizeof(struct mt_bdma_desc),  			  host->dma.bd, host->dma.bd_addr); +	device_init_wakeup(&pdev->dev, false);  }  static void msdc_save_reg(struct msdc_host *host) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index e00208535bd1..319f0ebbe652 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1867,20 +1867,20 @@ static int sdhci_msm_program_key(struct cqhci_host *cq_host,  	struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host);  	union cqhci_crypto_cap_entry cap; +	if (!(cfg->config_enable & CQHCI_CRYPTO_CONFIGURATION_ENABLE)) +		return qcom_ice_evict_key(msm_host->ice, slot); +  	/* Only AES-256-XTS has been tested so far. */  	cap = cq_host->crypto_cap_array[cfg->crypto_cap_idx];  	if (cap.algorithm_id != CQHCI_CRYPTO_ALG_AES_XTS ||  		cap.key_size != CQHCI_CRYPTO_KEY_SIZE_256)  		return -EINVAL; -	if (cfg->config_enable & CQHCI_CRYPTO_CONFIGURATION_ENABLE) -		return qcom_ice_program_key(msm_host->ice, -					    QCOM_ICE_CRYPTO_ALG_AES_XTS, -					    QCOM_ICE_CRYPTO_KEY_SIZE_256, -					    cfg->crypto_key, -					    cfg->data_unit_size, slot); -	else -		return qcom_ice_evict_key(msm_host->ice, slot); +	return qcom_ice_program_key(msm_host->ice, +				    QCOM_ICE_CRYPTO_ALG_AES_XTS, +				    QCOM_ICE_CRYPTO_KEY_SIZE_256, +				    cfg->crypto_key, +				    cfg->data_unit_size, slot);  }  #else /* CONFIG_MMC_CRYPTO */ diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 2b300bc4a701..1f0bd723f011 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -21,6 +21,7 @@  #include <linux/io.h>  #include <linux/iopoll.h>  #include <linux/gpio.h> +#include <linux/gpio/machine.h>  #include <linux/pm_runtime.h>  #include <linux/pm_qos.h>  #include <linux/debugfs.h> @@ -1236,6 +1237,29 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = {  	.priv_size	= sizeof(struct intel_host),  }; +/* DMI quirks for devices with missing or broken CD GPIO info */ +static const struct gpiod_lookup_table vexia_edu_atla10_cd_gpios = { +	.dev_id = "0000:00:12.0", +	.table = { +		GPIO_LOOKUP("INT33FC:00", 38, "cd", GPIO_ACTIVE_HIGH), +		{ } +	}, +}; + +static const struct dmi_system_id sdhci_intel_byt_cd_gpio_override[] = { +	{ +		/* Vexia Edu Atla 10 tablet 9V version */ +		.matches = { +			DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), +			DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), +			/* Above strings are too generic, also match on BIOS date */ +			DMI_MATCH(DMI_BIOS_DATE, "08/25/2014"), +		}, +		.driver_data = (void *)&vexia_edu_atla10_cd_gpios, +	}, +	{ } +}; +  static const struct sdhci_pci_fixes sdhci_intel_byt_sd = {  #ifdef CONFIG_PM_SLEEP  	.resume		= byt_resume, @@ -1254,6 +1278,7 @@ static const struct sdhci_pci_fixes sdhci_intel_byt_sd = {  	.add_host	= byt_add_host,  	.remove_slot	= byt_remove_slot,  	.ops		= &sdhci_intel_byt_ops, +	.cd_gpio_override = sdhci_intel_byt_cd_gpio_override,  	.priv_size	= sizeof(struct intel_host),  }; @@ -2055,6 +2080,42 @@ static const struct dev_pm_ops sdhci_pci_pm_ops = {   *                                                                           *  \*****************************************************************************/ +static struct gpiod_lookup_table *sdhci_pci_add_gpio_lookup_table( +	struct sdhci_pci_chip *chip) +{ +	struct gpiod_lookup_table *cd_gpio_lookup_table; +	const struct dmi_system_id *dmi_id = NULL; +	size_t count; + +	if (chip->fixes && chip->fixes->cd_gpio_override) +		dmi_id = dmi_first_match(chip->fixes->cd_gpio_override); + +	if (!dmi_id) +		return NULL; + +	cd_gpio_lookup_table = dmi_id->driver_data; +	for (count = 0; cd_gpio_lookup_table->table[count].key; count++) +		; + +	cd_gpio_lookup_table = kmemdup(dmi_id->driver_data, +				       /* count + 1 terminating entry */ +				       struct_size(cd_gpio_lookup_table, table, count + 1), +				       GFP_KERNEL); +	if (!cd_gpio_lookup_table) +		return ERR_PTR(-ENOMEM); + +	gpiod_add_lookup_table(cd_gpio_lookup_table); +	return cd_gpio_lookup_table; +} + +static void sdhci_pci_remove_gpio_lookup_table(struct gpiod_lookup_table *lookup_table) +{ +	if (lookup_table) { +		gpiod_remove_lookup_table(lookup_table); +		kfree(lookup_table); +	} +} +  static struct sdhci_pci_slot *sdhci_pci_probe_slot(  	struct pci_dev *pdev, struct sdhci_pci_chip *chip, int first_bar,  	int slotno) @@ -2130,8 +2191,19 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot(  		device_init_wakeup(&pdev->dev, true);  	if (slot->cd_idx >= 0) { +		struct gpiod_lookup_table *cd_gpio_lookup_table; + +		cd_gpio_lookup_table = sdhci_pci_add_gpio_lookup_table(chip); +		if (IS_ERR(cd_gpio_lookup_table)) { +			ret = PTR_ERR(cd_gpio_lookup_table); +			goto remove; +		} +  		ret = mmc_gpiod_request_cd(host->mmc, "cd", slot->cd_idx,  					   slot->cd_override_level, 0); + +		sdhci_pci_remove_gpio_lookup_table(cd_gpio_lookup_table); +  		if (ret && ret != -EPROBE_DEFER)  			ret = mmc_gpiod_request_cd(host->mmc, NULL,  						   slot->cd_idx, diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h index e807c039a8b1..f38f0bd4165c 100644 --- a/drivers/mmc/host/sdhci-pci.h +++ b/drivers/mmc/host/sdhci-pci.h @@ -157,6 +157,7 @@ struct sdhci_pci_fixes {  #endif  	const struct sdhci_ops	*ops; +	const struct dmi_system_id *cd_gpio_override;  	size_t			priv_size;  }; diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 4d402b601883..b2f5c3f8b839 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -1525,7 +1525,6 @@ static const struct sdhci_pltfm_data sdhci_tegra186_pdata = {  	.quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |  		  SDHCI_QUIRK_SINGLE_POWER_WRITE |  		  SDHCI_QUIRK_NO_HISPD_BIT | -		  SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC |  		  SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,  	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |  		   SDHCI_QUIRK2_ISSUE_CMD_DAT_RESET_TOGETHER, diff --git a/drivers/mtd/nand/raw/arasan-nand-controller.c b/drivers/mtd/nand/raw/arasan-nand-controller.c index db42aa0c7b6b..865754737f5f 100644 --- a/drivers/mtd/nand/raw/arasan-nand-controller.c +++ b/drivers/mtd/nand/raw/arasan-nand-controller.c @@ -1409,8 +1409,8 @@ static int anfc_parse_cs(struct arasan_nfc *nfc)  	 * case, the "not" chosen CS is assigned to nfc->spare_cs and selected  	 * whenever a GPIO CS must be asserted.  	 */ -	if (nfc->cs_array && nfc->ncs > 2) { -		if (!nfc->cs_array[0] && !nfc->cs_array[1]) { +	if (nfc->cs_array) { +		if (nfc->ncs > 2 && !nfc->cs_array[0] && !nfc->cs_array[1]) {  			dev_err(nfc->dev,  				"Assign a single native CS when using GPIOs\n");  			return -EINVAL; @@ -1478,8 +1478,15 @@ static int anfc_probe(struct platform_device *pdev)  static void anfc_remove(struct platform_device *pdev)  { +	int i;  	struct arasan_nfc *nfc = platform_get_drvdata(pdev); +	for (i = 0; i < nfc->ncs; i++) { +		if (nfc->cs_array[i]) { +			gpiod_put(nfc->cs_array[i]); +		} +	} +  	anfc_chips_cleanup(nfc);  } diff --git a/drivers/mtd/nand/raw/atmel/pmecc.c b/drivers/mtd/nand/raw/atmel/pmecc.c index a22aab4ed4e8..3c7dee1be21d 100644 --- a/drivers/mtd/nand/raw/atmel/pmecc.c +++ b/drivers/mtd/nand/raw/atmel/pmecc.c @@ -380,10 +380,8 @@ atmel_pmecc_create_user(struct atmel_pmecc *pmecc,  	user->delta = user->dmu + req->ecc.strength + 1;  	gf_tables = atmel_pmecc_get_gf_tables(req); -	if (IS_ERR(gf_tables)) { -		kfree(user); +	if (IS_ERR(gf_tables))  		return ERR_CAST(gf_tables); -	}  	user->gf_tables = gf_tables; diff --git a/drivers/mtd/nand/raw/diskonchip.c b/drivers/mtd/nand/raw/diskonchip.c index 8db7fc424571..70d6c2250f32 100644 --- a/drivers/mtd/nand/raw/diskonchip.c +++ b/drivers/mtd/nand/raw/diskonchip.c @@ -1098,7 +1098,7 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti  		    (i == 0) && (ip->firstUnit > 0)) {  			parts[0].name = " DiskOnChip IPL / Media Header partition";  			parts[0].offset = 0; -			parts[0].size = mtd->erasesize * ip->firstUnit; +			parts[0].size = (uint64_t)mtd->erasesize * ip->firstUnit;  			numparts = 1;  		} diff --git a/drivers/mtd/nand/raw/omap2.c b/drivers/mtd/nand/raw/omap2.c index d9141f3c0dd1..b8af3a3533fc 100644 --- a/drivers/mtd/nand/raw/omap2.c +++ b/drivers/mtd/nand/raw/omap2.c @@ -254,6 +254,10 @@ static int omap_prefetch_reset(int cs, struct omap_nand_info *info)  /**   * omap_nand_data_in_pref - NAND data in using prefetch engine + * @chip: NAND chip + * @buf: output buffer where NAND data is placed into + * @len: length of transfer + * @force_8bit: force 8-bit transfers   */  static void omap_nand_data_in_pref(struct nand_chip *chip, void *buf,  				   unsigned int len, bool force_8bit) @@ -297,6 +301,10 @@ static void omap_nand_data_in_pref(struct nand_chip *chip, void *buf,  /**   * omap_nand_data_out_pref - NAND data out using Write Posting engine + * @chip: NAND chip + * @buf: input buffer that is sent to NAND + * @len: length of transfer + * @force_8bit: force 8-bit transfers   */  static void omap_nand_data_out_pref(struct nand_chip *chip,  				    const void *buf, unsigned int len, @@ -440,6 +448,10 @@ out_copy:  /**   * omap_nand_data_in_dma_pref - NAND data in using DMA and Prefetch + * @chip: NAND chip + * @buf: output buffer where NAND data is placed into + * @len: length of transfer + * @force_8bit: force 8-bit transfers   */  static void omap_nand_data_in_dma_pref(struct nand_chip *chip, void *buf,  				       unsigned int len, bool force_8bit) @@ -460,6 +472,10 @@ static void omap_nand_data_in_dma_pref(struct nand_chip *chip, void *buf,  /**   * omap_nand_data_out_dma_pref - NAND data out using DMA and write posting + * @chip: NAND chip + * @buf: input buffer that is sent to NAND + * @len: length of transfer + * @force_8bit: force 8-bit transfers   */  static void omap_nand_data_out_dma_pref(struct nand_chip *chip,  					const void *buf, unsigned int len, diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index 66949d9f0cc5..b6f374ded390 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -89,7 +89,7 @@ void spi_nor_spimem_setup_op(const struct spi_nor *nor,  		op->addr.buswidth = spi_nor_get_protocol_addr_nbits(proto);  	if (op->dummy.nbytes) -		op->dummy.buswidth = spi_nor_get_protocol_data_nbits(proto); +		op->dummy.buswidth = spi_nor_get_protocol_addr_nbits(proto);  	if (op->data.nbytes)  		op->data.buswidth = spi_nor_get_protocol_data_nbits(proto); diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 49dd4fe195e5..7b78c2bada81 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1520,9 +1520,7 @@ static netdev_features_t bond_fix_features(struct net_device *dev,  	struct slave *slave;  	mask = features; - -	features &= ~NETIF_F_ONE_FOR_ALL; -	features |= NETIF_F_ALL_FOR_ALL; +	features = netdev_base_features(features);  	bond_for_each_slave(bond, slave, iter) {  		features = netdev_increment_features(features, @@ -1536,6 +1534,7 @@ static netdev_features_t bond_fix_features(struct net_device *dev,  #define BOND_VLAN_FEATURES	(NETIF_F_HW_CSUM | NETIF_F_SG | \  				 NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \ +				 NETIF_F_GSO_ENCAP_ALL | \  				 NETIF_F_HIGHDMA | NETIF_F_LRO)  #define BOND_ENC_FEATURES	(NETIF_F_HW_CSUM | NETIF_F_SG | \ @@ -1565,8 +1564,9 @@ static void bond_compute_features(struct bonding *bond)  	if (!bond_has_slaves(bond))  		goto done; -	vlan_features &= NETIF_F_ALL_FOR_ALL; -	mpls_features &= NETIF_F_ALL_FOR_ALL; + +	vlan_features = netdev_base_features(vlan_features); +	mpls_features = netdev_base_features(mpls_features);  	bond_for_each_slave(bond, slave, iter) {  		vlan_features = netdev_increment_features(vlan_features, diff --git a/drivers/net/can/c_can/c_can_main.c b/drivers/net/can/c_can/c_can_main.c index 511615dc3341..cc371d0c9f3c 100644 --- a/drivers/net/can/c_can/c_can_main.c +++ b/drivers/net/can/c_can/c_can_main.c @@ -1014,49 +1014,57 @@ static int c_can_handle_bus_err(struct net_device *dev,  	/* propagate the error condition to the CAN stack */  	skb = alloc_can_err_skb(dev, &cf); -	if (unlikely(!skb)) -		return 0;  	/* check for 'last error code' which tells us the  	 * type of the last error to occur on the CAN bus  	 */ -	cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; +	if (likely(skb)) +		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;  	switch (lec_type) {  	case LEC_STUFF_ERROR:  		netdev_dbg(dev, "stuff error\n"); -		cf->data[2] |= CAN_ERR_PROT_STUFF; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_STUFF;  		stats->rx_errors++;  		break;  	case LEC_FORM_ERROR:  		netdev_dbg(dev, "form error\n"); -		cf->data[2] |= CAN_ERR_PROT_FORM; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_FORM;  		stats->rx_errors++;  		break;  	case LEC_ACK_ERROR:  		netdev_dbg(dev, "ack error\n"); -		cf->data[3] = CAN_ERR_PROT_LOC_ACK; +		if (likely(skb)) +			cf->data[3] = CAN_ERR_PROT_LOC_ACK;  		stats->tx_errors++;  		break;  	case LEC_BIT1_ERROR:  		netdev_dbg(dev, "bit1 error\n"); -		cf->data[2] |= CAN_ERR_PROT_BIT1; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_BIT1;  		stats->tx_errors++;  		break;  	case LEC_BIT0_ERROR:  		netdev_dbg(dev, "bit0 error\n"); -		cf->data[2] |= CAN_ERR_PROT_BIT0; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_BIT0;  		stats->tx_errors++;  		break;  	case LEC_CRC_ERROR:  		netdev_dbg(dev, "CRC error\n"); -		cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; +		if (likely(skb)) +			cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;  		stats->rx_errors++;  		break;  	default:  		break;  	} +	if (unlikely(!skb)) +		return 0; +  	netif_receive_skb(skb);  	return 1;  } diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c index 6792c14fd7eb..681643ab3780 100644 --- a/drivers/net/can/dev/dev.c +++ b/drivers/net/can/dev/dev.c @@ -468,7 +468,7 @@ static int can_set_termination(struct net_device *ndev, u16 term)  	else  		set = 0; -	gpiod_set_value(priv->termination_gpio, set); +	gpiod_set_value_cansleep(priv->termination_gpio, set);  	return 0;  } diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c index d32b10900d2f..c86b57d47085 100644 --- a/drivers/net/can/ifi_canfd/ifi_canfd.c +++ b/drivers/net/can/ifi_canfd/ifi_canfd.c @@ -390,36 +390,55 @@ static int ifi_canfd_handle_lec_err(struct net_device *ndev)  		return 0;  	priv->can.can_stats.bus_error++; -	stats->rx_errors++;  	/* Propagate the error condition to the CAN stack. */  	skb = alloc_can_err_skb(ndev, &cf); -	if (unlikely(!skb)) -		return 0;  	/* Read the error counter register and check for new errors. */ -	cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; +	if (likely(skb)) +		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; -	if (errctr & IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST) -		cf->data[2] |= CAN_ERR_PROT_OVERLOAD; +	if (errctr & IFI_CANFD_ERROR_CTR_OVERLOAD_FIRST) { +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_OVERLOAD; +	} -	if (errctr & IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST) -		cf->data[3] = CAN_ERR_PROT_LOC_ACK; +	if (errctr & IFI_CANFD_ERROR_CTR_ACK_ERROR_FIRST) { +		stats->tx_errors++; +		if (likely(skb)) +			cf->data[3] = CAN_ERR_PROT_LOC_ACK; +	} -	if (errctr & IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST) -		cf->data[2] |= CAN_ERR_PROT_BIT0; +	if (errctr & IFI_CANFD_ERROR_CTR_BIT0_ERROR_FIRST) { +		stats->tx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_BIT0; +	} -	if (errctr & IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST) -		cf->data[2] |= CAN_ERR_PROT_BIT1; +	if (errctr & IFI_CANFD_ERROR_CTR_BIT1_ERROR_FIRST) { +		stats->tx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_BIT1; +	} -	if (errctr & IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST) -		cf->data[2] |= CAN_ERR_PROT_STUFF; +	if (errctr & IFI_CANFD_ERROR_CTR_STUFF_ERROR_FIRST) { +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_STUFF; +	} -	if (errctr & IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST) -		cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; +	if (errctr & IFI_CANFD_ERROR_CTR_CRC_ERROR_FIRST) { +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; +	} -	if (errctr & IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST) -		cf->data[2] |= CAN_ERR_PROT_FORM; +	if (errctr & IFI_CANFD_ERROR_CTR_FORM_ERROR_FIRST) { +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_FORM; +	}  	/* Reset the error counter, ack the IRQ and re-enable the counter. */  	writel(IFI_CANFD_ERROR_CTR_ER_RESET, priv->base + IFI_CANFD_ERROR_CTR); @@ -427,6 +446,9 @@ static int ifi_canfd_handle_lec_err(struct net_device *ndev)  	       priv->base + IFI_CANFD_INTERRUPT);  	writel(IFI_CANFD_ERROR_CTR_ER_ENABLE, priv->base + IFI_CANFD_ERROR_CTR); +	if (unlikely(!skb)) +		return 0; +  	netif_receive_skb(skb);  	return 1; diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 16e9e7d7527d..97cd8bbf2e32 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -695,47 +695,60 @@ static int m_can_handle_lec_err(struct net_device *dev,  	u32 timestamp = 0;  	cdev->can.can_stats.bus_error++; -	stats->rx_errors++;  	/* propagate the error condition to the CAN stack */  	skb = alloc_can_err_skb(dev, &cf); -	if (unlikely(!skb)) -		return 0;  	/* check for 'last error code' which tells us the  	 * type of the last error to occur on the CAN bus  	 */ -	cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; +	if (likely(skb)) +		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;  	switch (lec_type) {  	case LEC_STUFF_ERROR:  		netdev_dbg(dev, "stuff error\n"); -		cf->data[2] |= CAN_ERR_PROT_STUFF; +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_STUFF;  		break;  	case LEC_FORM_ERROR:  		netdev_dbg(dev, "form error\n"); -		cf->data[2] |= CAN_ERR_PROT_FORM; +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_FORM;  		break;  	case LEC_ACK_ERROR:  		netdev_dbg(dev, "ack error\n"); -		cf->data[3] = CAN_ERR_PROT_LOC_ACK; +		stats->tx_errors++; +		if (likely(skb)) +			cf->data[3] = CAN_ERR_PROT_LOC_ACK;  		break;  	case LEC_BIT1_ERROR:  		netdev_dbg(dev, "bit1 error\n"); -		cf->data[2] |= CAN_ERR_PROT_BIT1; +		stats->tx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_BIT1;  		break;  	case LEC_BIT0_ERROR:  		netdev_dbg(dev, "bit0 error\n"); -		cf->data[2] |= CAN_ERR_PROT_BIT0; +		stats->tx_errors++; +		if (likely(skb)) +			cf->data[2] |= CAN_ERR_PROT_BIT0;  		break;  	case LEC_CRC_ERROR:  		netdev_dbg(dev, "CRC error\n"); -		cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; +		stats->rx_errors++; +		if (likely(skb)) +			cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;  		break;  	default:  		break;  	} +	if (unlikely(!skb)) +		return 0; +  	if (cdev->is_peripheral)  		timestamp = m_can_get_timestamp(cdev); @@ -1207,20 +1220,32 @@ static void m_can_coalescing_update(struct m_can_classdev *cdev, u32 ir)  static int m_can_interrupt_handler(struct m_can_classdev *cdev)  {  	struct net_device *dev = cdev->net; -	u32 ir; +	u32 ir = 0, ir_read;  	int ret;  	if (pm_runtime_suspended(cdev->dev))  		return IRQ_NONE; -	ir = m_can_read(cdev, M_CAN_IR); +	/* The m_can controller signals its interrupt status as a level, but +	 * depending in the integration the CPU may interpret the signal as +	 * edge-triggered (for example with m_can_pci). For these +	 * edge-triggered integrations, we must observe that IR is 0 at least +	 * once to be sure that the next interrupt will generate an edge. +	 */ +	while ((ir_read = m_can_read(cdev, M_CAN_IR)) != 0) { +		ir |= ir_read; + +		/* ACK all irqs */ +		m_can_write(cdev, M_CAN_IR, ir); + +		if (!cdev->irq_edge_triggered) +			break; +	} +  	m_can_coalescing_update(cdev, ir);  	if (!ir)  		return IRQ_NONE; -	/* ACK all irqs */ -	m_can_write(cdev, M_CAN_IR, ir); -  	if (cdev->ops->clear_interrupts)  		cdev->ops->clear_interrupts(cdev); @@ -1682,6 +1707,14 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)  		return -EINVAL;  	} +	/* Write the INIT bit, in case no hardware reset has happened before +	 * the probe (for example, it was observed that the Intel Elkhart Lake +	 * SoCs do not properly reset the CAN controllers on reboot) +	 */ +	err = m_can_cccr_update_bits(cdev, CCCR_INIT, CCCR_INIT); +	if (err) +		return err; +  	if (!cdev->is_peripheral)  		netif_napi_add(dev, &cdev->napi, m_can_poll); @@ -1733,11 +1766,7 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)  		return -EINVAL;  	} -	/* Forcing standby mode should be redundant, as the chip should be in -	 * standby after a reset. Write the INIT bit anyways, should the chip -	 * be configured by previous stage. -	 */ -	return m_can_cccr_update_bits(cdev, CCCR_INIT, CCCR_INIT); +	return 0;  }  static void m_can_stop(struct net_device *dev) diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h index 92b2bd8628e6..ef39e8e527ab 100644 --- a/drivers/net/can/m_can/m_can.h +++ b/drivers/net/can/m_can/m_can.h @@ -99,6 +99,7 @@ struct m_can_classdev {  	int pm_clock_support;  	int pm_wake_source;  	int is_peripheral; +	bool irq_edge_triggered;  	// Cached M_CAN_IE register content  	u32 active_interrupts; diff --git a/drivers/net/can/m_can/m_can_pci.c b/drivers/net/can/m_can/m_can_pci.c index d72fe771dfc7..9ad7419f88f8 100644 --- a/drivers/net/can/m_can/m_can_pci.c +++ b/drivers/net/can/m_can/m_can_pci.c @@ -127,6 +127,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)  	mcan_class->pm_clock_support = 1;  	mcan_class->pm_wake_source = 0;  	mcan_class->can.clock.freq = id->driver_data; +	mcan_class->irq_edge_triggered = true;  	mcan_class->ops = &m_can_pci_ops;  	pci_set_drvdata(pci, mcan_class); diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c index ddb3247948ad..4d245857ef1c 100644 --- a/drivers/net/can/sja1000/sja1000.c +++ b/drivers/net/can/sja1000/sja1000.c @@ -416,8 +416,6 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)  	int ret = 0;  	skb = alloc_can_err_skb(dev, &cf); -	if (skb == NULL) -		return -ENOMEM;  	txerr = priv->read_reg(priv, SJA1000_TXERR);  	rxerr = priv->read_reg(priv, SJA1000_RXERR); @@ -425,8 +423,11 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)  	if (isrc & IRQ_DOI) {  		/* data overrun interrupt */  		netdev_dbg(dev, "data overrun interrupt\n"); -		cf->can_id |= CAN_ERR_CRTL; -		cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; +		if (skb) { +			cf->can_id |= CAN_ERR_CRTL; +			cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; +		} +  		stats->rx_over_errors++;  		stats->rx_errors++;  		sja1000_write_cmdreg(priv, CMD_CDO);	/* clear bit */ @@ -452,7 +453,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)  		else  			state = CAN_STATE_ERROR_ACTIVE;  	} -	if (state != CAN_STATE_BUS_OFF) { +	if (state != CAN_STATE_BUS_OFF && skb) {  		cf->can_id |= CAN_ERR_CNT;  		cf->data[6] = txerr;  		cf->data[7] = rxerr; @@ -460,33 +461,38 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)  	if (isrc & IRQ_BEI) {  		/* bus error interrupt */  		priv->can.can_stats.bus_error++; -		stats->rx_errors++;  		ecc = priv->read_reg(priv, SJA1000_ECC); +		if (skb) { +			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; -		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; - -		/* set error type */ -		switch (ecc & ECC_MASK) { -		case ECC_BIT: -			cf->data[2] |= CAN_ERR_PROT_BIT; -			break; -		case ECC_FORM: -			cf->data[2] |= CAN_ERR_PROT_FORM; -			break; -		case ECC_STUFF: -			cf->data[2] |= CAN_ERR_PROT_STUFF; -			break; -		default: -			break; -		} +			/* set error type */ +			switch (ecc & ECC_MASK) { +			case ECC_BIT: +				cf->data[2] |= CAN_ERR_PROT_BIT; +				break; +			case ECC_FORM: +				cf->data[2] |= CAN_ERR_PROT_FORM; +				break; +			case ECC_STUFF: +				cf->data[2] |= CAN_ERR_PROT_STUFF; +				break; +			default: +				break; +			} -		/* set error location */ -		cf->data[3] = ecc & ECC_SEG; +			/* set error location */ +			cf->data[3] = ecc & ECC_SEG; +		}  		/* Error occurred during transmission? */ -		if ((ecc & ECC_DIR) == 0) -			cf->data[2] |= CAN_ERR_PROT_TX; +		if ((ecc & ECC_DIR) == 0) { +			stats->tx_errors++; +			if (skb) +				cf->data[2] |= CAN_ERR_PROT_TX; +		} else { +			stats->rx_errors++; +		}  	}  	if (isrc & IRQ_EPI) {  		/* error passive interrupt */ @@ -502,8 +508,10 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)  		netdev_dbg(dev, "arbitration lost interrupt\n");  		alc = priv->read_reg(priv, SJA1000_ALC);  		priv->can.can_stats.arbitration_lost++; -		cf->can_id |= CAN_ERR_LOSTARB; -		cf->data[0] = alc & 0x1f; +		if (skb) { +			cf->can_id |= CAN_ERR_LOSTARB; +			cf->data[0] = alc & 0x1f; +		}  	}  	if (state != priv->can.state) { @@ -516,6 +524,9 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status)  			can_bus_off(dev);  	} +	if (!skb) +		return -ENOMEM; +  	netif_rx(skb);  	return ret; diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c index 148d974ebb21..09ae218315d7 100644 --- a/drivers/net/can/spi/hi311x.c +++ b/drivers/net/can/spi/hi311x.c @@ -663,27 +663,27 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)  			u8 rxerr, txerr;  			skb = alloc_can_err_skb(net, &cf); -			if (!skb) -				break;  			txerr = hi3110_read(spi, HI3110_READ_TEC);  			rxerr = hi3110_read(spi, HI3110_READ_REC);  			tx_state = txerr >= rxerr ? new_state : 0;  			rx_state = txerr <= rxerr ? new_state : 0;  			can_change_state(net, cf, tx_state, rx_state); -			netif_rx(skb);  			if (new_state == CAN_STATE_BUS_OFF) { +				if (skb) +					netif_rx(skb);  				can_bus_off(net);  				if (priv->can.restart_ms == 0) {  					priv->force_quit = 1;  					hi3110_hw_sleep(spi);  					break;  				} -			} else { +			} else if (skb) {  				cf->can_id |= CAN_ERR_CNT;  				cf->data[6] = txerr;  				cf->data[7] = rxerr; +				netif_rx(skb);  			}  		} @@ -696,27 +696,38 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id)  			/* Check for protocol errors */  			if (eflag & HI3110_ERR_PROTOCOL_MASK) {  				skb = alloc_can_err_skb(net, &cf); -				if (!skb) -					break; +				if (skb) +					cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; -				cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;  				priv->can.can_stats.bus_error++; -				priv->net->stats.rx_errors++; -				if (eflag & HI3110_ERR_BITERR) -					cf->data[2] |= CAN_ERR_PROT_BIT; -				else if (eflag & HI3110_ERR_FRMERR) -					cf->data[2] |= CAN_ERR_PROT_FORM; -				else if (eflag & HI3110_ERR_STUFERR) -					cf->data[2] |= CAN_ERR_PROT_STUFF; -				else if (eflag & HI3110_ERR_CRCERR) -					cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; -				else if (eflag & HI3110_ERR_ACKERR) -					cf->data[3] |= CAN_ERR_PROT_LOC_ACK; - -				cf->data[6] = hi3110_read(spi, HI3110_READ_TEC); -				cf->data[7] = hi3110_read(spi, HI3110_READ_REC); +				if (eflag & HI3110_ERR_BITERR) { +					priv->net->stats.tx_errors++; +					if (skb) +						cf->data[2] |= CAN_ERR_PROT_BIT; +				} else if (eflag & HI3110_ERR_FRMERR) { +					priv->net->stats.rx_errors++; +					if (skb) +						cf->data[2] |= CAN_ERR_PROT_FORM; +				} else if (eflag & HI3110_ERR_STUFERR) { +					priv->net->stats.rx_errors++; +					if (skb) +						cf->data[2] |= CAN_ERR_PROT_STUFF; +				} else if (eflag & HI3110_ERR_CRCERR) { +					priv->net->stats.rx_errors++; +					if (skb) +						cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; +				} else if (eflag & HI3110_ERR_ACKERR) { +					priv->net->stats.tx_errors++; +					if (skb) +						cf->data[3] |= CAN_ERR_PROT_LOC_ACK; +				} +  				netdev_dbg(priv->net, "Bus Error\n"); -				netif_rx(skb); +				if (skb) { +					cf->data[6] = hi3110_read(spi, HI3110_READ_TEC); +					cf->data[7] = hi3110_read(spi, HI3110_READ_REC); +					netif_rx(skb); +				}  			}  		} diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c index d3ac865933fd..e94321849fd7 100644 --- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c +++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c @@ -21,6 +21,11 @@ static inline bool mcp251xfd_tx_fifo_sta_empty(u32 fifo_sta)  	return fifo_sta & MCP251XFD_REG_FIFOSTA_TFERFFIF;  } +static inline bool mcp251xfd_tx_fifo_sta_less_than_half_full(u32 fifo_sta) +{ +	return fifo_sta & MCP251XFD_REG_FIFOSTA_TFHRFHIF; +} +  static inline int  mcp251xfd_tef_tail_get_from_chip(const struct mcp251xfd_priv *priv,  				 u8 *tef_tail) @@ -147,7 +152,29 @@ mcp251xfd_get_tef_len(struct mcp251xfd_priv *priv, u8 *len_p)  	BUILD_BUG_ON(sizeof(tx_ring->obj_num) != sizeof(len));  	len = (chip_tx_tail << shift) - (tail << shift); -	*len_p = len >> shift; +	len >>= shift; + +	/* According to mcp2518fd erratum DS80000789E 6. the FIFOCI +	 * bits of a FIFOSTA register, here the TX-FIFO tail index +	 * might be corrupted. +	 * +	 * However here it seems the bit indicating that the TX-FIFO +	 * is empty (MCP251XFD_REG_FIFOSTA_TFERFFIF) is not correct +	 * while the TX-FIFO tail index is. +	 * +	 * We assume the TX-FIFO is empty, i.e. all pending CAN frames +	 * haven been send, if: +	 * - Chip's head and tail index are equal (len == 0). +	 * - The TX-FIFO is less than half full. +	 *   (The TX-FIFO empty case has already been checked at the +	 *    beginning of this function.) +	 * - No free buffers in the TX ring. +	 */ +	if (len == 0 && mcp251xfd_tx_fifo_sta_less_than_half_full(fifo_sta) && +	    mcp251xfd_get_tx_free(tx_ring) == 0) +		len = tx_ring->obj_num; + +	*len_p = len;  	return 0;  } diff --git a/drivers/net/can/sun4i_can.c b/drivers/net/can/sun4i_can.c index 360158c295d3..4311c1f0eafd 100644 --- a/drivers/net/can/sun4i_can.c +++ b/drivers/net/can/sun4i_can.c @@ -579,11 +579,9 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)  		/* bus error interrupt */  		netdev_dbg(dev, "bus error interrupt\n");  		priv->can.can_stats.bus_error++; -		stats->rx_errors++; +		ecc = readl(priv->base + SUN4I_REG_STA_ADDR);  		if (likely(skb)) { -			ecc = readl(priv->base + SUN4I_REG_STA_ADDR); -  			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;  			switch (ecc & SUN4I_STA_MASK_ERR) { @@ -601,9 +599,15 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)  					       >> 16;  				break;  			} -			/* error occurred during transmission? */ -			if ((ecc & SUN4I_STA_ERR_DIR) == 0) +		} + +		/* error occurred during transmission? */ +		if ((ecc & SUN4I_STA_ERR_DIR) == 0) { +			if (likely(skb))  				cf->data[2] |= CAN_ERR_PROT_TX; +			stats->tx_errors++; +		} else { +			stats->rx_errors++;  		}  	}  	if (isrc & SUN4I_INT_ERR_PASSIVE) { @@ -629,10 +633,10 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)  		tx_state = txerr >= rxerr ? state : 0;  		rx_state = txerr <= rxerr ? state : 0; -		if (likely(skb)) -			can_change_state(dev, cf, tx_state, rx_state); -		else -			priv->can.state = state; +		/* The skb allocation might fail, but can_change_state() +		 * handles cf == NULL. +		 */ +		can_change_state(dev, cf, tx_state, rx_state);  		if (state == CAN_STATE_BUS_OFF)  			can_bus_off(dev);  	} diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index 050c0b49938a..5355bac4dccb 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c @@ -335,15 +335,14 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)  	struct net_device_stats *stats = &dev->netdev->stats;  	skb = alloc_can_err_skb(dev->netdev, &cf); -	if (skb == NULL) -		return;  	if (msg->type == CPC_MSG_TYPE_CAN_STATE) {  		u8 state = msg->msg.can_state;  		if (state & SJA1000_SR_BS) {  			dev->can.state = CAN_STATE_BUS_OFF; -			cf->can_id |= CAN_ERR_BUSOFF; +			if (skb) +				cf->can_id |= CAN_ERR_BUSOFF;  			dev->can.can_stats.bus_off++;  			can_bus_off(dev->netdev); @@ -361,44 +360,53 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg)  		/* bus error interrupt */  		dev->can.can_stats.bus_error++; -		stats->rx_errors++; -		cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; +		if (skb) { +			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; -		switch (ecc & SJA1000_ECC_MASK) { -		case SJA1000_ECC_BIT: -			cf->data[2] |= CAN_ERR_PROT_BIT; -			break; -		case SJA1000_ECC_FORM: -			cf->data[2] |= CAN_ERR_PROT_FORM; -			break; -		case SJA1000_ECC_STUFF: -			cf->data[2] |= CAN_ERR_PROT_STUFF; -			break; -		default: -			cf->data[3] = ecc & SJA1000_ECC_SEG; -			break; +			switch (ecc & SJA1000_ECC_MASK) { +			case SJA1000_ECC_BIT: +				cf->data[2] |= CAN_ERR_PROT_BIT; +				break; +			case SJA1000_ECC_FORM: +				cf->data[2] |= CAN_ERR_PROT_FORM; +				break; +			case SJA1000_ECC_STUFF: +				cf->data[2] |= CAN_ERR_PROT_STUFF; +				break; +			default: +				cf->data[3] = ecc & SJA1000_ECC_SEG; +				break; +			}  		}  		/* Error occurred during transmission? */ -		if ((ecc & SJA1000_ECC_DIR) == 0) -			cf->data[2] |= CAN_ERR_PROT_TX; +		if ((ecc & SJA1000_ECC_DIR) == 0) { +			stats->tx_errors++; +			if (skb) +				cf->data[2] |= CAN_ERR_PROT_TX; +		} else { +			stats->rx_errors++; +		} -		if (dev->can.state == CAN_STATE_ERROR_WARNING || -		    dev->can.state == CAN_STATE_ERROR_PASSIVE) { +		if (skb && (dev->can.state == CAN_STATE_ERROR_WARNING || +			    dev->can.state == CAN_STATE_ERROR_PASSIVE)) {  			cf->can_id |= CAN_ERR_CRTL;  			cf->data[1] = (txerr > rxerr) ?  			    CAN_ERR_CRTL_TX_PASSIVE : CAN_ERR_CRTL_RX_PASSIVE;  		}  	} else if (msg->type == CPC_MSG_TYPE_OVERRUN) { -		cf->can_id |= CAN_ERR_CRTL; -		cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; +		if (skb) { +			cf->can_id |= CAN_ERR_CRTL; +			cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; +		}  		stats->rx_over_errors++;  		stats->rx_errors++;  	} -	netif_rx(skb); +	if (skb) +		netif_rx(skb);  }  /* diff --git a/drivers/net/can/usb/f81604.c b/drivers/net/can/usb/f81604.c index bc0c8903fe77..e0cfa1460b0b 100644 --- a/drivers/net/can/usb/f81604.c +++ b/drivers/net/can/usb/f81604.c @@ -526,7 +526,6 @@ static void f81604_handle_can_bus_errors(struct f81604_port_priv *priv,  		netdev_dbg(netdev, "bus error interrupt\n");  		priv->can.can_stats.bus_error++; -		stats->rx_errors++;  		if (skb) {  			cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; @@ -548,10 +547,15 @@ static void f81604_handle_can_bus_errors(struct f81604_port_priv *priv,  			/* set error location */  			cf->data[3] = data->ecc & F81604_SJA1000_ECC_SEG; +		} -			/* Error occurred during transmission? */ -			if ((data->ecc & F81604_SJA1000_ECC_DIR) == 0) +		/* Error occurred during transmission? */ +		if ((data->ecc & F81604_SJA1000_ECC_DIR) == 0) { +			stats->tx_errors++; +			if (skb)  				cf->data[2] |= CAN_ERR_PROT_TX; +		} else { +			stats->rx_errors++;  		}  		set_bit(F81604_CLEAR_ECC, &priv->clear_flags); diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index bc86e9b329fd..b6f4de375df7 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -43,9 +43,6 @@  #define USB_XYLANTA_SAINT3_VENDOR_ID 0x16d0  #define USB_XYLANTA_SAINT3_PRODUCT_ID 0x0f30 -#define GS_USB_ENDPOINT_IN 1 -#define GS_USB_ENDPOINT_OUT 2 -  /* Timestamp 32 bit timer runs at 1 MHz (1 µs tick). Worker accounts   * for timer overflow (will be after ~71 minutes)   */ @@ -336,6 +333,9 @@ struct gs_usb {  	unsigned int hf_size_rx;  	u8 active_channels; + +	unsigned int pipe_in; +	unsigned int pipe_out;  };  /* 'allocate' a tx context. @@ -687,7 +687,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)  resubmit_urb:  	usb_fill_bulk_urb(urb, parent->udev, -			  usb_rcvbulkpipe(parent->udev, GS_USB_ENDPOINT_IN), +			  parent->pipe_in,  			  hf, dev->parent->hf_size_rx,  			  gs_usb_receive_bulk_callback, parent); @@ -819,7 +819,7 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,  	}  	usb_fill_bulk_urb(urb, dev->udev, -			  usb_sndbulkpipe(dev->udev, GS_USB_ENDPOINT_OUT), +			  dev->parent->pipe_out,  			  hf, dev->hf_size_tx,  			  gs_usb_xmit_callback, txc); @@ -925,8 +925,7 @@ static int gs_can_open(struct net_device *netdev)  			/* fill, anchor, and submit rx urb */  			usb_fill_bulk_urb(urb,  					  dev->udev, -					  usb_rcvbulkpipe(dev->udev, -							  GS_USB_ENDPOINT_IN), +					  dev->parent->pipe_in,  					  buf,  					  dev->parent->hf_size_rx,  					  gs_usb_receive_bulk_callback, parent); @@ -1413,6 +1412,7 @@ static int gs_usb_probe(struct usb_interface *intf,  			const struct usb_device_id *id)  {  	struct usb_device *udev = interface_to_usbdev(intf); +	struct usb_endpoint_descriptor *ep_in, *ep_out;  	struct gs_host_frame *hf;  	struct gs_usb *parent;  	struct gs_host_config hconf = { @@ -1422,6 +1422,13 @@ static int gs_usb_probe(struct usb_interface *intf,  	unsigned int icount, i;  	int rc; +	rc = usb_find_common_endpoints(intf->cur_altsetting, +				       &ep_in, &ep_out, NULL, NULL); +	if (rc) { +		dev_err(&intf->dev, "Required endpoints not found\n"); +		return rc; +	} +  	/* send host config */  	rc = usb_control_msg_send(udev, 0,  				  GS_USB_BREQ_HOST_FORMAT, @@ -1466,6 +1473,10 @@ static int gs_usb_probe(struct usb_interface *intf,  	usb_set_intfdata(intf, parent);  	parent->udev = udev; +	/* store the detected endpoints */ +	parent->pipe_in = usb_rcvbulkpipe(parent->udev, ep_in->bEndpointAddress); +	parent->pipe_out = usb_sndbulkpipe(parent->udev, ep_out->bEndpointAddress); +  	for (i = 0; i < icount; i++) {  		unsigned int hf_size_rx = 0; diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c index da7c72105fb6..ca8811941085 100644 --- a/drivers/net/can/vxcan.c +++ b/drivers/net/can/vxcan.c @@ -172,13 +172,12 @@ static void vxcan_setup(struct net_device *dev)  /* forward declaration for rtnl_create_link() */  static struct rtnl_link_ops vxcan_link_ops; -static int vxcan_newlink(struct net *net, struct net_device *dev, +static int vxcan_newlink(struct net *peer_net, struct net_device *dev,  			 struct nlattr *tb[], struct nlattr *data[],  			 struct netlink_ext_ack *extack)  {  	struct vxcan_priv *priv;  	struct net_device *peer; -	struct net *peer_net;  	struct nlattr *peer_tb[IFLA_MAX + 1], **tbp = tb;  	char ifname[IFNAMSIZ]; @@ -203,20 +202,15 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,  		name_assign_type = NET_NAME_ENUM;  	} -	peer_net = rtnl_link_get_net(net, tbp);  	peer = rtnl_create_link(peer_net, ifname, name_assign_type,  				&vxcan_link_ops, tbp, extack); -	if (IS_ERR(peer)) { -		put_net(peer_net); +	if (IS_ERR(peer))  		return PTR_ERR(peer); -	}  	if (ifmp && dev->ifindex)  		peer->ifindex = ifmp->ifi_index;  	err = register_netdevice(peer); -	put_net(peer_net); -	peer_net = NULL;  	if (err < 0) {  		free_netdev(peer);  		return err; diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c index d16817e0476f..29fe79ea74cd 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -2,7 +2,7 @@  /*   * Microchip KSZ9477 switch driver main logic   * - * Copyright (C) 2017-2019 Microchip Technology Inc. + * Copyright (C) 2017-2024 Microchip Technology Inc.   */  #include <linux/kernel.h> @@ -983,26 +983,51 @@ void ksz9477_get_caps(struct ksz_device *dev, int port,  int ksz9477_set_ageing_time(struct ksz_device *dev, unsigned int msecs)  {  	u32 secs = msecs / 1000; -	u8 value; -	u8 data; +	u8 data, mult, value; +	u32 max_val;  	int ret; -	value = FIELD_GET(SW_AGE_PERIOD_7_0_M, secs); +#define MAX_TIMER_VAL	((1 << 8) - 1) -	ret = ksz_write8(dev, REG_SW_LUE_CTRL_3, value); -	if (ret < 0) -		return ret; +	/* The aging timer comprises a 3-bit multiplier and an 8-bit second +	 * value.  Either of them cannot be zero.  The maximum timer is then +	 * 7 * 255 = 1785 seconds. +	 */ +	if (!secs) +		secs = 1; -	data = FIELD_GET(SW_AGE_PERIOD_10_8_M, secs); +	/* Return error if too large. */ +	else if (secs > 7 * MAX_TIMER_VAL) +		return -EINVAL;  	ret = ksz_read8(dev, REG_SW_LUE_CTRL_0, &value);  	if (ret < 0)  		return ret; -	value &= ~SW_AGE_CNT_M; -	value |= FIELD_PREP(SW_AGE_CNT_M, data); +	/* Check whether there is need to update the multiplier. */ +	mult = FIELD_GET(SW_AGE_CNT_M, value); +	max_val = MAX_TIMER_VAL; +	if (mult > 0) { +		/* Try to use the same multiplier already in the register as +		 * the hardware default uses multiplier 4 and 75 seconds for +		 * 300 seconds. +		 */ +		max_val = DIV_ROUND_UP(secs, mult); +		if (max_val > MAX_TIMER_VAL || max_val * mult != secs) +			max_val = MAX_TIMER_VAL; +	} + +	data = DIV_ROUND_UP(secs, max_val); +	if (mult != data) { +		value &= ~SW_AGE_CNT_M; +		value |= FIELD_PREP(SW_AGE_CNT_M, data); +		ret = ksz_write8(dev, REG_SW_LUE_CTRL_0, value); +		if (ret < 0) +			return ret; +	} -	return ksz_write8(dev, REG_SW_LUE_CTRL_0, value); +	value = DIV_ROUND_UP(secs, data); +	return ksz_write8(dev, REG_SW_LUE_CTRL_3, value);  }  void ksz9477_port_queue_split(struct ksz_device *dev, int port) diff --git a/drivers/net/dsa/microchip/ksz9477_reg.h b/drivers/net/dsa/microchip/ksz9477_reg.h index 04235c22bf40..ff579920078e 100644 --- a/drivers/net/dsa/microchip/ksz9477_reg.h +++ b/drivers/net/dsa/microchip/ksz9477_reg.h @@ -2,7 +2,7 @@  /*   * Microchip KSZ9477 register definitions   * - * Copyright (C) 2017-2018 Microchip Technology Inc. + * Copyright (C) 2017-2024 Microchip Technology Inc.   */  #ifndef __KSZ9477_REGS_H @@ -165,8 +165,6 @@  #define SW_VLAN_ENABLE			BIT(7)  #define SW_DROP_INVALID_VID		BIT(6)  #define SW_AGE_CNT_M			GENMASK(5, 3) -#define SW_AGE_CNT_S			3 -#define SW_AGE_PERIOD_10_8_M		GENMASK(10, 8)  #define SW_RESV_MCAST_ENABLE		BIT(2)  #define SW_HASH_OPTION_M		0x03  #define SW_HASH_OPTION_CRC		1 diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 920443ee8ffd..8a03baa6aecc 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -1100,10 +1100,9 @@ static const struct regmap_range ksz9896_valid_regs[] = {  	regmap_reg_range(0x1030, 0x1030),  	regmap_reg_range(0x1100, 0x1115),  	regmap_reg_range(0x111a, 0x111f), -	regmap_reg_range(0x1122, 0x1127), -	regmap_reg_range(0x112a, 0x112b), -	regmap_reg_range(0x1136, 0x1139), -	regmap_reg_range(0x113e, 0x113f), +	regmap_reg_range(0x1120, 0x112b), +	regmap_reg_range(0x1134, 0x113b), +	regmap_reg_range(0x113c, 0x113f),  	regmap_reg_range(0x1400, 0x1401),  	regmap_reg_range(0x1403, 0x1403),  	regmap_reg_range(0x1410, 0x1417), @@ -1130,10 +1129,9 @@ static const struct regmap_range ksz9896_valid_regs[] = {  	regmap_reg_range(0x2030, 0x2030),  	regmap_reg_range(0x2100, 0x2115),  	regmap_reg_range(0x211a, 0x211f), -	regmap_reg_range(0x2122, 0x2127), -	regmap_reg_range(0x212a, 0x212b), -	regmap_reg_range(0x2136, 0x2139), -	regmap_reg_range(0x213e, 0x213f), +	regmap_reg_range(0x2120, 0x212b), +	regmap_reg_range(0x2134, 0x213b), +	regmap_reg_range(0x213c, 0x213f),  	regmap_reg_range(0x2400, 0x2401),  	regmap_reg_range(0x2403, 0x2403),  	regmap_reg_range(0x2410, 0x2417), @@ -1160,10 +1158,9 @@ static const struct regmap_range ksz9896_valid_regs[] = {  	regmap_reg_range(0x3030, 0x3030),  	regmap_reg_range(0x3100, 0x3115),  	regmap_reg_range(0x311a, 0x311f), -	regmap_reg_range(0x3122, 0x3127), -	regmap_reg_range(0x312a, 0x312b), -	regmap_reg_range(0x3136, 0x3139), -	regmap_reg_range(0x313e, 0x313f), +	regmap_reg_range(0x3120, 0x312b), +	regmap_reg_range(0x3134, 0x313b), +	regmap_reg_range(0x313c, 0x313f),  	regmap_reg_range(0x3400, 0x3401),  	regmap_reg_range(0x3403, 0x3403),  	regmap_reg_range(0x3410, 0x3417), @@ -1190,10 +1187,9 @@ static const struct regmap_range ksz9896_valid_regs[] = {  	regmap_reg_range(0x4030, 0x4030),  	regmap_reg_range(0x4100, 0x4115),  	regmap_reg_range(0x411a, 0x411f), -	regmap_reg_range(0x4122, 0x4127), -	regmap_reg_range(0x412a, 0x412b), -	regmap_reg_range(0x4136, 0x4139), -	regmap_reg_range(0x413e, 0x413f), +	regmap_reg_range(0x4120, 0x412b), +	regmap_reg_range(0x4134, 0x413b), +	regmap_reg_range(0x413c, 0x413f),  	regmap_reg_range(0x4400, 0x4401),  	regmap_reg_range(0x4403, 0x4403),  	regmap_reg_range(0x4410, 0x4417), @@ -1220,10 +1216,9 @@ static const struct regmap_range ksz9896_valid_regs[] = {  	regmap_reg_range(0x5030, 0x5030),  	regmap_reg_range(0x5100, 0x5115),  	regmap_reg_range(0x511a, 0x511f), -	regmap_reg_range(0x5122, 0x5127), -	regmap_reg_range(0x512a, 0x512b), -	regmap_reg_range(0x5136, 0x5139), -	regmap_reg_range(0x513e, 0x513f), +	regmap_reg_range(0x5120, 0x512b), +	regmap_reg_range(0x5134, 0x513b), +	regmap_reg_range(0x513c, 0x513f),  	regmap_reg_range(0x5400, 0x5401),  	regmap_reg_range(0x5403, 0x5403),  	regmap_reg_range(0x5410, 0x5417), @@ -1250,10 +1245,9 @@ static const struct regmap_range ksz9896_valid_regs[] = {  	regmap_reg_range(0x6030, 0x6030),  	regmap_reg_range(0x6100, 0x6115),  	regmap_reg_range(0x611a, 0x611f), -	regmap_reg_range(0x6122, 0x6127), -	regmap_reg_range(0x612a, 0x612b), -	regmap_reg_range(0x6136, 0x6139), -	regmap_reg_range(0x613e, 0x613f), +	regmap_reg_range(0x6120, 0x612b), +	regmap_reg_range(0x6134, 0x613b), +	regmap_reg_range(0x613c, 0x613f),  	regmap_reg_range(0x6300, 0x6301),  	regmap_reg_range(0x6400, 0x6401),  	regmap_reg_range(0x6403, 0x6403), diff --git a/drivers/net/dsa/microchip/lan937x_main.c b/drivers/net/dsa/microchip/lan937x_main.c index b7652efd632e..b1ae3b9de3d1 100644 --- a/drivers/net/dsa/microchip/lan937x_main.c +++ b/drivers/net/dsa/microchip/lan937x_main.c @@ -1,6 +1,6 @@  // SPDX-License-Identifier: GPL-2.0  /* Microchip LAN937X switch driver main logic - * Copyright (C) 2019-2022 Microchip Technology Inc. + * Copyright (C) 2019-2024 Microchip Technology Inc.   */  #include <linux/kernel.h>  #include <linux/module.h> @@ -461,10 +461,66 @@ int lan937x_change_mtu(struct ksz_device *dev, int port, int new_mtu)  int lan937x_set_ageing_time(struct ksz_device *dev, unsigned int msecs)  { -	u32 secs = msecs / 1000; -	u32 value; +	u8 data, mult, value8; +	bool in_msec = false; +	u32 max_val, value; +	u32 secs = msecs;  	int ret; +#define MAX_TIMER_VAL	((1 << 20) - 1) + +	/* The aging timer comprises a 3-bit multiplier and a 20-bit second +	 * value.  Either of them cannot be zero.  The maximum timer is then +	 * 7 * 1048575 = 7340025 seconds.  As this value is too large for +	 * practical use it can be interpreted as microseconds, making the +	 * maximum timer 7340 seconds with finer control.  This allows for +	 * maximum 122 minutes compared to 29 minutes in KSZ9477 switch. +	 */ +	if (msecs % 1000) +		in_msec = true; +	else +		secs /= 1000; +	if (!secs) +		secs = 1; + +	/* Return error if too large. */ +	else if (secs > 7 * MAX_TIMER_VAL) +		return -EINVAL; + +	/* Configure how to interpret the number value. */ +	ret = ksz_rmw8(dev, REG_SW_LUE_CTRL_2, SW_AGE_CNT_IN_MICROSEC, +		       in_msec ? SW_AGE_CNT_IN_MICROSEC : 0); +	if (ret < 0) +		return ret; + +	ret = ksz_read8(dev, REG_SW_LUE_CTRL_0, &value8); +	if (ret < 0) +		return ret; + +	/* Check whether there is need to update the multiplier. */ +	mult = FIELD_GET(SW_AGE_CNT_M, value8); +	max_val = MAX_TIMER_VAL; +	if (mult > 0) { +		/* Try to use the same multiplier already in the register as +		 * the hardware default uses multiplier 4 and 75 seconds for +		 * 300 seconds. +		 */ +		max_val = DIV_ROUND_UP(secs, mult); +		if (max_val > MAX_TIMER_VAL || max_val * mult != secs) +			max_val = MAX_TIMER_VAL; +	} + +	data = DIV_ROUND_UP(secs, max_val); +	if (mult != data) { +		value8 &= ~SW_AGE_CNT_M; +		value8 |= FIELD_PREP(SW_AGE_CNT_M, data); +		ret = ksz_write8(dev, REG_SW_LUE_CTRL_0, value8); +		if (ret < 0) +			return ret; +	} + +	secs = DIV_ROUND_UP(secs, data); +  	value = FIELD_GET(SW_AGE_PERIOD_7_0_M, secs);  	ret = ksz_write8(dev, REG_SW_AGE_PERIOD__1, value); diff --git a/drivers/net/dsa/microchip/lan937x_reg.h b/drivers/net/dsa/microchip/lan937x_reg.h index 4ec93e421da4..72042fd64e5b 100644 --- a/drivers/net/dsa/microchip/lan937x_reg.h +++ b/drivers/net/dsa/microchip/lan937x_reg.h @@ -1,6 +1,6 @@  /* SPDX-License-Identifier: GPL-2.0 */  /* Microchip LAN937X switch register definitions - * Copyright (C) 2019-2021 Microchip Technology Inc. + * Copyright (C) 2019-2024 Microchip Technology Inc.   */  #ifndef __LAN937X_REG_H  #define __LAN937X_REG_H @@ -56,8 +56,7 @@  #define SW_VLAN_ENABLE			BIT(7)  #define SW_DROP_INVALID_VID		BIT(6) -#define SW_AGE_CNT_M			0x7 -#define SW_AGE_CNT_S			3 +#define SW_AGE_CNT_M			GENMASK(5, 3)  #define SW_RESV_MCAST_ENABLE		BIT(2)  #define REG_SW_LUE_CTRL_1		0x0311 @@ -70,6 +69,10 @@  #define SW_FAST_AGING			BIT(1)  #define SW_LINK_AUTO_AGING		BIT(0) +#define REG_SW_LUE_CTRL_2		0x0312 + +#define SW_AGE_CNT_IN_MICROSEC		BIT(7) +  #define REG_SW_AGE_PERIOD__1		0x0313  #define SW_AGE_PERIOD_7_0_M		GENMASK(7, 0) diff --git a/drivers/net/dsa/ocelot/felix_vsc9959.c b/drivers/net/dsa/ocelot/felix_vsc9959.c index 0102a82e88cc..940f1b71226d 100644 --- a/drivers/net/dsa/ocelot/felix_vsc9959.c +++ b/drivers/net/dsa/ocelot/felix_vsc9959.c @@ -24,7 +24,7 @@  #define VSC9959_NUM_PORTS		6  #define VSC9959_TAS_GCL_ENTRY_MAX	63 -#define VSC9959_TAS_MIN_GATE_LEN_NS	33 +#define VSC9959_TAS_MIN_GATE_LEN_NS	35  #define VSC9959_VCAP_POLICER_BASE	63  #define VSC9959_VCAP_POLICER_MAX	383  #define VSC9959_SWITCH_PCI_BAR		4 @@ -1056,11 +1056,15 @@ static void vsc9959_mdio_bus_free(struct ocelot *ocelot)  	mdiobus_free(felix->imdio);  } -/* The switch considers any frame (regardless of size) as eligible for - * transmission if the traffic class gate is open for at least 33 ns. +/* The switch considers any frame (regardless of size) as eligible + * for transmission if the traffic class gate is open for at least + * VSC9959_TAS_MIN_GATE_LEN_NS. + *   * Overruns are prevented by cropping an interval at the end of the gate time - * slot for which egress scheduling is blocked, but we need to still keep 33 ns - * available for one packet to be transmitted, otherwise the port tc will hang. + * slot for which egress scheduling is blocked, but we need to still keep + * VSC9959_TAS_MIN_GATE_LEN_NS available for one packet to be transmitted, + * otherwise the port tc will hang. + *   * This function returns the size of a gate interval that remains available for   * setting the guard band, after reserving the space for one egress frame.   */ @@ -1303,7 +1307,8 @@ static void vsc9959_tas_guard_bands_update(struct ocelot *ocelot, int port)  			 * per-tc static guard band lengths, so it reduces the  			 * useful gate interval length. Therefore, be careful  			 * to calculate a guard band (and therefore max_sdu) -			 * that still leaves 33 ns available in the time slot. +			 * that still leaves VSC9959_TAS_MIN_GATE_LEN_NS +			 * available in the time slot.  			 */  			max_sdu = div_u64(remaining_gate_len_ps, picos_per_byte);  			/* A TC gate may be completely closed, which is a diff --git a/drivers/net/dsa/ocelot/ocelot_ext.c b/drivers/net/dsa/ocelot/ocelot_ext.c index 450bda18ef37..d5c557a20292 100644 --- a/drivers/net/dsa/ocelot/ocelot_ext.c +++ b/drivers/net/dsa/ocelot/ocelot_ext.c @@ -109,4 +109,4 @@ module_platform_driver(ocelot_ext_switch_driver);  MODULE_DESCRIPTION("External Ocelot Switch driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(MFD_OCELOT); +MODULE_IMPORT_NS("MFD_OCELOT"); diff --git a/drivers/net/dsa/realtek/realtek-mdio.c b/drivers/net/dsa/realtek/realtek-mdio.c index 5f545dda702b..a5e7dff96e91 100644 --- a/drivers/net/dsa/realtek/realtek-mdio.c +++ b/drivers/net/dsa/realtek/realtek-mdio.c @@ -140,7 +140,7 @@ int realtek_mdio_probe(struct mdio_device *mdiodev)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(realtek_mdio_probe, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(realtek_mdio_probe, "REALTEK_DSA");  /**   * realtek_mdio_remove() - Remove the driver of an MDIO-connected switch @@ -163,7 +163,7 @@ void realtek_mdio_remove(struct mdio_device *mdiodev)  	rtl83xx_remove(priv);  } -EXPORT_SYMBOL_NS_GPL(realtek_mdio_remove, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(realtek_mdio_remove, "REALTEK_DSA");  /**   * realtek_mdio_shutdown() - Shutdown the driver of a MDIO-connected switch @@ -184,4 +184,4 @@ void realtek_mdio_shutdown(struct mdio_device *mdiodev)  	rtl83xx_shutdown(priv);  } -EXPORT_SYMBOL_NS_GPL(realtek_mdio_shutdown, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(realtek_mdio_shutdown, "REALTEK_DSA"); diff --git a/drivers/net/dsa/realtek/realtek-smi.c b/drivers/net/dsa/realtek/realtek-smi.c index d750bddf27b4..972e22218418 100644 --- a/drivers/net/dsa/realtek/realtek-smi.c +++ b/drivers/net/dsa/realtek/realtek-smi.c @@ -361,7 +361,7 @@ int realtek_smi_probe(struct platform_device *pdev)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(realtek_smi_probe, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(realtek_smi_probe, "REALTEK_DSA");  /**   * realtek_smi_remove() - Remove the driver of a SMI-connected switch @@ -384,7 +384,7 @@ void realtek_smi_remove(struct platform_device *pdev)  	rtl83xx_remove(priv);  } -EXPORT_SYMBOL_NS_GPL(realtek_smi_remove, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(realtek_smi_remove, "REALTEK_DSA");  /**   * realtek_smi_shutdown() - Shutdown the driver of a SMI-connected switch @@ -405,4 +405,4 @@ void realtek_smi_shutdown(struct platform_device *pdev)  	rtl83xx_shutdown(priv);  } -EXPORT_SYMBOL_NS_GPL(realtek_smi_shutdown, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(realtek_smi_shutdown, "REALTEK_DSA"); diff --git a/drivers/net/dsa/realtek/rtl8365mb.c b/drivers/net/dsa/realtek/rtl8365mb.c index 6b9dbdb00941..7e96355c28bd 100644 --- a/drivers/net/dsa/realtek/rtl8365mb.c +++ b/drivers/net/dsa/realtek/rtl8365mb.c @@ -2206,4 +2206,4 @@ module_exit(rtl8365mb_exit);  MODULE_AUTHOR("Alvin Å ipraga <alsi@bang-olufsen.dk>");  MODULE_DESCRIPTION("Driver for RTL8365MB-VC ethernet switch");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(REALTEK_DSA); +MODULE_IMPORT_NS("REALTEK_DSA"); diff --git a/drivers/net/dsa/realtek/rtl8366-core.c b/drivers/net/dsa/realtek/rtl8366-core.c index 7c6520ba3a26..047feeed96a2 100644 --- a/drivers/net/dsa/realtek/rtl8366-core.c +++ b/drivers/net/dsa/realtek/rtl8366-core.c @@ -34,7 +34,7 @@ int rtl8366_mc_is_used(struct realtek_priv *priv, int mc_index, int *used)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_mc_is_used, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_mc_is_used, "REALTEK_DSA");  /**   * rtl8366_obtain_mc() - retrieve or allocate a VLAN member configuration @@ -187,7 +187,7 @@ int rtl8366_set_vlan(struct realtek_priv *priv, int vid, u32 member,  	return ret;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_set_vlan, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_set_vlan, "REALTEK_DSA");  int rtl8366_set_pvid(struct realtek_priv *priv, unsigned int port,  		     unsigned int vid) @@ -217,7 +217,7 @@ int rtl8366_set_pvid(struct realtek_priv *priv, unsigned int port,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_set_pvid, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_set_pvid, "REALTEK_DSA");  int rtl8366_enable_vlan4k(struct realtek_priv *priv, bool enable)  { @@ -243,7 +243,7 @@ int rtl8366_enable_vlan4k(struct realtek_priv *priv, bool enable)  	priv->vlan4k_enabled = enable;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_enable_vlan4k, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_enable_vlan4k, "REALTEK_DSA");  int rtl8366_enable_vlan(struct realtek_priv *priv, bool enable)  { @@ -265,7 +265,7 @@ int rtl8366_enable_vlan(struct realtek_priv *priv, bool enable)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_enable_vlan, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_enable_vlan, "REALTEK_DSA");  int rtl8366_reset_vlan(struct realtek_priv *priv)  { @@ -290,7 +290,7 @@ int rtl8366_reset_vlan(struct realtek_priv *priv)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_reset_vlan, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_reset_vlan, "REALTEK_DSA");  int rtl8366_vlan_add(struct dsa_switch *ds, int port,  		     const struct switchdev_obj_port_vlan *vlan, @@ -345,7 +345,7 @@ int rtl8366_vlan_add(struct dsa_switch *ds, int port,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_vlan_add, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_vlan_add, "REALTEK_DSA");  int rtl8366_vlan_del(struct dsa_switch *ds, int port,  		     const struct switchdev_obj_port_vlan *vlan) @@ -389,7 +389,7 @@ int rtl8366_vlan_del(struct dsa_switch *ds, int port,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_vlan_del, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_vlan_del, "REALTEK_DSA");  void rtl8366_get_strings(struct dsa_switch *ds, int port, u32 stringset,  			 uint8_t *data) @@ -403,7 +403,7 @@ void rtl8366_get_strings(struct dsa_switch *ds, int port, u32 stringset,  	for (i = 0; i < priv->num_mib_counters; i++)  		ethtool_puts(&data, priv->mib_counters[i].name);  } -EXPORT_SYMBOL_NS_GPL(rtl8366_get_strings, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_get_strings, "REALTEK_DSA");  int rtl8366_get_sset_count(struct dsa_switch *ds, int port, int sset)  { @@ -417,7 +417,7 @@ int rtl8366_get_sset_count(struct dsa_switch *ds, int port, int sset)  	return priv->num_mib_counters;  } -EXPORT_SYMBOL_NS_GPL(rtl8366_get_sset_count, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_get_sset_count, "REALTEK_DSA");  void rtl8366_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data)  { @@ -441,4 +441,4 @@ void rtl8366_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data)  		data[i] = mibvalue;  	}  } -EXPORT_SYMBOL_NS_GPL(rtl8366_get_ethtool_stats, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl8366_get_ethtool_stats, "REALTEK_DSA"); diff --git a/drivers/net/dsa/realtek/rtl8366rb.c b/drivers/net/dsa/realtek/rtl8366rb.c index 6ba03f81c882..23374178a176 100644 --- a/drivers/net/dsa/realtek/rtl8366rb.c +++ b/drivers/net/dsa/realtek/rtl8366rb.c @@ -2144,4 +2144,4 @@ module_exit(rtl8366rb_exit);  MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");  MODULE_DESCRIPTION("Driver for RTL8366RB ethernet switch");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(REALTEK_DSA); +MODULE_IMPORT_NS("REALTEK_DSA"); diff --git a/drivers/net/dsa/realtek/rtl83xx.c b/drivers/net/dsa/realtek/rtl83xx.c index 3c5018d5e1f9..2b9bd4462714 100644 --- a/drivers/net/dsa/realtek/rtl83xx.c +++ b/drivers/net/dsa/realtek/rtl83xx.c @@ -25,7 +25,7 @@ void rtl83xx_lock(void *ctx)  	mutex_lock(&priv->map_lock);  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_lock, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_lock, "REALTEK_DSA");  /**   * rtl83xx_unlock() - Unlocks the mutex used by regmaps @@ -42,7 +42,7 @@ void rtl83xx_unlock(void *ctx)  	mutex_unlock(&priv->map_lock);  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_unlock, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_unlock, "REALTEK_DSA");  static int rtl83xx_user_mdio_read(struct mii_bus *bus, int addr, int regnum)  { @@ -109,7 +109,7 @@ err_put_node:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_setup_user_mdio, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_setup_user_mdio, "REALTEK_DSA");  /**   * rtl83xx_probe() - probe a Realtek switch @@ -208,7 +208,7 @@ rtl83xx_probe(struct device *dev,  	return priv;  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_probe, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_probe, "REALTEK_DSA");  /**   * rtl83xx_register_switch() - detects and register a switch @@ -245,7 +245,7 @@ int rtl83xx_register_switch(struct realtek_priv *priv)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_register_switch, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_register_switch, "REALTEK_DSA");  /**   * rtl83xx_unregister_switch() - unregister a switch @@ -262,7 +262,7 @@ void rtl83xx_unregister_switch(struct realtek_priv *priv)  	dsa_unregister_switch(ds);  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_unregister_switch, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_unregister_switch, "REALTEK_DSA");  /**   * rtl83xx_shutdown() - shutdown a switch @@ -283,7 +283,7 @@ void rtl83xx_shutdown(struct realtek_priv *priv)  	dev_set_drvdata(priv->dev, NULL);  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_shutdown, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_shutdown, "REALTEK_DSA");  /**   * rtl83xx_remove() - Cleanup a realtek switch driver @@ -297,7 +297,7 @@ EXPORT_SYMBOL_NS_GPL(rtl83xx_shutdown, REALTEK_DSA);  void rtl83xx_remove(struct realtek_priv *priv)  {  } -EXPORT_SYMBOL_NS_GPL(rtl83xx_remove, REALTEK_DSA); +EXPORT_SYMBOL_NS_GPL(rtl83xx_remove, "REALTEK_DSA");  void rtl83xx_reset_assert(struct realtek_priv *priv)  { diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c b/drivers/net/ethernet/amd/pds_core/devlink.c index 2681889162a2..44971e71991f 100644 --- a/drivers/net/ethernet/amd/pds_core/devlink.c +++ b/drivers/net/ethernet/amd/pds_core/devlink.c @@ -118,7 +118,7 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,  	if (err && err != -EIO)  		return err; -	listlen = fw_list.num_fw_slots; +	listlen = min(fw_list.num_fw_slots, ARRAY_SIZE(fw_list.fw_names));  	for (i = 0; i < listlen; i++) {  		if (i < ARRAY_SIZE(fw_slotnames))  			strscpy(buf, fw_slotnames[i], sizeof(buf)); diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c index 6a716337f48b..268399dfcf22 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c @@ -923,7 +923,6 @@ static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)  static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)  { -	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };  	struct xgbe_phy_data *phy_data = pdata->phy_data;  	unsigned int phy_id = phy_data->phydev->phy_id; @@ -945,14 +944,7 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)  	phy_write(phy_data->phydev, 0x04, 0x0d01);  	phy_write(phy_data->phydev, 0x00, 0x9140); -	linkmode_set_bit_array(phy_10_100_features_array, -			       ARRAY_SIZE(phy_10_100_features_array), -			       supported); -	linkmode_set_bit_array(phy_gbit_features_array, -			       ARRAY_SIZE(phy_gbit_features_array), -			       supported); - -	linkmode_copy(phy_data->phydev->supported, supported); +	linkmode_copy(phy_data->phydev->supported, PHY_GBIT_FEATURES);  	phy_support_asym_pause(phy_data->phydev); @@ -964,7 +956,6 @@ static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)  static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)  { -	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };  	struct xgbe_phy_data *phy_data = pdata->phy_data;  	struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;  	unsigned int phy_id = phy_data->phydev->phy_id; @@ -1028,13 +1019,7 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)  	reg = phy_read(phy_data->phydev, 0x00);  	phy_write(phy_data->phydev, 0x00, reg & ~0x00800); -	linkmode_set_bit_array(phy_10_100_features_array, -			       ARRAY_SIZE(phy_10_100_features_array), -			       supported); -	linkmode_set_bit_array(phy_gbit_features_array, -			       ARRAY_SIZE(phy_gbit_features_array), -			       supported); -	linkmode_copy(phy_data->phydev->supported, supported); +	linkmode_copy(phy_data->phydev->supported, PHY_GBIT_FEATURES);  	phy_support_asym_pause(phy_data->phydev);  	netif_dbg(pdata, drv, pdata->netdev, diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 42672c63f108..bc4e1f3b3752 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -1933,7 +1933,11 @@ static int bcm_sysport_open(struct net_device *dev)  	unsigned int i;  	int ret; -	clk_prepare_enable(priv->clk); +	ret = clk_prepare_enable(priv->clk); +	if (ret) { +		netdev_err(dev, "could not enable priv clock\n"); +		return ret; +	}  	/* Reset UniMAC */  	umac_reset(priv); @@ -2591,7 +2595,11 @@ static int bcm_sysport_probe(struct platform_device *pdev)  		goto err_deregister_notifier;  	} -	clk_prepare_enable(priv->clk); +	ret = clk_prepare_enable(priv->clk); +	if (ret) { +		dev_err(&pdev->dev, "could not enable priv clock\n"); +		goto err_deregister_netdev; +	}  	priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;  	dev_info(&pdev->dev, @@ -2605,6 +2613,8 @@ static int bcm_sysport_probe(struct platform_device *pdev)  	return 0; +err_deregister_netdev: +	unregister_netdev(dev);  err_deregister_notifier:  	unregister_netdevice_notifier(&priv->netdev_notifier);  err_deregister_fixed_link: @@ -2774,7 +2784,12 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)  	if (!netif_running(dev))  		return 0; -	clk_prepare_enable(priv->clk); +	ret = clk_prepare_enable(priv->clk); +	if (ret) { +		netdev_err(dev, "could not enable priv clock\n"); +		return ret; +	} +  	if (priv->wolopts)  		clk_disable_unprepare(priv->wol_clk); diff --git a/drivers/net/ethernet/broadcom/bgmac-platform.c b/drivers/net/ethernet/broadcom/bgmac-platform.c index ecce23cecbea..4e266ce41180 100644 --- a/drivers/net/ethernet/broadcom/bgmac-platform.c +++ b/drivers/net/ethernet/broadcom/bgmac-platform.c @@ -171,6 +171,7 @@ static int platform_phy_connect(struct bgmac *bgmac)  static int bgmac_probe(struct platform_device *pdev)  {  	struct device_node *np = pdev->dev.of_node; +	struct device_node *phy_node;  	struct bgmac *bgmac;  	struct resource *regs;  	int ret; @@ -236,7 +237,9 @@ static int bgmac_probe(struct platform_device *pdev)  	bgmac->cco_ctl_maskset = platform_bgmac_cco_ctl_maskset;  	bgmac->get_bus_clock = platform_bgmac_get_bus_clock;  	bgmac->cmn_maskset32 = platform_bgmac_cmn_maskset32; -	if (of_parse_phandle(np, "phy-handle", 0)) { +	phy_node = of_parse_phandle(np, "phy-handle", 0); +	if (phy_node) { +		of_node_put(phy_node);  		bgmac->phy_connect = platform_phy_connect;  	} else {  		bgmac->phy_connect = bgmac_phy_connect_direct; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 4ec4934a4edd..b6f844cac80e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -1531,7 +1531,7 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,  		if (TPA_START_IS_IPV6(tpa_start1))  			tpa_info->gso_type = SKB_GSO_TCPV6;  		/* RSS profiles 1 and 3 with extract code 0 for inner 4-tuple */ -		else if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP && +		else if (!BNXT_CHIP_P4_PLUS(bp) &&  			 TPA_START_HASH_TYPE(tpa_start) == 3)  			tpa_info->gso_type = SKB_GSO_TCPV6;  		tpa_info->rss_hash = @@ -2226,15 +2226,13 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,  		if (cmp_type == CMP_TYPE_RX_L2_V3_CMP) {  			type = bnxt_rss_ext_op(bp, rxcmp);  		} else { -			u32 hash_type = RX_CMP_HASH_TYPE(rxcmp); +			u32 itypes = RX_CMP_ITYPES(rxcmp); -			/* RSS profiles 1 and 3 with extract code 0 for inner -			 * 4-tuple -			 */ -			if (hash_type != 1 && hash_type != 3) -				type = PKT_HASH_TYPE_L3; -			else +			if (itypes == RX_CMP_FLAGS_ITYPE_TCP || +			    itypes == RX_CMP_FLAGS_ITYPE_UDP)  				type = PKT_HASH_TYPE_L4; +			else +				type = PKT_HASH_TYPE_L3;  		}  		skb_set_hash(skb, le32_to_cpu(rxcmp->rx_cmp_rss_hash), type);  	} @@ -2899,6 +2897,13 @@ static int bnxt_hwrm_handler(struct bnxt *bp, struct tx_cmp *txcmp)  	return 0;  } +static bool bnxt_vnic_is_active(struct bnxt *bp) +{ +	struct bnxt_vnic_info *vnic = &bp->vnic_info[0]; + +	return vnic->fw_vnic_id != INVALID_HW_RING_ID && vnic->mru > 0; +} +  static irqreturn_t bnxt_msix(int irq, void *dev_instance)  {  	struct bnxt_napi *bnapi = dev_instance; @@ -3166,7 +3171,7 @@ static int bnxt_poll(struct napi_struct *napi, int budget)  			break;  		}  	} -	if (bp->flags & BNXT_FLAG_DIM) { +	if ((bp->flags & BNXT_FLAG_DIM) && bnxt_vnic_is_active(bp)) {  		struct dim_sample dim_sample = {};  		dim_update_sample(cpr->event_ctr, @@ -3297,7 +3302,7 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)  poll_done:  	cpr_rx = &cpr->cp_ring_arr[0];  	if (cpr_rx->cp_ring_type == BNXT_NQ_HDL_TYPE_RX && -	    (bp->flags & BNXT_FLAG_DIM)) { +	    (bp->flags & BNXT_FLAG_DIM) && bnxt_vnic_is_active(bp)) {  		struct dim_sample dim_sample = {};  		dim_update_sample(cpr->event_ctr, @@ -3421,15 +3426,11 @@ static void bnxt_free_one_rx_agg_ring(struct bnxt *bp, struct bnxt_rx_ring_info  	}  } -static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr) +static void bnxt_free_one_tpa_info_data(struct bnxt *bp, +					struct bnxt_rx_ring_info *rxr)  { -	struct bnxt_rx_ring_info *rxr = &bp->rx_ring[ring_nr]; -	struct bnxt_tpa_idx_map *map;  	int i; -	if (!rxr->rx_tpa) -		goto skip_rx_tpa_free; -  	for (i = 0; i < bp->max_tpa; i++) {  		struct bnxt_tpa_info *tpa_info = &rxr->rx_tpa[i];  		u8 *data = tpa_info->data; @@ -3440,6 +3441,17 @@ static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, int ring_nr)  		tpa_info->data = NULL;  		page_pool_free_va(rxr->head_pool, data, false);  	} +} + +static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp, +				       struct bnxt_rx_ring_info *rxr) +{ +	struct bnxt_tpa_idx_map *map; + +	if (!rxr->rx_tpa) +		goto skip_rx_tpa_free; + +	bnxt_free_one_tpa_info_data(bp, rxr);  skip_rx_tpa_free:  	if (!rxr->rx_buf_ring) @@ -3467,7 +3479,7 @@ static void bnxt_free_rx_skbs(struct bnxt *bp)  		return;  	for (i = 0; i < bp->rx_nr_rings; i++) -		bnxt_free_one_rx_ring_skbs(bp, i); +		bnxt_free_one_rx_ring_skbs(bp, &bp->rx_ring[i]);  }  static void bnxt_free_skbs(struct bnxt *bp) @@ -3608,29 +3620,64 @@ static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)  	return 0;  } +static void bnxt_free_one_tpa_info(struct bnxt *bp, +				   struct bnxt_rx_ring_info *rxr) +{ +	int i; + +	kfree(rxr->rx_tpa_idx_map); +	rxr->rx_tpa_idx_map = NULL; +	if (rxr->rx_tpa) { +		for (i = 0; i < bp->max_tpa; i++) { +			kfree(rxr->rx_tpa[i].agg_arr); +			rxr->rx_tpa[i].agg_arr = NULL; +		} +	} +	kfree(rxr->rx_tpa); +	rxr->rx_tpa = NULL; +} +  static void bnxt_free_tpa_info(struct bnxt *bp)  { -	int i, j; +	int i;  	for (i = 0; i < bp->rx_nr_rings; i++) {  		struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; -		kfree(rxr->rx_tpa_idx_map); -		rxr->rx_tpa_idx_map = NULL; -		if (rxr->rx_tpa) { -			for (j = 0; j < bp->max_tpa; j++) { -				kfree(rxr->rx_tpa[j].agg_arr); -				rxr->rx_tpa[j].agg_arr = NULL; -			} -		} -		kfree(rxr->rx_tpa); -		rxr->rx_tpa = NULL; +		bnxt_free_one_tpa_info(bp, rxr);  	}  } +static int bnxt_alloc_one_tpa_info(struct bnxt *bp, +				   struct bnxt_rx_ring_info *rxr) +{ +	struct rx_agg_cmp *agg; +	int i; + +	rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), +			      GFP_KERNEL); +	if (!rxr->rx_tpa) +		return -ENOMEM; + +	if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) +		return 0; +	for (i = 0; i < bp->max_tpa; i++) { +		agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL); +		if (!agg) +			return -ENOMEM; +		rxr->rx_tpa[i].agg_arr = agg; +	} +	rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), +				      GFP_KERNEL); +	if (!rxr->rx_tpa_idx_map) +		return -ENOMEM; + +	return 0; +} +  static int bnxt_alloc_tpa_info(struct bnxt *bp)  { -	int i, j; +	int i, rc;  	bp->max_tpa = MAX_TPA;  	if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) { @@ -3641,25 +3688,10 @@ static int bnxt_alloc_tpa_info(struct bnxt *bp)  	for (i = 0; i < bp->rx_nr_rings; i++) {  		struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; -		struct rx_agg_cmp *agg; -		rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), -				      GFP_KERNEL); -		if (!rxr->rx_tpa) -			return -ENOMEM; - -		if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) -			continue; -		for (j = 0; j < bp->max_tpa; j++) { -			agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL); -			if (!agg) -				return -ENOMEM; -			rxr->rx_tpa[j].agg_arr = agg; -		} -		rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), -					      GFP_KERNEL); -		if (!rxr->rx_tpa_idx_map) -			return -ENOMEM; +		rc = bnxt_alloc_one_tpa_info(bp, rxr); +		if (rc) +			return rc;  	}  	return 0;  } @@ -3683,7 +3715,7 @@ static void bnxt_free_rx_rings(struct bnxt *bp)  			xdp_rxq_info_unreg(&rxr->xdp_rxq);  		page_pool_destroy(rxr->page_pool); -		if (rxr->page_pool != rxr->head_pool) +		if (bnxt_separate_head_pool())  			page_pool_destroy(rxr->head_pool);  		rxr->page_pool = rxr->head_pool = NULL; @@ -3737,6 +3769,19 @@ err_destroy_pp:  	return PTR_ERR(pool);  } +static int bnxt_alloc_rx_agg_bmap(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) +{ +	u16 mem_size; + +	rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1; +	mem_size = rxr->rx_agg_bmap_size / 8; +	rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL); +	if (!rxr->rx_agg_bmap) +		return -ENOMEM; + +	return 0; +} +  static int bnxt_alloc_rx_rings(struct bnxt *bp)  {  	int numa_node = dev_to_node(&bp->pdev->dev); @@ -3781,19 +3826,15 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp)  		ring->grp_idx = i;  		if (agg_rings) { -			u16 mem_size; -  			ring = &rxr->rx_agg_ring_struct;  			rc = bnxt_alloc_ring(bp, &ring->ring_mem);  			if (rc)  				return rc;  			ring->grp_idx = i; -			rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1; -			mem_size = rxr->rx_agg_bmap_size / 8; -			rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL); -			if (!rxr->rx_agg_bmap) -				return -ENOMEM; +			rc = bnxt_alloc_rx_agg_bmap(bp, rxr); +			if (rc) +				return rc;  		}  	}  	if (bp->flags & BNXT_FLAG_TPA) @@ -4268,10 +4309,31 @@ static void bnxt_alloc_one_rx_ring_page(struct bnxt *bp,  	rxr->rx_agg_prod = prod;  } +static int bnxt_alloc_one_tpa_info_data(struct bnxt *bp, +					struct bnxt_rx_ring_info *rxr) +{ +	dma_addr_t mapping; +	u8 *data; +	int i; + +	for (i = 0; i < bp->max_tpa; i++) { +		data = __bnxt_alloc_rx_frag(bp, &mapping, rxr, +					    GFP_KERNEL); +		if (!data) +			return -ENOMEM; + +		rxr->rx_tpa[i].data = data; +		rxr->rx_tpa[i].data_ptr = data + bp->rx_offset; +		rxr->rx_tpa[i].mapping = mapping; +	} + +	return 0; +} +  static int bnxt_alloc_one_rx_ring(struct bnxt *bp, int ring_nr)  {  	struct bnxt_rx_ring_info *rxr = &bp->rx_ring[ring_nr]; -	int i; +	int rc;  	bnxt_alloc_one_rx_ring_skb(bp, rxr, ring_nr); @@ -4281,19 +4343,9 @@ static int bnxt_alloc_one_rx_ring(struct bnxt *bp, int ring_nr)  	bnxt_alloc_one_rx_ring_page(bp, rxr, ring_nr);  	if (rxr->rx_tpa) { -		dma_addr_t mapping; -		u8 *data; - -		for (i = 0; i < bp->max_tpa; i++) { -			data = __bnxt_alloc_rx_frag(bp, &mapping, rxr, -						    GFP_KERNEL); -			if (!data) -				return -ENOMEM; - -			rxr->rx_tpa[i].data = data; -			rxr->rx_tpa[i].data_ptr = data + bp->rx_offset; -			rxr->rx_tpa[i].mapping = mapping; -		} +		rc = bnxt_alloc_one_tpa_info_data(bp, rxr); +		if (rc) +			return rc;  	}  	return 0;  } @@ -4656,7 +4708,7 @@ void bnxt_set_ring_params(struct bnxt *bp)  /* Changing allocation mode of RX rings.   * TODO: Update when extending xdp_rxq_info to support allocation modes.   */ -int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode) +static void __bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)  {  	struct net_device *dev = bp->dev; @@ -4677,15 +4729,30 @@ int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)  			bp->rx_skb_func = bnxt_rx_page_skb;  		}  		bp->rx_dir = DMA_BIDIRECTIONAL; -		/* Disable LRO or GRO_HW */ -		netdev_update_features(dev);  	} else {  		dev->max_mtu = bp->max_mtu;  		bp->flags &= ~BNXT_FLAG_RX_PAGE_MODE;  		bp->rx_dir = DMA_FROM_DEVICE;  		bp->rx_skb_func = bnxt_rx_skb;  	} -	return 0; +} + +void bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode) +{ +	__bnxt_set_rx_skb_mode(bp, page_mode); + +	if (!page_mode) { +		int rx, tx; + +		bnxt_get_max_rings(bp, &rx, &tx, true); +		if (rx > 1) { +			bp->flags &= ~BNXT_FLAG_NO_AGG_RINGS; +			bp->dev->hw_features |= NETIF_F_LRO; +		} +	} + +	/* Update LRO and GRO_HW availability */ +	netdev_update_features(bp->dev);  }  static void bnxt_free_vnic_attributes(struct bnxt *bp) @@ -7221,6 +7288,26 @@ err_out:  	return rc;  } +static void bnxt_cancel_dim(struct bnxt *bp) +{ +	int i; + +	/* DIM work is initialized in bnxt_enable_napi().  Proceed only +	 * if NAPI is enabled. +	 */ +	if (!bp->bnapi || test_bit(BNXT_STATE_NAPI_DISABLED, &bp->state)) +		return; + +	/* Make sure NAPI sees that the VNIC is disabled */ +	synchronize_net(); +	for (i = 0; i < bp->rx_nr_rings; i++) { +		struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; +		struct bnxt_napi *bnapi = rxr->bnapi; + +		cancel_work_sync(&bnapi->cp_ring.dim.work); +	} +} +  static int hwrm_ring_free_send_msg(struct bnxt *bp,  				   struct bnxt_ring_struct *ring,  				   u32 ring_type, int cmpl_ring_id) @@ -7321,6 +7408,7 @@ static void bnxt_hwrm_ring_free(struct bnxt *bp, bool close_path)  		}  	} +	bnxt_cancel_dim(bp);  	for (i = 0; i < bp->rx_nr_rings; i++) {  		bnxt_hwrm_rx_ring_free(bp, &bp->rx_ring[i], close_path);  		bnxt_hwrm_rx_agg_ring_free(bp, &bp->rx_ring[i], close_path); @@ -8320,7 +8408,7 @@ static int bnxt_alloc_all_ctx_pg_info(struct bnxt *bp, int ctx_max)  		struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];  		int n = 1; -		if (!ctxm->max_entries) +		if (!ctxm->max_entries || ctxm->pg_info)  			continue;  		if (ctxm->instance_bmap) @@ -8924,8 +9012,8 @@ static int bnxt_backing_store_cfg_v2(struct bnxt *bp, u32 ena)  				continue;  			}  			bnxt_bs_trace_init(bp, ctxm); -			last_type = type;  		} +		last_type = type;  	}  	if (last_type == BNXT_CTX_INV) { @@ -11264,8 +11352,6 @@ static void bnxt_disable_napi(struct bnxt *bp)  		if (bnapi->in_reset)  			cpr->sw_stats->rx.rx_resets++;  		napi_disable(&bnapi->napi); -		if (bnapi->rx_ring) -			cancel_work_sync(&cpr->dim.work);  	}  } @@ -13663,7 +13749,7 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)  			bnxt_reset_task(bp, true);  			break;  		} -		bnxt_free_one_rx_ring_skbs(bp, i); +		bnxt_free_one_rx_ring_skbs(bp, rxr);  		rxr->rx_prod = 0;  		rxr->rx_agg_prod = 0;  		rxr->rx_sw_agg_prod = 0; @@ -15293,19 +15379,6 @@ static const struct netdev_stat_ops bnxt_stat_ops = {  	.get_base_stats		= bnxt_get_base_stats,  }; -static int bnxt_alloc_rx_agg_bmap(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) -{ -	u16 mem_size; - -	rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1; -	mem_size = rxr->rx_agg_bmap_size / 8; -	rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL); -	if (!rxr->rx_agg_bmap) -		return -ENOMEM; - -	return 0; -} -  static int bnxt_queue_mem_alloc(struct net_device *dev, void *qmem, int idx)  {  	struct bnxt_rx_ring_info *rxr, *clone; @@ -15354,15 +15427,25 @@ static int bnxt_queue_mem_alloc(struct net_device *dev, void *qmem, int idx)  			goto err_free_rx_agg_ring;  	} +	if (bp->flags & BNXT_FLAG_TPA) { +		rc = bnxt_alloc_one_tpa_info(bp, clone); +		if (rc) +			goto err_free_tpa_info; +	} +  	bnxt_init_one_rx_ring_rxbd(bp, clone);  	bnxt_init_one_rx_agg_ring_rxbd(bp, clone);  	bnxt_alloc_one_rx_ring_skb(bp, clone, idx);  	if (bp->flags & BNXT_FLAG_AGG_RINGS)  		bnxt_alloc_one_rx_ring_page(bp, clone, idx); +	if (bp->flags & BNXT_FLAG_TPA) +		bnxt_alloc_one_tpa_info_data(bp, clone);  	return 0; +err_free_tpa_info: +	bnxt_free_one_tpa_info(bp, clone);  err_free_rx_agg_ring:  	bnxt_free_ring(bp, &clone->rx_agg_ring_struct.ring_mem);  err_free_rx_ring: @@ -15370,9 +15453,11 @@ err_free_rx_ring:  err_rxq_info_unreg:  	xdp_rxq_info_unreg(&clone->xdp_rxq);  err_page_pool_destroy: -	clone->page_pool->p.napi = NULL;  	page_pool_destroy(clone->page_pool); +	if (bnxt_separate_head_pool()) +		page_pool_destroy(clone->head_pool);  	clone->page_pool = NULL; +	clone->head_pool = NULL;  	return rc;  } @@ -15382,13 +15467,15 @@ static void bnxt_queue_mem_free(struct net_device *dev, void *qmem)  	struct bnxt *bp = netdev_priv(dev);  	struct bnxt_ring_struct *ring; -	bnxt_free_one_rx_ring(bp, rxr); -	bnxt_free_one_rx_agg_ring(bp, rxr); +	bnxt_free_one_rx_ring_skbs(bp, rxr);  	xdp_rxq_info_unreg(&rxr->xdp_rxq);  	page_pool_destroy(rxr->page_pool); +	if (bnxt_separate_head_pool()) +		page_pool_destroy(rxr->head_pool);  	rxr->page_pool = NULL; +	rxr->head_pool = NULL;  	ring = &rxr->rx_ring_struct;  	bnxt_free_ring(bp, &ring->ring_mem); @@ -15470,7 +15557,10 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx)  	rxr->rx_agg_prod = clone->rx_agg_prod;  	rxr->rx_sw_agg_prod = clone->rx_sw_agg_prod;  	rxr->rx_next_cons = clone->rx_next_cons; +	rxr->rx_tpa = clone->rx_tpa; +	rxr->rx_tpa_idx_map = clone->rx_tpa_idx_map;  	rxr->page_pool = clone->page_pool; +	rxr->head_pool = clone->head_pool;  	rxr->xdp_rxq = clone->xdp_rxq;  	bnxt_copy_rx_ring(bp, rxr, clone); @@ -15523,12 +15613,16 @@ static int bnxt_queue_stop(struct net_device *dev, void *qmem, int idx)  		bnxt_hwrm_vnic_update(bp, vnic,  				      VNIC_UPDATE_REQ_ENABLES_MRU_VALID);  	} - +	/* Make sure NAPI sees that the VNIC is disabled */ +	synchronize_net();  	rxr = &bp->rx_ring[idx]; +	cancel_work_sync(&rxr->bnapi->cp_ring.dim.work);  	bnxt_hwrm_rx_ring_free(bp, rxr, false);  	bnxt_hwrm_rx_agg_ring_free(bp, rxr, false);  	rxr->rx_next_cons = 0;  	page_pool_disable_direct_recycling(rxr->page_pool); +	if (bnxt_separate_head_pool()) +		page_pool_disable_direct_recycling(rxr->head_pool);  	memcpy(qmem, rxr, sizeof(*rxr));  	bnxt_init_rx_ring_struct(bp, qmem); @@ -16135,7 +16229,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (bp->max_fltr < BNXT_MAX_FLTR)  		bp->max_fltr = BNXT_MAX_FLTR;  	bnxt_init_l2_fltr_tbl(bp); -	bnxt_set_rx_skb_mode(bp, false); +	__bnxt_set_rx_skb_mode(bp, false);  	bnxt_set_tpa_flags(bp);  	bnxt_set_ring_params(bp);  	bnxt_rdma_aux_device_init(bp); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 23f1aff214b4..f11ed59203d9 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -267,6 +267,9 @@ struct rx_cmp {  	(((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_RSS_HASH_TYPE) >>\  	  RX_CMP_RSS_HASH_TYPE_SHIFT) & RSS_PROFILE_ID_MASK) +#define RX_CMP_ITYPES(rxcmp)					\ +	(le32_to_cpu((rxcmp)->rx_cmp_len_flags_type) & RX_CMP_FLAGS_ITYPES_MASK) +  #define RX_CMP_V3_HASH_TYPE_LEGACY(rxcmp)				\  	((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_V3_RSS_EXT_OP_LEGACY) >>\  	 RX_CMP_V3_RSS_EXT_OP_LEGACY_SHIFT) @@ -378,7 +381,7 @@ struct rx_agg_cmp {  	u32 rx_agg_cmp_opaque;  	__le32 rx_agg_cmp_v;  	#define RX_AGG_CMP_V					(1 << 0) -	#define RX_AGG_CMP_AGG_ID				(0xffff << 16) +	#define RX_AGG_CMP_AGG_ID				(0x0fff << 16)  	 #define RX_AGG_CMP_AGG_ID_SHIFT			 16  	__le32 rx_agg_cmp_unused;  }; @@ -416,7 +419,7 @@ struct rx_tpa_start_cmp {  	 #define RX_TPA_START_CMP_V3_RSS_HASH_TYPE_SHIFT	 7  	#define RX_TPA_START_CMP_AGG_ID				(0x7f << 25)  	 #define RX_TPA_START_CMP_AGG_ID_SHIFT			 25 -	#define RX_TPA_START_CMP_AGG_ID_P5			(0xffff << 16) +	#define RX_TPA_START_CMP_AGG_ID_P5			(0x0fff << 16)  	 #define RX_TPA_START_CMP_AGG_ID_SHIFT_P5		 16  	#define RX_TPA_START_CMP_METADATA1			(0xf << 28)  	 #define RX_TPA_START_CMP_METADATA1_SHIFT		 28 @@ -540,7 +543,7 @@ struct rx_tpa_end_cmp {  	 #define RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT		 16  	#define RX_TPA_END_CMP_AGG_ID				(0x7f << 25)  	 #define RX_TPA_END_CMP_AGG_ID_SHIFT			 25 -	#define RX_TPA_END_CMP_AGG_ID_P5			(0xffff << 16) +	#define RX_TPA_END_CMP_AGG_ID_P5			(0x0fff << 16)  	 #define RX_TPA_END_CMP_AGG_ID_SHIFT_P5			 16  	__le32 rx_tpa_end_cmp_tsdelta; @@ -2843,7 +2846,7 @@ u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx);  bool bnxt_bs_trace_avail(struct bnxt *bp, u16 type);  void bnxt_set_tpa_flags(struct bnxt *bp);  void bnxt_set_ring_params(struct bnxt *); -int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode); +void bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode);  void bnxt_insert_usr_fltr(struct bnxt *bp, struct bnxt_filter_base *fltr);  void bnxt_del_one_usr_fltr(struct bnxt *bp, struct bnxt_filter_base *fltr);  int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp, unsigned long *bmap, diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index f1f6bb328a55..d87681d71106 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -1187,10 +1187,14 @@ static int bnxt_grxclsrule(struct bnxt *bp, struct ethtool_rxnfc *cmd)  		}  	} -	if (fltr->base.flags & BNXT_ACT_DROP) +	if (fltr->base.flags & BNXT_ACT_DROP) {  		fs->ring_cookie = RX_CLS_FLOW_DISC; -	else +	} else if (fltr->base.flags & BNXT_ACT_RSS_CTX) { +		fs->flow_type |= FLOW_RSS; +		cmd->rss_context = fltr->base.fw_vnic_id; +	} else {  		fs->ring_cookie = fltr->base.rxq; +	}  	rc = 0;  fltr_err: diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c index b771c84cdd89..0ed26e3a28f4 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c @@ -208,7 +208,7 @@ int bnxt_send_msg(struct bnxt_en_dev *edev,  	rc = hwrm_req_replace(bp, req, fw_msg->msg, fw_msg->msg_len);  	if (rc) -		return rc; +		goto drop_req;  	hwrm_req_timeout(bp, req, fw_msg->timeout);  	resp = hwrm_req_hold(bp, req); @@ -220,6 +220,7 @@ int bnxt_send_msg(struct bnxt_en_dev *edev,  		memcpy(fw_msg->resp, resp, resp_len);  	} +drop_req:  	hwrm_req_drop(bp, req);  	return rc;  } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c index f88b641533fc..dc51dce209d5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -422,15 +422,8 @@ static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog)  		bnxt_set_rx_skb_mode(bp, true);  		xdp_features_set_redirect_target(dev, true);  	} else { -		int rx, tx; -  		xdp_features_clear_redirect_target(dev);  		bnxt_set_rx_skb_mode(bp, false); -		bnxt_get_max_rings(bp, &rx, &tx, true); -		if (rx > 1) { -			bp->flags &= ~BNXT_FLAG_NO_AGG_RINGS; -			bp->dev->hw_features |= NETIF_F_LRO; -		}  	}  	bp->tx_nr_rings_xdp = tx_xdp;  	bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tc + tx_xdp; diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index 75bd69ff61a8..c7c2c15a1815 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h @@ -2076,7 +2076,7 @@ void t4_idma_monitor(struct adapter *adapter,  		     struct sge_idma_monitor_state *idma,  		     int hz, int ticks);  int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf, -		      unsigned int naddr, u8 *addr); +		      u8 start, unsigned int naddr, u8 *addr);  void t4_tp_pio_read(struct adapter *adap, u32 *buff, u32 nregs,  		    u32 start_index, bool sleep_ok);  void t4_tp_tm_pio_read(struct adapter *adap, u32 *buff, u32 nregs, diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 97a261d5357e..604dcfd49aa4 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c @@ -1799,7 +1799,10 @@ void cxgb4_remove_tid(struct tid_info *t, unsigned int chan, unsigned int tid,  	struct adapter *adap = container_of(t, struct adapter, tids);  	struct sk_buff *skb; -	WARN_ON(tid_out_of_range(&adap->tids, tid)); +	if (tid_out_of_range(&adap->tids, tid)) { +		dev_err(adap->pdev_dev, "tid %d out of range\n", tid); +		return; +	}  	if (t->tid_tab[tid - adap->tids.tid_base]) {  		t->tid_tab[tid - adap->tids.tid_base] = NULL; @@ -3234,7 +3237,7 @@ static int cxgb4_mgmt_set_vf_mac(struct net_device *dev, int vf, u8 *mac)  	dev_info(pi->adapter->pdev_dev,  		 "Setting MAC %pM on VF %d\n", mac, vf); -	ret = t4_set_vf_mac_acl(adap, vf + 1, 1, mac); +	ret = t4_set_vf_mac_acl(adap, vf + 1, pi->lport, 1, mac);  	if (!ret)  		ether_addr_copy(adap->vfinfo[vf].vf_mac_addr, mac);  	return ret; diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 76de55306c4d..175bf9b13058 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c @@ -10215,11 +10215,12 @@ out:   *	t4_set_vf_mac_acl - Set MAC address for the specified VF   *	@adapter: The adapter   *	@vf: one of the VFs instantiated by the specified PF + *	@start: The start port id associated with specified VF   *	@naddr: the number of MAC addresses   *	@addr: the MAC address(es) to be set to the specified VF   */  int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf, -		      unsigned int naddr, u8 *addr) +		      u8 start, unsigned int naddr, u8 *addr)  {  	struct fw_acl_mac_cmd cmd; @@ -10234,7 +10235,7 @@ int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf,  	cmd.en_to_len16 = cpu_to_be32((unsigned int)FW_LEN16(cmd));  	cmd.nmac = naddr; -	switch (adapter->pf) { +	switch (start) {  	case 3:  		memcpy(cmd.macaddr3, addr, sizeof(cmd.macaddr3));  		break; diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_main.c b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_main.c index 96fd31d75dfd..daa1ebaef511 100644 --- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_main.c +++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_main.c @@ -346,8 +346,9 @@ static struct sk_buff *copy_gl_to_skb_pkt(const struct pkt_gl *gl,  	 * driver. Once driver synthesizes cpl_pass_accept_req the skb will go  	 * through the regular cpl_pass_accept_req processing in TOM.  	 */ -	skb = alloc_skb(gl->tot_len + sizeof(struct cpl_pass_accept_req) -			- pktshift, GFP_ATOMIC); +	skb = alloc_skb(size_add(gl->tot_len, +				 sizeof(struct cpl_pass_accept_req)) - +			pktshift, GFP_ATOMIC);  	if (unlikely(!skb))  		return NULL;  	__skb_put(skb, gl->tot_len + sizeof(struct cpl_pass_accept_req) diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c index 35634c516e26..535969fa0fdb 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc.c +++ b/drivers/net/ethernet/freescale/enetc/enetc.c @@ -29,6 +29,9 @@ EXPORT_SYMBOL_GPL(enetc_port_mac_wr);  static void enetc_change_preemptible_tcs(struct enetc_ndev_priv *priv,  					 u8 preemptible_tcs)  { +	if (!(priv->si->hw_features & ENETC_SI_F_QBU)) +		return; +  	priv->preemptible_tcs = preemptible_tcs;  	enetc_mm_commit_preemptible_tcs(priv);  } @@ -1756,15 +1759,6 @@ void enetc_get_si_caps(struct enetc_si *si)  		rss = enetc_rd(hw, ENETC_SIRSSCAPR);  		si->num_rss = ENETC_SIRSSCAPR_GET_NUM_RSS(rss);  	} - -	if (val & ENETC_SIPCAPR0_QBV) -		si->hw_features |= ENETC_SI_F_QBV; - -	if (val & ENETC_SIPCAPR0_QBU) -		si->hw_features |= ENETC_SI_F_QBU; - -	if (val & ENETC_SIPCAPR0_PSFP) -		si->hw_features |= ENETC_SI_F_PSFP;  }  EXPORT_SYMBOL_GPL(enetc_get_si_caps); diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h index 7c3285584f8a..55ba949230ff 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h +++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h @@ -23,10 +23,7 @@  #define ENETC_SICTR0	0x18  #define ENETC_SICTR1	0x1c  #define ENETC_SIPCAPR0	0x20 -#define ENETC_SIPCAPR0_PSFP	BIT(9)  #define ENETC_SIPCAPR0_RSS	BIT(8) -#define ENETC_SIPCAPR0_QBV	BIT(4) -#define ENETC_SIPCAPR0_QBU	BIT(3)  #define ENETC_SIPCAPR0_RFS	BIT(2)  #define ENETC_SIPCAPR1	0x24  #define ENETC_SITGTGR	0x30 @@ -194,6 +191,9 @@ enum enetc_bdr_type {TX, RX};  #define ENETC_PCAPR0		0x0900  #define ENETC_PCAPR0_RXBDR(val)	((val) >> 24)  #define ENETC_PCAPR0_TXBDR(val)	(((val) >> 16) & 0xff) +#define ENETC_PCAPR0_PSFP	BIT(9) +#define ENETC_PCAPR0_QBV	BIT(4) +#define ENETC_PCAPR0_QBU	BIT(3)  #define ENETC_PCAPR1		0x0904  #define ENETC_PSICFGR0(n)	(0x0940 + (n) * 0xc)  /* n = SI index */  #define ENETC_PSICFGR0_SET_TXBDR(val)	((val) & 0xff) diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c index c47b4a743d93..203862ec1114 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c @@ -409,6 +409,23 @@ static void enetc_port_assign_rfs_entries(struct enetc_si *si)  	enetc_port_wr(hw, ENETC_PRFSMR, ENETC_PRFSMR_RFSE);  } +static void enetc_port_get_caps(struct enetc_si *si) +{ +	struct enetc_hw *hw = &si->hw; +	u32 val; + +	val = enetc_port_rd(hw, ENETC_PCAPR0); + +	if (val & ENETC_PCAPR0_QBV) +		si->hw_features |= ENETC_SI_F_QBV; + +	if (val & ENETC_PCAPR0_QBU) +		si->hw_features |= ENETC_SI_F_QBU; + +	if (val & ENETC_PCAPR0_PSFP) +		si->hw_features |= ENETC_SI_F_PSFP; +} +  static void enetc_port_si_configure(struct enetc_si *si)  {  	struct enetc_pf *pf = enetc_si_priv(si); @@ -416,6 +433,8 @@ static void enetc_port_si_configure(struct enetc_si *si)  	int num_rings, i;  	u32 val; +	enetc_port_get_caps(si); +  	val = enetc_port_rd(hw, ENETC_PCAPR0);  	num_rings = min(ENETC_PCAPR0_RXBDR(val), ENETC_PCAPR0_TXBDR(val)); diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 1b55047c0237..4566848e1d7c 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1591,19 +1591,22 @@ static void fec_enet_tx(struct net_device *ndev, int budget)  		fec_enet_tx_queue(ndev, i, budget);  } -static void fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq, +static int fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq,  				struct bufdesc *bdp, int index)  {  	struct page *new_page;  	dma_addr_t phys_addr;  	new_page = page_pool_dev_alloc_pages(rxq->page_pool); -	WARN_ON(!new_page); -	rxq->rx_skb_info[index].page = new_page; +	if (unlikely(!new_page)) +		return -ENOMEM; +	rxq->rx_skb_info[index].page = new_page;  	rxq->rx_skb_info[index].offset = FEC_ENET_XDP_HEADROOM;  	phys_addr = page_pool_get_dma_addr(new_page) + FEC_ENET_XDP_HEADROOM;  	bdp->cbd_bufaddr = cpu_to_fec32(phys_addr); + +	return 0;  }  static u32 @@ -1698,6 +1701,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)  	int cpu = smp_processor_id();  	struct xdp_buff xdp;  	struct page *page; +	__fec32 cbd_bufaddr;  	u32 sub_len = 4;  #if !defined(CONFIG_M5272) @@ -1766,12 +1770,17 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)  		index = fec_enet_get_bd_index(bdp, &rxq->bd);  		page = rxq->rx_skb_info[index].page; +		cbd_bufaddr = bdp->cbd_bufaddr; +		if (fec_enet_update_cbd(rxq, bdp, index)) { +			ndev->stats.rx_dropped++; +			goto rx_processing_done; +		} +  		dma_sync_single_for_cpu(&fep->pdev->dev, -					fec32_to_cpu(bdp->cbd_bufaddr), +					fec32_to_cpu(cbd_bufaddr),  					pkt_len,  					DMA_FROM_DEVICE);  		prefetch(page_address(page)); -		fec_enet_update_cbd(rxq, bdp, index);  		if (xdp_prog) {  			xdp_buff_clear_frags_flag(&xdp); diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h index dd92949bb214..8167cc5fb0df 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -1140,6 +1140,7 @@ int gve_xdp_xmit_one(struct gve_priv *priv, struct gve_tx_ring *tx,  void gve_xdp_tx_flush(struct gve_priv *priv, u32 xdp_qid);  bool gve_tx_poll(struct gve_notify_block *block, int budget);  bool gve_xdp_poll(struct gve_notify_block *block, int budget); +int gve_xsk_tx_poll(struct gve_notify_block *block, int budget);  int gve_tx_alloc_rings_gqi(struct gve_priv *priv,  			   struct gve_tx_alloc_rings_cfg *cfg);  void gve_tx_free_rings_gqi(struct gve_priv *priv, diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c index e171ca248f9a..533e659b15b3 100644 --- a/drivers/net/ethernet/google/gve/gve_main.c +++ b/drivers/net/ethernet/google/gve/gve_main.c @@ -333,6 +333,14 @@ int gve_napi_poll(struct napi_struct *napi, int budget)  	if (block->rx) {  		work_done = gve_rx_poll(block, budget); + +		/* Poll XSK TX as part of RX NAPI. Setup re-poll based on max of +		 * TX and RX work done. +		 */ +		if (priv->xdp_prog) +			work_done = max_t(int, work_done, +					  gve_xsk_tx_poll(block, budget)); +  		reschedule |= work_done == budget;  	} @@ -922,11 +930,13 @@ static void gve_init_sync_stats(struct gve_priv *priv)  static void gve_tx_get_curr_alloc_cfg(struct gve_priv *priv,  				      struct gve_tx_alloc_rings_cfg *cfg)  { +	int num_xdp_queues = priv->xdp_prog ? priv->rx_cfg.num_queues : 0; +  	cfg->qcfg = &priv->tx_cfg;  	cfg->raw_addressing = !gve_is_qpl(priv);  	cfg->ring_size = priv->tx_desc_cnt;  	cfg->start_idx = 0; -	cfg->num_rings = gve_num_tx_queues(priv); +	cfg->num_rings = priv->tx_cfg.num_queues + num_xdp_queues;  	cfg->tx = priv->tx;  } @@ -1623,8 +1633,8 @@ static int gve_xsk_pool_enable(struct net_device *dev,  	if (err)  		return err; -	/* If XDP prog is not installed, return */ -	if (!priv->xdp_prog) +	/* If XDP prog is not installed or interface is down, return. */ +	if (!priv->xdp_prog || !netif_running(dev))  		return 0;  	rx = &priv->rx[qid]; @@ -1669,21 +1679,16 @@ static int gve_xsk_pool_disable(struct net_device *dev,  	if (qid >= priv->rx_cfg.num_queues)  		return -EINVAL; -	/* If XDP prog is not installed, unmap DMA and return */ -	if (!priv->xdp_prog) -		goto done; - -	tx_qid = gve_xdp_tx_queue_id(priv, qid); -	if (!netif_running(dev)) { -		priv->rx[qid].xsk_pool = NULL; -		xdp_rxq_info_unreg(&priv->rx[qid].xsk_rxq); -		priv->tx[tx_qid].xsk_pool = NULL; +	/* If XDP prog is not installed or interface is down, unmap DMA and +	 * return. +	 */ +	if (!priv->xdp_prog || !netif_running(dev))  		goto done; -	}  	napi_rx = &priv->ntfy_blocks[priv->rx[qid].ntfy_id].napi;  	napi_disable(napi_rx); /* make sure current rx poll is done */ +	tx_qid = gve_xdp_tx_queue_id(priv, qid);  	napi_tx = &priv->ntfy_blocks[priv->tx[tx_qid].ntfy_id].napi;  	napi_disable(napi_tx); /* make sure current tx poll is done */ @@ -1709,24 +1714,20 @@ done:  static int gve_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)  {  	struct gve_priv *priv = netdev_priv(dev); -	int tx_queue_id = gve_xdp_tx_queue_id(priv, queue_id); +	struct napi_struct *napi; + +	if (!gve_get_napi_enabled(priv)) +		return -ENETDOWN;  	if (queue_id >= priv->rx_cfg.num_queues || !priv->xdp_prog)  		return -EINVAL; -	if (flags & XDP_WAKEUP_TX) { -		struct gve_tx_ring *tx = &priv->tx[tx_queue_id]; -		struct napi_struct *napi = -			&priv->ntfy_blocks[tx->ntfy_id].napi; - -		if (!napi_if_scheduled_mark_missed(napi)) { -			/* Call local_bh_enable to trigger SoftIRQ processing */ -			local_bh_disable(); -			napi_schedule(napi); -			local_bh_enable(); -		} - -		tx->xdp_xsk_wakeup++; +	napi = &priv->ntfy_blocks[gve_rx_idx_to_ntfy(priv, queue_id)].napi; +	if (!napi_if_scheduled_mark_missed(napi)) { +		/* Call local_bh_enable to trigger SoftIRQ processing */ +		local_bh_disable(); +		napi_schedule(napi); +		local_bh_enable();  	}  	return 0; @@ -1837,6 +1838,7 @@ int gve_adjust_queues(struct gve_priv *priv,  {  	struct gve_tx_alloc_rings_cfg tx_alloc_cfg = {0};  	struct gve_rx_alloc_rings_cfg rx_alloc_cfg = {0}; +	int num_xdp_queues;  	int err;  	gve_get_curr_alloc_cfgs(priv, &tx_alloc_cfg, &rx_alloc_cfg); @@ -1847,6 +1849,10 @@ int gve_adjust_queues(struct gve_priv *priv,  	rx_alloc_cfg.qcfg = &new_rx_config;  	tx_alloc_cfg.num_rings = new_tx_config.num_queues; +	/* Add dedicated XDP TX queues if enabled. */ +	num_xdp_queues = priv->xdp_prog ? new_rx_config.num_queues : 0; +	tx_alloc_cfg.num_rings += num_xdp_queues; +  	if (netif_running(priv->dev)) {  		err = gve_adjust_config(priv, &tx_alloc_cfg, &rx_alloc_cfg);  		return err; @@ -1899,6 +1905,9 @@ static void gve_turndown(struct gve_priv *priv)  	gve_clear_napi_enabled(priv);  	gve_clear_report_stats(priv); + +	/* Make sure that all traffic is finished processing. */ +	synchronize_net();  }  static void gve_turnup(struct gve_priv *priv) @@ -2232,14 +2241,18 @@ static void gve_service_task(struct work_struct *work)  static void gve_set_netdev_xdp_features(struct gve_priv *priv)  { +	xdp_features_t xdp_features; +  	if (priv->queue_format == GVE_GQI_QPL_FORMAT) { -		priv->dev->xdp_features = NETDEV_XDP_ACT_BASIC; -		priv->dev->xdp_features |= NETDEV_XDP_ACT_REDIRECT; -		priv->dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT; -		priv->dev->xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY; +		xdp_features = NETDEV_XDP_ACT_BASIC; +		xdp_features |= NETDEV_XDP_ACT_REDIRECT; +		xdp_features |= NETDEV_XDP_ACT_NDO_XMIT; +		xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY;  	} else { -		priv->dev->xdp_features = 0; +		xdp_features = 0;  	} + +	xdp_set_features_flag(priv->dev, xdp_features);  }  static int gve_init_priv(struct gve_priv *priv, bool skip_describe_device) diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/ethernet/google/gve/gve_tx.c index e7fb7d6d283d..4350ebd9c2bd 100644 --- a/drivers/net/ethernet/google/gve/gve_tx.c +++ b/drivers/net/ethernet/google/gve/gve_tx.c @@ -206,7 +206,10 @@ void gve_tx_stop_ring_gqi(struct gve_priv *priv, int idx)  		return;  	gve_remove_napi(priv, ntfy_idx); -	gve_clean_tx_done(priv, tx, priv->tx_desc_cnt, false); +	if (tx->q_num < priv->tx_cfg.num_queues) +		gve_clean_tx_done(priv, tx, priv->tx_desc_cnt, false); +	else +		gve_clean_xdp_done(priv, tx, priv->tx_desc_cnt);  	netdev_tx_reset_queue(tx->netdev_txq);  	gve_tx_remove_from_block(priv, idx);  } @@ -834,9 +837,12 @@ int gve_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,  	struct gve_tx_ring *tx;  	int i, err = 0, qid; -	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) +	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK) || !priv->xdp_prog)  		return -EINVAL; +	if (!gve_get_napi_enabled(priv)) +		return -ENETDOWN; +  	qid = gve_xdp_tx_queue_id(priv,  				  smp_processor_id() % priv->num_xdp_queues); @@ -975,33 +981,41 @@ out:  	return sent;  } +int gve_xsk_tx_poll(struct gve_notify_block *rx_block, int budget) +{ +	struct gve_rx_ring *rx = rx_block->rx; +	struct gve_priv *priv = rx->gve; +	struct gve_tx_ring *tx; +	int sent = 0; + +	tx = &priv->tx[gve_xdp_tx_queue_id(priv, rx->q_num)]; +	if (tx->xsk_pool) { +		sent = gve_xsk_tx(priv, tx, budget); + +		u64_stats_update_begin(&tx->statss); +		tx->xdp_xsk_sent += sent; +		u64_stats_update_end(&tx->statss); +		if (xsk_uses_need_wakeup(tx->xsk_pool)) +			xsk_set_tx_need_wakeup(tx->xsk_pool); +	} + +	return sent; +} +  bool gve_xdp_poll(struct gve_notify_block *block, int budget)  {  	struct gve_priv *priv = block->priv;  	struct gve_tx_ring *tx = block->tx;  	u32 nic_done; -	bool repoll;  	u32 to_do;  	/* Find out how much work there is to be done */  	nic_done = gve_tx_load_event_counter(priv, tx);  	to_do = min_t(u32, (nic_done - tx->done), budget);  	gve_clean_xdp_done(priv, tx, to_do); -	repoll = nic_done != tx->done; - -	if (tx->xsk_pool) { -		int sent = gve_xsk_tx(priv, tx, budget); - -		u64_stats_update_begin(&tx->statss); -		tx->xdp_xsk_sent += sent; -		u64_stats_update_end(&tx->statss); -		repoll |= (sent == budget); -		if (xsk_uses_need_wakeup(tx->xsk_pool)) -			xsk_set_tx_need_wakeup(tx->xsk_pool); -	}  	/* If we still have work we want to repoll */ -	return repoll; +	return nic_done != tx->done;  }  bool gve_tx_poll(struct gve_notify_block *block, int budget) diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index 710a8f9f2248..12ba380eb701 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h @@ -916,9 +916,6 @@ struct hnae3_handle {  	u8 netdev_flags;  	struct dentry *hnae3_dbgfs; -	/* protects concurrent contention between debugfs commands */ -	struct mutex dbgfs_lock; -	char **dbgfs_buf;  	/* Network interface message level enabled bits */  	u32 msg_enable; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c index 807eb3bbb11c..9bbece25552b 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c @@ -1260,69 +1260,55 @@ static int hns3_dbg_read_cmd(struct hns3_dbg_data *dbg_data,  static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer,  			     size_t count, loff_t *ppos)  { -	struct hns3_dbg_data *dbg_data = filp->private_data; +	char *buf = filp->private_data; + +	return simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf)); +} + +static int hns3_dbg_open(struct inode *inode, struct file *filp) +{ +	struct hns3_dbg_data *dbg_data = inode->i_private;  	struct hnae3_handle *handle = dbg_data->handle;  	struct hns3_nic_priv *priv = handle->priv; -	ssize_t size = 0; -	char **save_buf; -	char *read_buf;  	u32 index; +	char *buf;  	int ret; +	if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) || +	    test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) +		return -EBUSY; +  	ret = hns3_dbg_get_cmd_index(dbg_data, &index);  	if (ret)  		return ret; -	mutex_lock(&handle->dbgfs_lock); -	save_buf = &handle->dbgfs_buf[index]; - -	if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) || -	    test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) { -		ret = -EBUSY; -		goto out; -	} - -	if (*save_buf) { -		read_buf = *save_buf; -	} else { -		read_buf = kvzalloc(hns3_dbg_cmd[index].buf_len, GFP_KERNEL); -		if (!read_buf) { -			ret = -ENOMEM; -			goto out; -		} - -		/* save the buffer addr until the last read operation */ -		*save_buf = read_buf; - -		/* get data ready for the first time to read */ -		ret = hns3_dbg_read_cmd(dbg_data, hns3_dbg_cmd[index].cmd, -					read_buf, hns3_dbg_cmd[index].buf_len); -		if (ret) -			goto out; -	} +	buf = kvzalloc(hns3_dbg_cmd[index].buf_len, GFP_KERNEL); +	if (!buf) +		return -ENOMEM; -	size = simple_read_from_buffer(buffer, count, ppos, read_buf, -				       strlen(read_buf)); -	if (size > 0) { -		mutex_unlock(&handle->dbgfs_lock); -		return size; +	ret = hns3_dbg_read_cmd(dbg_data, hns3_dbg_cmd[index].cmd, +				buf, hns3_dbg_cmd[index].buf_len); +	if (ret) { +		kvfree(buf); +		return ret;  	} -out: -	/* free the buffer for the last read operation */ -	if (*save_buf) { -		kvfree(*save_buf); -		*save_buf = NULL; -	} +	filp->private_data = buf; +	return 0; +} -	mutex_unlock(&handle->dbgfs_lock); -	return ret; +static int hns3_dbg_release(struct inode *inode, struct file *filp) +{ +	kvfree(filp->private_data); +	filp->private_data = NULL; +	return 0;  }  static const struct file_operations hns3_dbg_fops = {  	.owner = THIS_MODULE, -	.open  = simple_open, +	.open  = hns3_dbg_open,  	.read  = hns3_dbg_read, +	.release = hns3_dbg_release,  };  static int hns3_dbg_bd_file_init(struct hnae3_handle *handle, u32 cmd) @@ -1379,13 +1365,6 @@ int hns3_dbg_init(struct hnae3_handle *handle)  	int ret;  	u32 i; -	handle->dbgfs_buf = devm_kcalloc(&handle->pdev->dev, -					 ARRAY_SIZE(hns3_dbg_cmd), -					 sizeof(*handle->dbgfs_buf), -					 GFP_KERNEL); -	if (!handle->dbgfs_buf) -		return -ENOMEM; -  	hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry =  				debugfs_create_dir(name, hns3_dbgfs_root);  	handle->hnae3_dbgfs = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry; @@ -1395,8 +1374,6 @@ int hns3_dbg_init(struct hnae3_handle *handle)  			debugfs_create_dir(hns3_dbg_dentry[i].name,  					   handle->hnae3_dbgfs); -	mutex_init(&handle->dbgfs_lock); -  	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) {  		if ((hns3_dbg_cmd[i].cmd == HNAE3_DBG_CMD_TM_NODES &&  		     ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2) || @@ -1425,24 +1402,13 @@ int hns3_dbg_init(struct hnae3_handle *handle)  out:  	debugfs_remove_recursive(handle->hnae3_dbgfs);  	handle->hnae3_dbgfs = NULL; -	mutex_destroy(&handle->dbgfs_lock);  	return ret;  }  void hns3_dbg_uninit(struct hnae3_handle *handle)  { -	u32 i; -  	debugfs_remove_recursive(handle->hnae3_dbgfs);  	handle->hnae3_dbgfs = NULL; - -	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) -		if (handle->dbgfs_buf[i]) { -			kvfree(handle->dbgfs_buf[i]); -			handle->dbgfs_buf[i] = NULL; -		} - -	mutex_destroy(&handle->dbgfs_lock);  }  void hns3_dbg_register_debugfs(const char *debugfs_dir_name) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 43377a7b2426..a7e3b22f641c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -2452,7 +2452,6 @@ static int hns3_nic_set_features(struct net_device *netdev,  			return ret;  	} -	netdev->features = features;  	return 0;  } diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 05942fa78b11..db7845009252 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -6,6 +6,7 @@  #include <linux/etherdevice.h>  #include <linux/init.h>  #include <linux/interrupt.h> +#include <linux/irq.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/netdevice.h> @@ -3574,6 +3575,17 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,  	return ret;  } +static void hclge_set_reset_pending(struct hclge_dev *hdev, +				    enum hnae3_reset_type reset_type) +{ +	/* When an incorrect reset type is executed, the get_reset_level +	 * function generates the HNAE3_NONE_RESET flag. As a result, this +	 * type do not need to pending. +	 */ +	if (reset_type != HNAE3_NONE_RESET) +		set_bit(reset_type, &hdev->reset_pending); +} +  static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)  {  	u32 cmdq_src_reg, msix_src_reg, hw_err_src_reg; @@ -3594,7 +3606,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)  	 */  	if (BIT(HCLGE_VECTOR0_IMPRESET_INT_B) & msix_src_reg) {  		dev_info(&hdev->pdev->dev, "IMP reset interrupt\n"); -		set_bit(HNAE3_IMP_RESET, &hdev->reset_pending); +		hclge_set_reset_pending(hdev, HNAE3_IMP_RESET);  		set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);  		*clearval = BIT(HCLGE_VECTOR0_IMPRESET_INT_B);  		hdev->rst_stats.imp_rst_cnt++; @@ -3604,7 +3616,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)  	if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & msix_src_reg) {  		dev_info(&hdev->pdev->dev, "global reset interrupt\n");  		set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state); -		set_bit(HNAE3_GLOBAL_RESET, &hdev->reset_pending); +		hclge_set_reset_pending(hdev, HNAE3_GLOBAL_RESET);  		*clearval = BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B);  		hdev->rst_stats.global_rst_cnt++;  		return HCLGE_VECTOR0_EVENT_RST; @@ -3759,7 +3771,7 @@ static int hclge_misc_irq_init(struct hclge_dev *hdev)  	snprintf(hdev->misc_vector.name, HNAE3_INT_NAME_LEN, "%s-misc-%s",  		 HCLGE_NAME, pci_name(hdev->pdev));  	ret = request_irq(hdev->misc_vector.vector_irq, hclge_misc_irq_handle, -			  0, hdev->misc_vector.name, hdev); +			  IRQF_NO_AUTOEN, hdev->misc_vector.name, hdev);  	if (ret) {  		hclge_free_vector(hdev, 0);  		dev_err(&hdev->pdev->dev, "request misc irq(%d) fail\n", @@ -4052,7 +4064,7 @@ static void hclge_do_reset(struct hclge_dev *hdev)  	case HNAE3_FUNC_RESET:  		dev_info(&pdev->dev, "PF reset requested\n");  		/* schedule again to check later */ -		set_bit(HNAE3_FUNC_RESET, &hdev->reset_pending); +		hclge_set_reset_pending(hdev, HNAE3_FUNC_RESET);  		hclge_reset_task_schedule(hdev);  		break;  	default: @@ -4086,6 +4098,8 @@ static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,  		clear_bit(HNAE3_FLR_RESET, addr);  	} +	clear_bit(HNAE3_NONE_RESET, addr); +  	if (hdev->reset_type != HNAE3_NONE_RESET &&  	    rst_level < hdev->reset_type)  		return HNAE3_NONE_RESET; @@ -4227,7 +4241,7 @@ static bool hclge_reset_err_handle(struct hclge_dev *hdev)  		return false;  	} else if (hdev->rst_stats.reset_fail_cnt < MAX_RESET_FAIL_CNT) {  		hdev->rst_stats.reset_fail_cnt++; -		set_bit(hdev->reset_type, &hdev->reset_pending); +		hclge_set_reset_pending(hdev, hdev->reset_type);  		dev_info(&hdev->pdev->dev,  			 "re-schedule reset task(%u)\n",  			 hdev->rst_stats.reset_fail_cnt); @@ -4470,8 +4484,20 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)  static void hclge_set_def_reset_request(struct hnae3_ae_dev *ae_dev,  					enum hnae3_reset_type rst_type)  { +#define HCLGE_SUPPORT_RESET_TYPE \ +	(BIT(HNAE3_FLR_RESET) | BIT(HNAE3_FUNC_RESET) | \ +	BIT(HNAE3_GLOBAL_RESET) | BIT(HNAE3_IMP_RESET)) +  	struct hclge_dev *hdev = ae_dev->priv; +	if (!(BIT(rst_type) & HCLGE_SUPPORT_RESET_TYPE)) { +		/* To prevent reset triggered by hclge_reset_event */ +		set_bit(HNAE3_NONE_RESET, &hdev->default_reset_request); +		dev_warn(&hdev->pdev->dev, "unsupported reset type %d\n", +			 rst_type); +		return; +	} +  	set_bit(rst_type, &hdev->default_reset_request);  } @@ -11881,9 +11907,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)  	hclge_init_rxd_adv_layout(hdev); -	/* Enable MISC vector(vector0) */ -	hclge_enable_vector(&hdev->misc_vector, true); -  	ret = hclge_init_wol(hdev);  	if (ret)  		dev_warn(&pdev->dev, @@ -11896,6 +11919,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)  	hclge_state_init(hdev);  	hdev->last_reset_time = jiffies; +	/* Enable MISC vector(vector0) */ +	enable_irq(hdev->misc_vector.vector_irq); +	hclge_enable_vector(&hdev->misc_vector, true); +  	dev_info(&hdev->pdev->dev, "%s driver initialization finished.\n",  		 HCLGE_DRIVER_NAME); @@ -12301,7 +12328,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)  	/* Disable MISC vector(vector0) */  	hclge_enable_vector(&hdev->misc_vector, false); -	synchronize_irq(hdev->misc_vector.vector_irq); +	disable_irq(hdev->misc_vector.vector_irq);  	/* Disable all hw interrupts */  	hclge_config_mac_tnl_int(hdev, false); diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c index 5505caea88e9..bab16c2191b2 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c @@ -58,6 +58,9 @@ bool hclge_ptp_set_tx_info(struct hnae3_handle *handle, struct sk_buff *skb)  	struct hclge_dev *hdev = vport->back;  	struct hclge_ptp *ptp = hdev->ptp; +	if (!ptp) +		return false; +  	if (!test_bit(HCLGE_PTP_FLAG_TX_EN, &ptp->flags) ||  	    test_and_set_bit(HCLGE_STATE_PTP_TX_HANDLING, &hdev->state)) {  		ptp->tx_skipped++; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c index 43c1c18fa81f..8c057192aae6 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_regs.c @@ -510,9 +510,9 @@ out:  static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data,  			      struct hnae3_knic_private_info *kinfo)  { -#define HCLGE_RING_REG_OFFSET		0x200  #define HCLGE_RING_INT_REG_OFFSET	0x4 +	struct hnae3_queue *tqp;  	int i, j, reg_num;  	int data_num_sum;  	u32 *reg = data; @@ -533,10 +533,11 @@ static int hclge_fetch_pf_reg(struct hclge_dev *hdev, void *data,  	reg_num = ARRAY_SIZE(ring_reg_addr_list);  	for (j = 0; j < kinfo->num_tqps; j++) {  		reg += hclge_reg_get_tlv(HCLGE_REG_TAG_RING, reg_num, reg); +		tqp = kinfo->tqp[j];  		for (i = 0; i < reg_num; i++) -			*reg++ = hclge_read_dev(&hdev->hw, -						ring_reg_addr_list[i] + -						HCLGE_RING_REG_OFFSET * j); +			*reg++ = readl_relaxed(tqp->io_base - +					       HCLGE_TQP_REG_OFFSET + +					       ring_reg_addr_list[i]);  	}  	data_num_sum += (reg_num + HCLGE_REG_TLV_SPACE) * kinfo->num_tqps; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c index 2f6ffb88e700..163c6e59ea4c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c @@ -1393,6 +1393,17 @@ static int hclgevf_notify_roce_client(struct hclgevf_dev *hdev,  	return ret;  } +static void hclgevf_set_reset_pending(struct hclgevf_dev *hdev, +				      enum hnae3_reset_type reset_type) +{ +	/* When an incorrect reset type is executed, the get_reset_level +	 * function generates the HNAE3_NONE_RESET flag. As a result, this +	 * type do not need to pending. +	 */ +	if (reset_type != HNAE3_NONE_RESET) +		set_bit(reset_type, &hdev->reset_pending); +} +  static int hclgevf_reset_wait(struct hclgevf_dev *hdev)  {  #define HCLGEVF_RESET_WAIT_US	20000 @@ -1542,7 +1553,7 @@ static void hclgevf_reset_err_handle(struct hclgevf_dev *hdev)  		hdev->rst_stats.rst_fail_cnt);  	if (hdev->rst_stats.rst_fail_cnt < HCLGEVF_RESET_MAX_FAIL_CNT) -		set_bit(hdev->reset_type, &hdev->reset_pending); +		hclgevf_set_reset_pending(hdev, hdev->reset_type);  	if (hclgevf_is_reset_pending(hdev)) {  		set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state); @@ -1662,6 +1673,8 @@ static enum hnae3_reset_type hclgevf_get_reset_level(unsigned long *addr)  		clear_bit(HNAE3_FLR_RESET, addr);  	} +	clear_bit(HNAE3_NONE_RESET, addr); +  	return rst_level;  } @@ -1671,14 +1684,15 @@ static void hclgevf_reset_event(struct pci_dev *pdev,  	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);  	struct hclgevf_dev *hdev = ae_dev->priv; -	dev_info(&hdev->pdev->dev, "received reset request from VF enet\n"); -  	if (hdev->default_reset_request)  		hdev->reset_level =  			hclgevf_get_reset_level(&hdev->default_reset_request);  	else  		hdev->reset_level = HNAE3_VF_FUNC_RESET; +	dev_info(&hdev->pdev->dev, "received reset request from VF enet, reset level is %d\n", +		 hdev->reset_level); +  	/* reset of this VF requested */  	set_bit(HCLGEVF_RESET_REQUESTED, &hdev->reset_state);  	hclgevf_reset_task_schedule(hdev); @@ -1689,8 +1703,20 @@ static void hclgevf_reset_event(struct pci_dev *pdev,  static void hclgevf_set_def_reset_request(struct hnae3_ae_dev *ae_dev,  					  enum hnae3_reset_type rst_type)  { +#define HCLGEVF_SUPPORT_RESET_TYPE \ +	(BIT(HNAE3_VF_RESET) | BIT(HNAE3_VF_FUNC_RESET) | \ +	BIT(HNAE3_VF_PF_FUNC_RESET) | BIT(HNAE3_VF_FULL_RESET) | \ +	BIT(HNAE3_FLR_RESET) | BIT(HNAE3_VF_EXP_RESET)) +  	struct hclgevf_dev *hdev = ae_dev->priv; +	if (!(BIT(rst_type) & HCLGEVF_SUPPORT_RESET_TYPE)) { +		/* To prevent reset triggered by hclge_reset_event */ +		set_bit(HNAE3_NONE_RESET, &hdev->default_reset_request); +		dev_info(&hdev->pdev->dev, "unsupported reset type %d\n", +			 rst_type); +		return; +	}  	set_bit(rst_type, &hdev->default_reset_request);  } @@ -1847,14 +1873,14 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)  		 */  		if (hdev->reset_attempts > HCLGEVF_MAX_RESET_ATTEMPTS_CNT) {  			/* prepare for full reset of stack + pcie interface */ -			set_bit(HNAE3_VF_FULL_RESET, &hdev->reset_pending); +			hclgevf_set_reset_pending(hdev, HNAE3_VF_FULL_RESET);  			/* "defer" schedule the reset task again */  			set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);  		} else {  			hdev->reset_attempts++; -			set_bit(hdev->reset_level, &hdev->reset_pending); +			hclgevf_set_reset_pending(hdev, hdev->reset_level);  			set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);  		}  		hclgevf_reset_task_schedule(hdev); @@ -1977,7 +2003,7 @@ static enum hclgevf_evt_cause hclgevf_check_evt_cause(struct hclgevf_dev *hdev,  		rst_ing_reg = hclgevf_read_dev(&hdev->hw, HCLGEVF_RST_ING);  		dev_info(&hdev->pdev->dev,  			 "receive reset interrupt 0x%x!\n", rst_ing_reg); -		set_bit(HNAE3_VF_RESET, &hdev->reset_pending); +		hclgevf_set_reset_pending(hdev, HNAE3_VF_RESET);  		set_bit(HCLGEVF_RESET_PENDING, &hdev->reset_state);  		set_bit(HCLGE_COMM_STATE_CMD_DISABLE, &hdev->hw.hw.comm_state);  		*clearval = ~(1U << HCLGEVF_VECTOR0_RST_INT_B); @@ -2287,6 +2313,8 @@ static void hclgevf_state_init(struct hclgevf_dev *hdev)  	clear_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state);  	INIT_DELAYED_WORK(&hdev->service_task, hclgevf_service_task); +	/* timer needs to be initialized before misc irq */ +	timer_setup(&hdev->reset_timer, hclgevf_reset_timer, 0);  	mutex_init(&hdev->mbx_resp.mbx_mutex);  	sema_init(&hdev->reset_sem, 1); @@ -2986,7 +3014,6 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)  		 HCLGEVF_DRIVER_NAME);  	hclgevf_task_schedule(hdev, round_jiffies_relative(HZ)); -	timer_setup(&hdev->reset_timer, hclgevf_reset_timer, 0);  	return 0; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c index 6db415d8b917..7d9d9dbc7560 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c @@ -123,10 +123,10 @@ int hclgevf_get_regs_len(struct hnae3_handle *handle)  void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version,  		      void *data)  { -#define HCLGEVF_RING_REG_OFFSET		0x200  #define HCLGEVF_RING_INT_REG_OFFSET	0x4  	struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); +	struct hnae3_queue *tqp;  	int i, j, reg_um;  	u32 *reg = data; @@ -147,10 +147,11 @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version,  	reg_um = ARRAY_SIZE(ring_reg_addr_list);  	for (j = 0; j < hdev->num_tqps; j++) {  		reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); +		tqp = &hdev->htqp[j].q;  		for (i = 0; i < reg_um; i++) -			*reg++ = hclgevf_read_dev(&hdev->hw, -						  ring_reg_addr_list[i] + -						  HCLGEVF_RING_REG_OFFSET * j); +			*reg++ = readl_relaxed(tqp->io_base - +					       HCLGEVF_TQP_REG_OFFSET + +					       ring_reg_addr_list[i]);  	}  	reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list); diff --git a/drivers/net/ethernet/huawei/hinic/hinic_main.c b/drivers/net/ethernet/huawei/hinic/hinic_main.c index 890f213da8d1..ae1f523d6841 100644 --- a/drivers/net/ethernet/huawei/hinic/hinic_main.c +++ b/drivers/net/ethernet/huawei/hinic/hinic_main.c @@ -172,6 +172,7 @@ err_init_txq:  	hinic_sq_dbgfs_uninit(nic_dev);  	devm_kfree(&netdev->dev, nic_dev->txqs); +	nic_dev->txqs = NULL;  	return err;  } @@ -268,6 +269,7 @@ err_init_rxq:  	hinic_rq_dbgfs_uninit(nic_dev);  	devm_kfree(&netdev->dev, nic_dev->rxqs); +	nic_dev->rxqs = NULL;  	return err;  } diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index ab5febf83ec3..0e1d9e2fbf38 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -99,7 +99,7 @@ module_param(debug, uint, 0);  MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all), Debug mask (0x8XXXXXXX)");  MODULE_DESCRIPTION("Intel(R) Ethernet Connection XL710 Network Driver"); -MODULE_IMPORT_NS(LIBIE); +MODULE_IMPORT_NS("LIBIE");  MODULE_LICENSE("GPL v2");  static struct workqueue_struct *i40e_wq; diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index 12ef160425aa..a9e54866ae6b 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -46,8 +46,8 @@ MODULE_DEVICE_TABLE(pci, iavf_pci_tbl);  MODULE_ALIAS("i40evf");  MODULE_DESCRIPTION("Intel(R) Ethernet Adaptive Virtual Function Network Driver"); -MODULE_IMPORT_NS(LIBETH); -MODULE_IMPORT_NS(LIBIE); +MODULE_IMPORT_NS("LIBETH"); +MODULE_IMPORT_NS("LIBIE");  MODULE_LICENSE("GPL v2");  static const struct net_device_ops iavf_netdev_ops; diff --git a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h index 1489a8ceec51..46f9726d9a8a 100644 --- a/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h +++ b/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h @@ -1665,6 +1665,7 @@ struct ice_aqc_get_port_options_elem {  #define ICE_AQC_PORT_OPT_MAX_LANE_25G	5  #define ICE_AQC_PORT_OPT_MAX_LANE_50G	6  #define ICE_AQC_PORT_OPT_MAX_LANE_100G	7 +#define ICE_AQC_PORT_OPT_MAX_LANE_200G	8  	u8 global_scid[2];  	u8 phy_scid[2]; @@ -2264,6 +2265,8 @@ struct ice_aqc_get_pkg_info_resp {  	struct ice_aqc_get_pkg_info pkg_info[];  }; +#define ICE_AQC_GET_CGU_MAX_PHASE_ADJ	GENMASK(30, 0) +  /* Get CGU abilities command response data structure (indirect 0x0C61) */  struct ice_aqc_get_cgu_abilities {  	u8 num_inputs; diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index b22e71dc59d4..532024f34ce4 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -542,7 +542,8 @@ ice_aq_get_netlist_node(struct ice_hw *hw, struct ice_aqc_get_link_topo *cmd,  /**   * ice_find_netlist_node   * @hw: pointer to the hw struct - * @node_type_ctx: type of netlist node to look for + * @node_type: type of netlist node to look for + * @ctx: context of the search   * @node_part_number: node part number to look for   * @node_handle: output parameter if node found - optional   * @@ -552,10 +553,12 @@ ice_aq_get_netlist_node(struct ice_hw *hw, struct ice_aqc_get_link_topo *cmd,   * valid if the function returns zero, and should be ignored on any non-zero   * return value.   * - * Returns: 0 if the node is found, -ENOENT if no handle was found, and - * a negative error code on failure to access the AQ. + * Return: + * * 0 if the node is found, + * * -ENOENT if no handle was found, + * * negative error code on failure to access the AQ.   */ -static int ice_find_netlist_node(struct ice_hw *hw, u8 node_type_ctx, +static int ice_find_netlist_node(struct ice_hw *hw, u8 node_type, u8 ctx,  				 u8 node_part_number, u16 *node_handle)  {  	u8 idx; @@ -566,8 +569,8 @@ static int ice_find_netlist_node(struct ice_hw *hw, u8 node_type_ctx,  		int status;  		cmd.addr.topo_params.node_type_ctx = -			FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_TYPE_M, -				   node_type_ctx); +			FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_TYPE_M, node_type) | +			FIELD_PREP(ICE_AQC_LINK_TOPO_NODE_CTX_M, ctx);  		cmd.addr.topo_params.index = idx;  		status = ice_aq_get_netlist_node(hw, &cmd, @@ -2747,9 +2750,11 @@ bool ice_is_pf_c827(struct ice_hw *hw)   */  bool ice_is_phy_rclk_in_netlist(struct ice_hw *hw)  { -	if (ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL, +	if (ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_PHY, +				  ICE_AQC_LINK_TOPO_NODE_CTX_PORT,  				  ICE_AQC_GET_LINK_TOPO_NODE_NR_C827, NULL) && -	    ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL, +	    ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_PHY, +				  ICE_AQC_LINK_TOPO_NODE_CTX_PORT,  				  ICE_AQC_GET_LINK_TOPO_NODE_NR_E822_PHY, NULL))  		return false; @@ -2765,6 +2770,7 @@ bool ice_is_phy_rclk_in_netlist(struct ice_hw *hw)  bool ice_is_clock_mux_in_netlist(struct ice_hw *hw)  {  	if (ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_MUX, +				  ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL,  				  ICE_AQC_GET_LINK_TOPO_NODE_NR_GEN_CLK_MUX,  				  NULL))  		return false; @@ -2785,12 +2791,14 @@ bool ice_is_clock_mux_in_netlist(struct ice_hw *hw)  bool ice_is_cgu_in_netlist(struct ice_hw *hw)  {  	if (!ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL, +				   ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL,  				   ICE_AQC_GET_LINK_TOPO_NODE_NR_ZL30632_80032,  				   NULL)) {  		hw->cgu_part_number = ICE_AQC_GET_LINK_TOPO_NODE_NR_ZL30632_80032;  		return true;  	} else if (!ice_find_netlist_node(hw,  					  ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL, +					  ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL,  					  ICE_AQC_GET_LINK_TOPO_NODE_NR_SI5383_5384,  					  NULL)) {  		hw->cgu_part_number = ICE_AQC_GET_LINK_TOPO_NODE_NR_SI5383_5384; @@ -2809,6 +2817,7 @@ bool ice_is_cgu_in_netlist(struct ice_hw *hw)  bool ice_is_gps_in_netlist(struct ice_hw *hw)  {  	if (ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_GPS, +				  ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL,  				  ICE_AQC_GET_LINK_TOPO_NODE_NR_GEN_GPS, NULL))  		return false; @@ -4087,6 +4096,57 @@ ice_aq_set_port_option(struct ice_hw *hw, u8 lport, u8 lport_valid,  }  /** + * ice_get_phy_lane_number - Get PHY lane number for current adapter + * @hw: pointer to the hw struct + * + * Return: PHY lane number on success, negative error code otherwise. + */ +int ice_get_phy_lane_number(struct ice_hw *hw) +{ +	struct ice_aqc_get_port_options_elem *options; +	unsigned int lport = 0; +	unsigned int lane; +	int err; + +	options = kcalloc(ICE_AQC_PORT_OPT_MAX, sizeof(*options), GFP_KERNEL); +	if (!options) +		return -ENOMEM; + +	for (lane = 0; lane < ICE_MAX_PORT_PER_PCI_DEV; lane++) { +		u8 options_count = ICE_AQC_PORT_OPT_MAX; +		u8 speed, active_idx, pending_idx; +		bool active_valid, pending_valid; + +		err = ice_aq_get_port_options(hw, options, &options_count, lane, +					      true, &active_idx, &active_valid, +					      &pending_idx, &pending_valid); +		if (err) +			goto err; + +		if (!active_valid) +			continue; + +		speed = options[active_idx].max_lane_speed; +		/* If we don't get speed for this lane, it's unoccupied */ +		if (speed > ICE_AQC_PORT_OPT_MAX_LANE_200G) +			continue; + +		if (hw->pf_id == lport) { +			kfree(options); +			return lane; +		} + +		lport++; +	} + +	/* PHY lane not found */ +	err = -ENXIO; +err: +	kfree(options); +	return err; +} + +/**   * ice_aq_sff_eeprom   * @hw: pointer to the HW struct   * @lport: bits [7:0] = logical port, bit [8] = logical port valid diff --git a/drivers/net/ethernet/intel/ice/ice_common.h b/drivers/net/ethernet/intel/ice/ice_common.h index 27208a60cece..fe6f88cfd948 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.h +++ b/drivers/net/ethernet/intel/ice/ice_common.h @@ -193,6 +193,7 @@ ice_aq_get_port_options(struct ice_hw *hw,  int  ice_aq_set_port_option(struct ice_hw *hw, u8 lport, u8 lport_valid,  		       u8 new_option); +int ice_get_phy_lane_number(struct ice_hw *hw);  int  ice_aq_sff_eeprom(struct ice_hw *hw, u16 lport, u8 bus_addr,  		  u16 mem_addr, u8 page, u8 set_page, u8 *data, u8 length, diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c index d5ad6d84007c..38e151c7ea23 100644 --- a/drivers/net/ethernet/intel/ice/ice_dpll.c +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c @@ -2065,6 +2065,18 @@ static int ice_dpll_init_worker(struct ice_pf *pf)  }  /** + * ice_dpll_phase_range_set - initialize phase adjust range helper + * @range: pointer to phase adjust range struct to be initialized + * @phase_adj: a value to be used as min(-)/max(+) boundary + */ +static void ice_dpll_phase_range_set(struct dpll_pin_phase_adjust_range *range, +				     u32 phase_adj) +{ +	range->min = -phase_adj; +	range->max = phase_adj; +} + +/**   * ice_dpll_init_info_pins_generic - initializes generic pins info   * @pf: board private structure   * @input: if input pins initialized @@ -2105,8 +2117,8 @@ static int ice_dpll_init_info_pins_generic(struct ice_pf *pf, bool input)  	for (i = 0; i < pin_num; i++) {  		pins[i].idx = i;  		pins[i].prop.board_label = labels[i]; -		pins[i].prop.phase_range.min = phase_adj_max; -		pins[i].prop.phase_range.max = -phase_adj_max; +		ice_dpll_phase_range_set(&pins[i].prop.phase_range, +					 phase_adj_max);  		pins[i].prop.capabilities = cap;  		pins[i].pf = pf;  		ret = ice_dpll_pin_state_update(pf, &pins[i], pin_type, NULL); @@ -2152,6 +2164,7 @@ ice_dpll_init_info_direct_pins(struct ice_pf *pf,  	struct ice_hw *hw = &pf->hw;  	struct ice_dpll_pin *pins;  	unsigned long caps; +	u32 phase_adj_max;  	u8 freq_supp_num;  	bool input; @@ -2159,11 +2172,13 @@ ice_dpll_init_info_direct_pins(struct ice_pf *pf,  	case ICE_DPLL_PIN_TYPE_INPUT:  		pins = pf->dplls.inputs;  		num_pins = pf->dplls.num_inputs; +		phase_adj_max = pf->dplls.input_phase_adj_max;  		input = true;  		break;  	case ICE_DPLL_PIN_TYPE_OUTPUT:  		pins = pf->dplls.outputs;  		num_pins = pf->dplls.num_outputs; +		phase_adj_max = pf->dplls.output_phase_adj_max;  		input = false;  		break;  	default: @@ -2188,19 +2203,13 @@ ice_dpll_init_info_direct_pins(struct ice_pf *pf,  				return ret;  			caps |= (DPLL_PIN_CAPABILITIES_PRIORITY_CAN_CHANGE |  				 DPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE); -			pins[i].prop.phase_range.min = -				pf->dplls.input_phase_adj_max; -			pins[i].prop.phase_range.max = -				-pf->dplls.input_phase_adj_max;  		} else { -			pins[i].prop.phase_range.min = -				pf->dplls.output_phase_adj_max; -			pins[i].prop.phase_range.max = -				-pf->dplls.output_phase_adj_max;  			ret = ice_cgu_get_output_pin_state_caps(hw, i, &caps);  			if (ret)  				return ret;  		} +		ice_dpll_phase_range_set(&pins[i].prop.phase_range, +					 phase_adj_max);  		pins[i].prop.capabilities = caps;  		ret = ice_dpll_pin_state_update(pf, &pins[i], pin_type, NULL);  		if (ret) @@ -2308,8 +2317,10 @@ static int ice_dpll_init_info(struct ice_pf *pf, bool cgu)  	dp->dpll_idx = abilities.pps_dpll_idx;  	d->num_inputs = abilities.num_inputs;  	d->num_outputs = abilities.num_outputs; -	d->input_phase_adj_max = le32_to_cpu(abilities.max_in_phase_adj); -	d->output_phase_adj_max = le32_to_cpu(abilities.max_out_phase_adj); +	d->input_phase_adj_max = le32_to_cpu(abilities.max_in_phase_adj) & +		ICE_AQC_GET_CGU_MAX_PHASE_ADJ; +	d->output_phase_adj_max = le32_to_cpu(abilities.max_out_phase_adj) & +		ICE_AQC_GET_CGU_MAX_PHASE_ADJ;  	alloc_size = sizeof(*d->inputs) * d->num_inputs;  	d->inputs = kzalloc(alloc_size, GFP_KERNEL); diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 1eaa4428fd24..89fa3d53d317 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -37,7 +37,7 @@ static const char ice_copyright[] = "Copyright (c) 2018, Intel Corporation.";  #define ICE_DDP_PKG_FILE	ICE_DDP_PKG_PATH "ice.pkg"  MODULE_DESCRIPTION(DRV_SUMMARY); -MODULE_IMPORT_NS(LIBIE); +MODULE_IMPORT_NS("LIBIE");  MODULE_LICENSE("GPL v2");  MODULE_FIRMWARE(ICE_DDP_PKG_FILE); @@ -1144,7 +1144,7 @@ ice_link_event(struct ice_pf *pf, struct ice_port_info *pi, bool link_up,  	if (link_up == old_link && link_speed == old_link_speed)  		return 0; -	ice_ptp_link_change(pf, pf->hw.pf_id, link_up); +	ice_ptp_link_change(pf, link_up);  	if (ice_is_dcb_active(pf)) {  		if (test_bit(ICE_FLAG_DCB_ENA, pf->flags)) @@ -6408,10 +6408,12 @@ ice_set_vlan_filtering_features(struct ice_vsi *vsi, netdev_features_t features)  	int err = 0;  	/* support Single VLAN Mode (SVM) and Double VLAN Mode (DVM) by checking -	 * if either bit is set +	 * if either bit is set. In switchdev mode Rx filtering should never be +	 * enabled.  	 */ -	if (features & -	    (NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_STAG_FILTER)) +	if ((features & +	     (NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_STAG_FILTER)) && +	     !ice_is_eswitch_mode_switchdev(vsi->back))  		err = vlan_ops->ena_rx_filtering(vsi);  	else  		err = vlan_ops->dis_rx_filtering(vsi); @@ -6788,7 +6790,7 @@ static int ice_up_complete(struct ice_vsi *vsi)  		ice_print_link_msg(vsi, true);  		netif_tx_start_all_queues(vsi->netdev);  		netif_carrier_on(vsi->netdev); -		ice_ptp_link_change(pf, pf->hw.pf_id, true); +		ice_ptp_link_change(pf, true);  	}  	/* Perform an initial read of the statistics registers now to @@ -7258,7 +7260,7 @@ int ice_down(struct ice_vsi *vsi)  	if (vsi->netdev) {  		vlan_err = ice_vsi_del_vlan_zero(vsi); -		ice_ptp_link_change(vsi->back, vsi->back->hw.pf_id, false); +		ice_ptp_link_change(vsi->back, false);  		netif_carrier_off(vsi->netdev);  		netif_tx_disable(vsi->netdev);  	} diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c index a999fface272..efd770dfec44 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -1388,10 +1388,9 @@ ice_ptp_port_phy_restart(struct ice_ptp_port *ptp_port)  /**   * ice_ptp_link_change - Reconfigure PTP after link status change   * @pf: Board private structure - * @port: Port for which the PHY start is set   * @linkup: Link is up or down   */ -void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup) +void ice_ptp_link_change(struct ice_pf *pf, bool linkup)  {  	struct ice_ptp_port *ptp_port;  	struct ice_hw *hw = &pf->hw; @@ -1399,14 +1398,7 @@ void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup)  	if (pf->ptp.state != ICE_PTP_READY)  		return; -	if (WARN_ON_ONCE(port >= hw->ptp.num_lports)) -		return; -  	ptp_port = &pf->ptp.port; -	if (ice_is_e825c(hw) && hw->ptp.is_2x50g_muxed_topo) -		port *= 2; -	if (WARN_ON_ONCE(ptp_port->port_num != port)) -		return;  	/* Update cached link status for this port immediately */  	ptp_port->link_up = linkup; @@ -3164,10 +3156,17 @@ void ice_ptp_init(struct ice_pf *pf)  {  	struct ice_ptp *ptp = &pf->ptp;  	struct ice_hw *hw = &pf->hw; -	int err; +	int lane_num, err;  	ptp->state = ICE_PTP_INITIALIZING; +	lane_num = ice_get_phy_lane_number(hw); +	if (lane_num < 0) { +		err = lane_num; +		goto err_exit; +	} + +	ptp->port.port_num = (u8)lane_num;  	ice_ptp_init_hw(hw);  	ice_ptp_init_tx_interrupt_mode(pf); @@ -3188,10 +3187,6 @@ void ice_ptp_init(struct ice_pf *pf)  	if (err)  		goto err_exit; -	ptp->port.port_num = hw->pf_id; -	if (ice_is_e825c(hw) && hw->ptp.is_2x50g_muxed_topo) -		ptp->port.port_num = hw->pf_id * 2; -  	err = ice_ptp_init_port(pf, &ptp->port);  	if (err)  		goto err_exit; diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.h b/drivers/net/ethernet/intel/ice/ice_ptp.h index 824e73b677a4..c490d98fd9c6 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.h +++ b/drivers/net/ethernet/intel/ice/ice_ptp.h @@ -310,7 +310,7 @@ void ice_ptp_prepare_for_reset(struct ice_pf *pf,  			       enum ice_reset_req reset_type);  void ice_ptp_init(struct ice_pf *pf);  void ice_ptp_release(struct ice_pf *pf); -void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup); +void ice_ptp_link_change(struct ice_pf *pf, bool linkup);  #else /* IS_ENABLED(CONFIG_PTP_1588_CLOCK) */  static inline int ice_ptp_set_ts_config(struct ice_pf *pf, struct ifreq *ifr)  { @@ -358,7 +358,7 @@ static inline void ice_ptp_prepare_for_reset(struct ice_pf *pf,  }  static inline void ice_ptp_init(struct ice_pf *pf) { }  static inline void ice_ptp_release(struct ice_pf *pf) { } -static inline void ice_ptp_link_change(struct ice_pf *pf, u8 port, bool linkup) +static inline void ice_ptp_link_change(struct ice_pf *pf, bool linkup)  {  } diff --git a/drivers/net/ethernet/intel/ice/ice_ptp_consts.h b/drivers/net/ethernet/intel/ice/ice_ptp_consts.h index 585ce200c60f..a8e57cf05a9c 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp_consts.h +++ b/drivers/net/ethernet/intel/ice/ice_ptp_consts.h @@ -131,7 +131,7 @@ struct ice_eth56g_mac_reg_cfg eth56g_mac_cfg[NUM_ICE_ETH56G_LNK_SPD] = {  		.rx_offset = {  			.serdes = 0xffffeb27, /* -10.42424 */  			.no_fec = 0xffffcccd, /* -25.6 */ -			.fc = 0xfffe0014, /* -255.96 */ +			.fc = 0xfffc557b, /* -469.26 */  			.sfd = 0x4a4, /* 2.32 */  			.bs_ds = 0x32 /* 0.0969697 */  		} @@ -761,9 +761,9 @@ const struct ice_vernier_info_e82x e822_vernier[NUM_ICE_PTP_LNK_SPD] = {  		/* rx_desk_rsgb_par */  		644531250, /* 644.53125 MHz Reed Solomon gearbox */  		/* tx_desk_rsgb_pcs */ -		644531250, /* 644.53125 MHz Reed Solomon gearbox */ +		390625000, /* 390.625 MHz Reed Solomon gearbox */  		/* rx_desk_rsgb_pcs */ -		644531250, /* 644.53125 MHz Reed Solomon gearbox */ +		390625000, /* 390.625 MHz Reed Solomon gearbox */  		/* tx_fixed_delay */  		1620,  		/* pmd_adj_divisor */ diff --git a/drivers/net/ethernet/intel/ice/ice_ptp_hw.c b/drivers/net/ethernet/intel/ice/ice_ptp_hw.c index dfd49732bd5b..02e84f5b1d45 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp_hw.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp_hw.c @@ -901,30 +901,45 @@ static void ice_ptp_exec_tmr_cmd(struct ice_hw *hw)   */  /** + * ice_ptp_get_dest_dev_e825 - get destination PHY for given port number + * @hw: pointer to the HW struct + * @port: destination port + * + * Return: destination sideband queue PHY device. + */ +static enum ice_sbq_msg_dev ice_ptp_get_dest_dev_e825(struct ice_hw *hw, +						      u8 port) +{ +	/* On a single complex E825, PHY 0 is always destination device phy_0 +	 * and PHY 1 is phy_0_peer. +	 */ +	if (port >= hw->ptp.ports_per_phy) +		return eth56g_phy_1; +	else +		return eth56g_phy_0; +} + +/**   * ice_write_phy_eth56g - Write a PHY port register   * @hw: pointer to the HW struct - * @phy_idx: PHY index + * @port: destination port   * @addr: PHY register address   * @val: Value to write   *   * Return: 0 on success, other error codes when failed to write to PHY   */ -static int ice_write_phy_eth56g(struct ice_hw *hw, u8 phy_idx, u32 addr, -				u32 val) +static int ice_write_phy_eth56g(struct ice_hw *hw, u8 port, u32 addr, u32 val)  { -	struct ice_sbq_msg_input phy_msg; +	struct ice_sbq_msg_input msg = { +		.dest_dev = ice_ptp_get_dest_dev_e825(hw, port), +		.opcode = ice_sbq_msg_wr, +		.msg_addr_low = lower_16_bits(addr), +		.msg_addr_high = upper_16_bits(addr), +		.data = val +	};  	int err; -	phy_msg.opcode = ice_sbq_msg_wr; - -	phy_msg.msg_addr_low = lower_16_bits(addr); -	phy_msg.msg_addr_high = upper_16_bits(addr); - -	phy_msg.data = val; -	phy_msg.dest_dev = hw->ptp.phy.eth56g.phy_addr[phy_idx]; - -	err = ice_sbq_rw_reg(hw, &phy_msg, ICE_AQ_FLAG_RD); - +	err = ice_sbq_rw_reg(hw, &msg, ICE_AQ_FLAG_RD);  	if (err)  		ice_debug(hw, ICE_DBG_PTP, "PTP failed to send msg to phy %d\n",  			  err); @@ -935,41 +950,36 @@ static int ice_write_phy_eth56g(struct ice_hw *hw, u8 phy_idx, u32 addr,  /**   * ice_read_phy_eth56g - Read a PHY port register   * @hw: pointer to the HW struct - * @phy_idx: PHY index + * @port: destination port   * @addr: PHY register address   * @val: Value to write   *   * Return: 0 on success, other error codes when failed to read from PHY   */ -static int ice_read_phy_eth56g(struct ice_hw *hw, u8 phy_idx, u32 addr, -			       u32 *val) +static int ice_read_phy_eth56g(struct ice_hw *hw, u8 port, u32 addr, u32 *val)  { -	struct ice_sbq_msg_input phy_msg; +	struct ice_sbq_msg_input msg = { +		.dest_dev = ice_ptp_get_dest_dev_e825(hw, port), +		.opcode = ice_sbq_msg_rd, +		.msg_addr_low = lower_16_bits(addr), +		.msg_addr_high = upper_16_bits(addr) +	};  	int err; -	phy_msg.opcode = ice_sbq_msg_rd; - -	phy_msg.msg_addr_low = lower_16_bits(addr); -	phy_msg.msg_addr_high = upper_16_bits(addr); - -	phy_msg.data = 0; -	phy_msg.dest_dev = hw->ptp.phy.eth56g.phy_addr[phy_idx]; - -	err = ice_sbq_rw_reg(hw, &phy_msg, ICE_AQ_FLAG_RD); -	if (err) { +	err = ice_sbq_rw_reg(hw, &msg, ICE_AQ_FLAG_RD); +	if (err)  		ice_debug(hw, ICE_DBG_PTP, "PTP failed to send msg to phy %d\n",  			  err); -		return err; -	} - -	*val = phy_msg.data; +	else +		*val = msg.data; -	return 0; +	return err;  }  /**   * ice_phy_res_address_eth56g - Calculate a PHY port register address - * @port: Port number to be written + * @hw: pointer to the HW struct + * @lane: Lane number to be written   * @res_type: resource type (register/memory)   * @offset: Offset from PHY port register base   * @addr: The result address @@ -978,17 +988,19 @@ static int ice_read_phy_eth56g(struct ice_hw *hw, u8 phy_idx, u32 addr,   * * %0      - success   * * %EINVAL - invalid port number or resource type   */ -static int ice_phy_res_address_eth56g(u8 port, enum eth56g_res_type res_type, -				      u32 offset, u32 *addr) +static int ice_phy_res_address_eth56g(struct ice_hw *hw, u8 lane, +				      enum eth56g_res_type res_type, +				      u32 offset, +				      u32 *addr)  { -	u8 lane = port % ICE_PORTS_PER_QUAD; -	u8 phy = ICE_GET_QUAD_NUM(port); -  	if (res_type >= NUM_ETH56G_PHY_RES)  		return -EINVAL; -	*addr = eth56g_phy_res[res_type].base[phy] + +	/* Lanes 4..7 are in fact 0..3 on a second PHY */ +	lane %= hw->ptp.ports_per_phy; +	*addr = eth56g_phy_res[res_type].base[0] +  		lane * eth56g_phy_res[res_type].step + offset; +  	return 0;  } @@ -1008,19 +1020,17 @@ static int ice_phy_res_address_eth56g(u8 port, enum eth56g_res_type res_type,  static int ice_write_port_eth56g(struct ice_hw *hw, u8 port, u32 offset,  				 u32 val, enum eth56g_res_type res_type)  { -	u8 phy_port = port % hw->ptp.ports_per_phy; -	u8 phy_idx = port / hw->ptp.ports_per_phy;  	u32 addr;  	int err;  	if (port >= hw->ptp.num_lports)  		return -EINVAL; -	err = ice_phy_res_address_eth56g(phy_port, res_type, offset, &addr); +	err = ice_phy_res_address_eth56g(hw, port, res_type, offset, &addr);  	if (err)  		return err; -	return ice_write_phy_eth56g(hw, phy_idx, addr, val); +	return ice_write_phy_eth56g(hw, port, addr, val);  }  /** @@ -1039,19 +1049,17 @@ static int ice_write_port_eth56g(struct ice_hw *hw, u8 port, u32 offset,  static int ice_read_port_eth56g(struct ice_hw *hw, u8 port, u32 offset,  				u32 *val, enum eth56g_res_type res_type)  { -	u8 phy_port = port % hw->ptp.ports_per_phy; -	u8 phy_idx = port / hw->ptp.ports_per_phy;  	u32 addr;  	int err;  	if (port >= hw->ptp.num_lports)  		return -EINVAL; -	err = ice_phy_res_address_eth56g(phy_port, res_type, offset, &addr); +	err = ice_phy_res_address_eth56g(hw, port, res_type, offset, &addr);  	if (err)  		return err; -	return ice_read_phy_eth56g(hw, phy_idx, addr, val); +	return ice_read_phy_eth56g(hw, port, addr, val);  }  /** @@ -1201,6 +1209,56 @@ static int ice_write_port_mem_eth56g(struct ice_hw *hw, u8 port, u16 offset,  }  /** + * ice_write_quad_ptp_reg_eth56g - Write a PHY quad register + * @hw: pointer to the HW struct + * @offset: PHY register offset + * @port: Port number + * @val: Value to write + * + * Return: + * * %0     - success + * * %EIO  - invalid port number or resource type + * * %other - failed to write to PHY + */ +static int ice_write_quad_ptp_reg_eth56g(struct ice_hw *hw, u8 port, +					 u32 offset, u32 val) +{ +	u32 addr; + +	if (port >= hw->ptp.num_lports) +		return -EIO; + +	addr = eth56g_phy_res[ETH56G_PHY_REG_PTP].base[0] + offset; + +	return ice_write_phy_eth56g(hw, port, addr, val); +} + +/** + * ice_read_quad_ptp_reg_eth56g - Read a PHY quad register + * @hw: pointer to the HW struct + * @offset: PHY register offset + * @port: Port number + * @val: Value to read + * + * Return: + * * %0     - success + * * %EIO  - invalid port number or resource type + * * %other - failed to read from PHY + */ +static int ice_read_quad_ptp_reg_eth56g(struct ice_hw *hw, u8 port, +					u32 offset, u32 *val) +{ +	u32 addr; + +	if (port >= hw->ptp.num_lports) +		return -EIO; + +	addr = eth56g_phy_res[ETH56G_PHY_REG_PTP].base[0] + offset; + +	return ice_read_phy_eth56g(hw, port, addr, val); +} + +/**   * ice_is_64b_phy_reg_eth56g - Check if this is a 64bit PHY register   * @low_addr: the low address to check   * @high_addr: on return, contains the high address of the 64bit register @@ -1518,7 +1576,8 @@ static int ice_read_ptp_tstamp_eth56g(struct ice_hw *hw, u8 port, u8 idx,  	 * lower 8 bits in the low register, and the upper 32 bits in the high  	 * register.  	 */ -	*tstamp = ((u64)hi) << TS_PHY_HIGH_S | ((u64)lo & TS_PHY_LOW_M); +	*tstamp = FIELD_PREP(TS_PHY_HIGH_M, hi) | +		  FIELD_PREP(TS_PHY_LOW_M, lo);  	return 0;  } @@ -1918,7 +1977,6 @@ ice_phy_get_speed_eth56g(struct ice_link_status *li)   */  static int ice_phy_cfg_parpcs_eth56g(struct ice_hw *hw, u8 port)  { -	u8 port_blk = port & ~(ICE_PORTS_PER_QUAD - 1);  	u32 val;  	int err; @@ -1933,8 +1991,8 @@ static int ice_phy_cfg_parpcs_eth56g(struct ice_hw *hw, u8 port)  	switch (ice_phy_get_speed_eth56g(&hw->port_info->phy.link_info)) {  	case ICE_ETH56G_LNK_SPD_1G:  	case ICE_ETH56G_LNK_SPD_2_5G: -		err = ice_read_ptp_reg_eth56g(hw, port_blk, -					      PHY_GPCS_CONFIG_REG0, &val); +		err = ice_read_quad_ptp_reg_eth56g(hw, port, +						   PHY_GPCS_CONFIG_REG0, &val);  		if (err) {  			ice_debug(hw, ICE_DBG_PTP, "Failed to read PHY_GPCS_CONFIG_REG0, status: %d",  				  err); @@ -1945,8 +2003,8 @@ static int ice_phy_cfg_parpcs_eth56g(struct ice_hw *hw, u8 port)  		val |= FIELD_PREP(PHY_GPCS_CONFIG_REG0_TX_THR_M,  				  ICE_ETH56G_NOMINAL_TX_THRESH); -		err = ice_write_ptp_reg_eth56g(hw, port_blk, -					       PHY_GPCS_CONFIG_REG0, val); +		err = ice_write_quad_ptp_reg_eth56g(hw, port, +						    PHY_GPCS_CONFIG_REG0, val);  		if (err) {  			ice_debug(hw, ICE_DBG_PTP, "Failed to write PHY_GPCS_CONFIG_REG0, status: %d",  				  err); @@ -1987,50 +2045,47 @@ static int ice_phy_cfg_parpcs_eth56g(struct ice_hw *hw, u8 port)   */  int ice_phy_cfg_ptp_1step_eth56g(struct ice_hw *hw, u8 port)  { -	u8 port_blk = port & ~(ICE_PORTS_PER_QUAD - 1); -	u8 blk_port = port & (ICE_PORTS_PER_QUAD - 1); +	u8 quad_lane = port % ICE_PORTS_PER_QUAD; +	u32 addr, val, peer_delay;  	bool enable, sfd_ena; -	u32 val, peer_delay;  	int err;  	enable = hw->ptp.phy.eth56g.onestep_ena;  	peer_delay = hw->ptp.phy.eth56g.peer_delay;  	sfd_ena = hw->ptp.phy.eth56g.sfd_ena; -	/* PHY_PTP_1STEP_CONFIG */ -	err = ice_read_ptp_reg_eth56g(hw, port_blk, PHY_PTP_1STEP_CONFIG, &val); +	addr = PHY_PTP_1STEP_CONFIG; +	err = ice_read_quad_ptp_reg_eth56g(hw, port, addr, &val);  	if (err)  		return err;  	if (enable) -		val |= blk_port; +		val |= BIT(quad_lane);  	else -		val &= ~blk_port; +		val &= ~BIT(quad_lane);  	val &= ~(PHY_PTP_1STEP_T1S_UP64_M | PHY_PTP_1STEP_T1S_DELTA_M); -	err = ice_write_ptp_reg_eth56g(hw, port_blk, PHY_PTP_1STEP_CONFIG, val); +	err = ice_write_quad_ptp_reg_eth56g(hw, port, addr, val);  	if (err)  		return err; -	/* PHY_PTP_1STEP_PEER_DELAY */ +	addr = PHY_PTP_1STEP_PEER_DELAY(quad_lane);  	val = FIELD_PREP(PHY_PTP_1STEP_PD_DELAY_M, peer_delay);  	if (peer_delay)  		val |= PHY_PTP_1STEP_PD_ADD_PD_M;  	val |= PHY_PTP_1STEP_PD_DLY_V_M; -	err = ice_write_ptp_reg_eth56g(hw, port_blk, -				       PHY_PTP_1STEP_PEER_DELAY(blk_port), val); +	err = ice_write_quad_ptp_reg_eth56g(hw, port, addr, val);  	if (err)  		return err;  	val &= ~PHY_PTP_1STEP_PD_DLY_V_M; -	err = ice_write_ptp_reg_eth56g(hw, port_blk, -				       PHY_PTP_1STEP_PEER_DELAY(blk_port), val); +	err = ice_write_quad_ptp_reg_eth56g(hw, port, addr, val);  	if (err)  		return err; -	/* PHY_MAC_XIF_MODE */ -	err = ice_read_mac_reg_eth56g(hw, port, PHY_MAC_XIF_MODE, &val); +	addr = PHY_MAC_XIF_MODE; +	err = ice_read_mac_reg_eth56g(hw, port, addr, &val);  	if (err)  		return err; @@ -2050,7 +2105,7 @@ int ice_phy_cfg_ptp_1step_eth56g(struct ice_hw *hw, u8 port)  	       FIELD_PREP(PHY_MAC_XIF_TS_BIN_MODE_M, enable) |  	       FIELD_PREP(PHY_MAC_XIF_TS_SFD_ENA_M, sfd_ena); -	return ice_write_mac_reg_eth56g(hw, port, PHY_MAC_XIF_MODE, val); +	return ice_write_mac_reg_eth56g(hw, port, addr, val);  }  /** @@ -2092,21 +2147,22 @@ static u32 ice_ptp_calc_bitslip_eth56g(struct ice_hw *hw, u8 port, u32 bs,  				       bool fc, bool rs,  				       enum ice_eth56g_link_spd spd)  { -	u8 port_offset = port & (ICE_PORTS_PER_QUAD - 1); -	u8 port_blk = port & ~(ICE_PORTS_PER_QUAD - 1);  	u32 bitslip;  	int err;  	if (!bs || rs)  		return 0; -	if (spd == ICE_ETH56G_LNK_SPD_1G || spd == ICE_ETH56G_LNK_SPD_2_5G) +	if (spd == ICE_ETH56G_LNK_SPD_1G || spd == ICE_ETH56G_LNK_SPD_2_5G) {  		err = ice_read_gpcs_reg_eth56g(hw, port, PHY_GPCS_BITSLIP,  					       &bitslip); -	else -		err = ice_read_ptp_reg_eth56g(hw, port_blk, -					      PHY_REG_SD_BIT_SLIP(port_offset), -					      &bitslip); +	} else { +		u8 quad_lane = port % ICE_PORTS_PER_QUAD; +		u32 addr; + +		addr = PHY_REG_SD_BIT_SLIP(quad_lane); +		err = ice_read_quad_ptp_reg_eth56g(hw, port, addr, &bitslip); +	}  	if (err)  		return 0; @@ -2666,59 +2722,29 @@ static int ice_get_phy_tx_tstamp_ready_eth56g(struct ice_hw *hw, u8 port,  }  /** - * ice_is_muxed_topo - detect breakout 2x50G topology for E825C - * @hw: pointer to the HW struct - * - * Return: true if it's 2x50 breakout topology, false otherwise - */ -static bool ice_is_muxed_topo(struct ice_hw *hw) -{ -	u8 link_topo; -	bool mux; -	u32 val; - -	val = rd32(hw, GLGEN_SWITCH_MODE_CONFIG); -	mux = FIELD_GET(GLGEN_SWITCH_MODE_CONFIG_25X4_QUAD_M, val); -	val = rd32(hw, GLGEN_MAC_LINK_TOPO); -	link_topo = FIELD_GET(GLGEN_MAC_LINK_TOPO_LINK_TOPO_M, val); - -	return (mux && link_topo == ICE_LINK_TOPO_UP_TO_2_LINKS); -} - -/** - * ice_ptp_init_phy_e825c - initialize PHY parameters + * ice_ptp_init_phy_e825 - initialize PHY parameters   * @hw: pointer to the HW struct   */ -static void ice_ptp_init_phy_e825c(struct ice_hw *hw) +static void ice_ptp_init_phy_e825(struct ice_hw *hw)  {  	struct ice_ptp_hw *ptp = &hw->ptp;  	struct ice_eth56g_params *params; -	u8 phy; +	u32 phy_rev; +	int err;  	ptp->phy_model = ICE_PHY_ETH56G;  	params = &ptp->phy.eth56g;  	params->onestep_ena = false;  	params->peer_delay = 0;  	params->sfd_ena = false; -	params->phy_addr[0] = eth56g_phy_0; -	params->phy_addr[1] = eth56g_phy_1;  	params->num_phys = 2;  	ptp->ports_per_phy = 4;  	ptp->num_lports = params->num_phys * ptp->ports_per_phy;  	ice_sb_access_ena_eth56g(hw, true); -	for (phy = 0; phy < params->num_phys; phy++) { -		u32 phy_rev; -		int err; - -		err = ice_read_phy_eth56g(hw, phy, PHY_REG_REVISION, &phy_rev); -		if (err || phy_rev != PHY_REVISION_ETH56G) { -			ptp->phy_model = ICE_PHY_UNSUP; -			return; -		} -	} - -	ptp->is_2x50g_muxed_topo = ice_is_muxed_topo(hw); +	err = ice_read_phy_eth56g(hw, hw->pf_id, PHY_REG_REVISION, &phy_rev); +	if (err || phy_rev != PHY_REVISION_ETH56G) +		ptp->phy_model = ICE_PHY_UNSUP;  }  /* E822 family functions @@ -2737,10 +2763,9 @@ static void ice_fill_phy_msg_e82x(struct ice_hw *hw,  				  struct ice_sbq_msg_input *msg, u8 port,  				  u16 offset)  { -	int phy_port, phy, quadtype; +	int phy_port, quadtype;  	phy_port = port % hw->ptp.ports_per_phy; -	phy = port / hw->ptp.ports_per_phy;  	quadtype = ICE_GET_QUAD_NUM(port) %  		   ICE_GET_QUAD_NUM(hw->ptp.ports_per_phy); @@ -2752,12 +2777,7 @@ static void ice_fill_phy_msg_e82x(struct ice_hw *hw,  		msg->msg_addr_high = P_Q1_H(P_4_BASE + offset, phy_port);  	} -	if (phy == 0) -		msg->dest_dev = rmn_0; -	else if (phy == 1) -		msg->dest_dev = rmn_1; -	else -		msg->dest_dev = rmn_2; +	msg->dest_dev = rmn_0;  }  /** @@ -5477,7 +5497,7 @@ void ice_ptp_init_hw(struct ice_hw *hw)  	else if (ice_is_e810(hw))  		ice_ptp_init_phy_e810(ptp);  	else if (ice_is_e825c(hw)) -		ice_ptp_init_phy_e825c(hw); +		ice_ptp_init_phy_e825(hw);  	else  		ptp->phy_model = ICE_PHY_UNSUP;  } diff --git a/drivers/net/ethernet/intel/ice/ice_ptp_hw.h b/drivers/net/ethernet/intel/ice/ice_ptp_hw.h index 47af7c5c79b8..1cee0f1bba2d 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp_hw.h +++ b/drivers/net/ethernet/intel/ice/ice_ptp_hw.h @@ -682,9 +682,8 @@ static inline bool ice_is_dual(struct ice_hw *hw)  #define TS_HIGH_M			0xFF  #define TS_HIGH_S			32 -#define TS_PHY_LOW_M			0xFF -#define TS_PHY_HIGH_M			0xFFFFFFFF -#define TS_PHY_HIGH_S			8 +#define TS_PHY_LOW_M			GENMASK(7, 0) +#define TS_PHY_HIGH_M			GENMASK_ULL(39, 8)  #define BYTES_PER_IDX_ADDR_L_U		8  #define BYTES_PER_IDX_ADDR_L		4 diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h index adb168860711..4a9ef722635f 100644 --- a/drivers/net/ethernet/intel/ice/ice_type.h +++ b/drivers/net/ethernet/intel/ice/ice_type.h @@ -850,7 +850,6 @@ struct ice_mbx_data {  struct ice_eth56g_params {  	u8 num_phys; -	u8 phy_addr[2];  	bool onestep_ena;  	bool sfd_ena;  	u32 peer_delay; @@ -881,7 +880,6 @@ struct ice_ptp_hw {  	union ice_phy_params phy;  	u8 num_lports;  	u8 ports_per_phy; -	bool is_2x50g_muxed_topo;  };  /* Port hardware description */ diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl.c b/drivers/net/ethernet/intel/ice/ice_virtchnl.c index f445e33b2028..ff4ad788d96a 100644 --- a/drivers/net/ethernet/intel/ice/ice_virtchnl.c +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl.c @@ -4128,6 +4128,9 @@ static const struct ice_virtchnl_ops ice_virtchnl_dflt_ops = {  	.get_qos_caps = ice_vc_get_qos_caps,  	.cfg_q_bw = ice_vc_cfg_q_bw,  	.cfg_q_quanta = ice_vc_cfg_q_quanta, +	/* If you add a new op here please make sure to add it to +	 * ice_virtchnl_repr_ops as well. +	 */  };  /** @@ -4258,6 +4261,9 @@ static const struct ice_virtchnl_ops ice_virtchnl_repr_ops = {  	.dis_vlan_stripping_v2_msg = ice_vc_dis_vlan_stripping_v2_msg,  	.ena_vlan_insertion_v2_msg = ice_vc_ena_vlan_insertion_v2_msg,  	.dis_vlan_insertion_v2_msg = ice_vc_dis_vlan_insertion_v2_msg, +	.get_qos_caps = ice_vc_get_qos_caps, +	.cfg_q_bw = ice_vc_cfg_q_bw, +	.cfg_q_quanta = ice_vc_cfg_q_quanta,  };  /** diff --git a/drivers/net/ethernet/intel/idpf/idpf_dev.c b/drivers/net/ethernet/intel/idpf/idpf_dev.c index 6c913a703df6..41e4bd49402a 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_dev.c +++ b/drivers/net/ethernet/intel/idpf/idpf_dev.c @@ -101,6 +101,9 @@ static int idpf_intr_reg_init(struct idpf_vport *vport)  		intr->dyn_ctl_itridx_s = PF_GLINT_DYN_CTL_ITR_INDX_S;  		intr->dyn_ctl_intrvl_s = PF_GLINT_DYN_CTL_INTERVAL_S;  		intr->dyn_ctl_wb_on_itr_m = PF_GLINT_DYN_CTL_WB_ON_ITR_M; +		intr->dyn_ctl_swint_trig_m = PF_GLINT_DYN_CTL_SWINT_TRIG_M; +		intr->dyn_ctl_sw_itridx_ena_m = +			PF_GLINT_DYN_CTL_SW_ITR_INDX_ENA_M;  		spacing = IDPF_ITR_IDX_SPACING(reg_vals[vec_id].itrn_index_spacing,  					       IDPF_PF_ITR_IDX_SPACING); diff --git a/drivers/net/ethernet/intel/idpf/idpf_main.c b/drivers/net/ethernet/intel/idpf/idpf_main.c index db476b3314c8..f71d3182580b 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_main.c +++ b/drivers/net/ethernet/intel/idpf/idpf_main.c @@ -8,7 +8,7 @@  #define DRV_SUMMARY	"Intel(R) Infrastructure Data Path Function Linux Driver"  MODULE_DESCRIPTION(DRV_SUMMARY); -MODULE_IMPORT_NS(LIBETH); +MODULE_IMPORT_NS("LIBETH");  MODULE_LICENSE("GPL");  /** diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c index da2a5becf62f..2fa9c36e33c9 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c @@ -2448,6 +2448,7 @@ static void idpf_tx_splitq_map(struct idpf_tx_queue *tx_q,  			 * rest of the packet.  			 */  			tx_buf->type = LIBETH_SQE_EMPTY; +			idpf_tx_buf_compl_tag(tx_buf) = params->compl_tag;  			/* Adjust the DMA offset and the remaining size of the  			 * fragment.  On the first iteration of this loop, @@ -3603,21 +3604,31 @@ static void idpf_vport_intr_dis_irq_all(struct idpf_vport *vport)  /**   * idpf_vport_intr_buildreg_itr - Enable default interrupt generation settings   * @q_vector: pointer to q_vector - * @type: itr index - * @itr: itr value   */ -static u32 idpf_vport_intr_buildreg_itr(struct idpf_q_vector *q_vector, -					const int type, u16 itr) +static u32 idpf_vport_intr_buildreg_itr(struct idpf_q_vector *q_vector)  { -	u32 itr_val; +	u32 itr_val = q_vector->intr_reg.dyn_ctl_intena_m; +	int type = IDPF_NO_ITR_UPDATE_IDX; +	u16 itr = 0; + +	if (q_vector->wb_on_itr) { +		/* +		 * Trigger a software interrupt when exiting wb_on_itr, to make +		 * sure we catch any pending write backs that might have been +		 * missed due to interrupt state transition. +		 */ +		itr_val |= q_vector->intr_reg.dyn_ctl_swint_trig_m | +			   q_vector->intr_reg.dyn_ctl_sw_itridx_ena_m; +		type = IDPF_SW_ITR_UPDATE_IDX; +		itr = IDPF_ITR_20K; +	}  	itr &= IDPF_ITR_MASK;  	/* Don't clear PBA because that can cause lost interrupts that  	 * came in while we were cleaning/polling  	 */ -	itr_val = q_vector->intr_reg.dyn_ctl_intena_m | -		  (type << q_vector->intr_reg.dyn_ctl_itridx_s) | -		  (itr << (q_vector->intr_reg.dyn_ctl_intrvl_s - 1)); +	itr_val |= (type << q_vector->intr_reg.dyn_ctl_itridx_s) | +		   (itr << (q_vector->intr_reg.dyn_ctl_intrvl_s - 1));  	return itr_val;  } @@ -3715,9 +3726,8 @@ void idpf_vport_intr_update_itr_ena_irq(struct idpf_q_vector *q_vector)  	/* net_dim() updates ITR out-of-band using a work item */  	idpf_net_dim(q_vector); +	intval = idpf_vport_intr_buildreg_itr(q_vector);  	q_vector->wb_on_itr = false; -	intval = idpf_vport_intr_buildreg_itr(q_vector, -					      IDPF_NO_ITR_UPDATE_IDX, 0);  	writel(intval, q_vector->intr_reg.dyn_ctl);  } diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h index 9c1fe84108ed..0f71a6f5557b 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h @@ -354,6 +354,8 @@ struct idpf_vec_regs {   * @dyn_ctl_itridx_m: Mask for ITR index   * @dyn_ctl_intrvl_s: Register bit offset for ITR interval   * @dyn_ctl_wb_on_itr_m: Mask for WB on ITR feature + * @dyn_ctl_sw_itridx_ena_m: Mask for SW ITR index + * @dyn_ctl_swint_trig_m: Mask for dyn_ctl SW triggered interrupt enable   * @rx_itr: RX ITR register   * @tx_itr: TX ITR register   * @icr_ena: Interrupt cause register offset @@ -367,6 +369,8 @@ struct idpf_intr_reg {  	u32 dyn_ctl_itridx_m;  	u32 dyn_ctl_intrvl_s;  	u32 dyn_ctl_wb_on_itr_m; +	u32 dyn_ctl_sw_itridx_ena_m; +	u32 dyn_ctl_swint_trig_m;  	void __iomem *rx_itr;  	void __iomem *tx_itr;  	void __iomem *icr_ena; @@ -437,7 +441,7 @@ struct idpf_q_vector {  	cpumask_var_t affinity_mask;  	__cacheline_group_end_aligned(cold);  }; -libeth_cacheline_set_assert(struct idpf_q_vector, 112, +libeth_cacheline_set_assert(struct idpf_q_vector, 120,  			    24 + sizeof(struct napi_struct) +  			    2 * sizeof(struct dim),  			    8 + sizeof(cpumask_var_t)); @@ -471,6 +475,8 @@ struct idpf_tx_queue_stats {  #define IDPF_ITR_IS_DYNAMIC(itr_mode) (itr_mode)  #define IDPF_ITR_TX_DEF		IDPF_ITR_20K  #define IDPF_ITR_RX_DEF		IDPF_ITR_20K +/* Index used for 'SW ITR' update in DYN_CTL register */ +#define IDPF_SW_ITR_UPDATE_IDX	2  /* Index used for 'No ITR' update in DYN_CTL register */  #define IDPF_NO_ITR_UPDATE_IDX	3  #define IDPF_ITR_IDX_SPACING(spacing, dflt)	(spacing ? spacing : dflt) diff --git a/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c b/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c index aad62e270ae4..aba828abcb17 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c +++ b/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c @@ -101,6 +101,9 @@ static int idpf_vf_intr_reg_init(struct idpf_vport *vport)  		intr->dyn_ctl_itridx_s = VF_INT_DYN_CTLN_ITR_INDX_S;  		intr->dyn_ctl_intrvl_s = VF_INT_DYN_CTLN_INTERVAL_S;  		intr->dyn_ctl_wb_on_itr_m = VF_INT_DYN_CTLN_WB_ON_ITR_M; +		intr->dyn_ctl_swint_trig_m = VF_INT_DYN_CTLN_SWINT_TRIG_M; +		intr->dyn_ctl_sw_itridx_ena_m = +			VF_INT_DYN_CTLN_SW_ITR_INDX_ENA_M;  		spacing = IDPF_ITR_IDX_SPACING(reg_vals[vec_id].itrn_index_spacing,  					       IDPF_VF_ITR_IDX_SPACING); diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 08578980b651..288a4bb2683a 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -637,6 +637,10 @@ static int __init igb_init_module(void)  	dca_register_notify(&dca_notifier);  #endif  	ret = pci_register_driver(&igb_driver); +#ifdef CONFIG_IGB_DCA +	if (ret) +		dca_unregister_notify(&dca_notifier); +#endif  	return ret;  } diff --git a/drivers/net/ethernet/intel/igc/igc_base.c b/drivers/net/ethernet/intel/igc/igc_base.c index 9fae8bdec2a7..1613b562d17c 100644 --- a/drivers/net/ethernet/intel/igc/igc_base.c +++ b/drivers/net/ethernet/intel/igc/igc_base.c @@ -68,6 +68,10 @@ static s32 igc_init_nvm_params_base(struct igc_hw *hw)  	u32 eecd = rd32(IGC_EECD);  	u16 size; +	/* failed to read reg and got all F's */ +	if (!(~eecd)) +		return -ENXIO; +  	size = FIELD_GET(IGC_EECD_SIZE_EX_MASK, eecd);  	/* Added to a constant, "size" becomes the left-shift value @@ -221,6 +225,8 @@ static s32 igc_get_invariants_base(struct igc_hw *hw)  	/* NVM initialization */  	ret_val = igc_init_nvm_params_base(hw); +	if (ret_val) +		goto out;  	switch (hw->mac.type) {  	case igc_i225:  		ret_val = igc_init_nvm_params_i225(hw); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h index 6493abf189de..6639069ad528 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.h @@ -194,6 +194,8 @@ u32 ixgbe_read_reg(struct ixgbe_hw *hw, u32 reg);  	dev_err(&adapter->pdev->dev, format, ## arg)  #define e_dev_notice(format, arg...) \  	dev_notice(&adapter->pdev->dev, format, ## arg) +#define e_dbg(msglvl, format, arg...) \ +	netif_dbg(adapter, msglvl, adapter->netdev, format, ## arg)  #define e_info(msglvl, format, arg...) \  	netif_info(adapter, msglvl, adapter->netdev, format, ## arg)  #define e_err(msglvl, format, arg...) \ diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h index 14aa2ca51f70..81179c60af4e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h @@ -40,7 +40,7 @@  #define IXGBE_SFF_1GBASESX_CAPABLE		0x1  #define IXGBE_SFF_1GBASELX_CAPABLE		0x2  #define IXGBE_SFF_1GBASET_CAPABLE		0x8 -#define IXGBE_SFF_BASEBX10_CAPABLE		0x64 +#define IXGBE_SFF_BASEBX10_CAPABLE		0x40  #define IXGBE_SFF_10GBASESR_CAPABLE		0x10  #define IXGBE_SFF_10GBASELR_CAPABLE		0x20  #define IXGBE_SFF_SOFT_RS_SELECT_MASK		0x8 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 9631559a5aea..ccdce80edd14 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -1048,7 +1048,7 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter,  		break;  	} -	e_info(drv, "VF %d requested invalid api version %u\n", vf, api); +	e_dbg(drv, "VF %d requested unsupported api version %u\n", vf, api);  	return -1;  } diff --git a/drivers/net/ethernet/intel/ixgbevf/ipsec.c b/drivers/net/ethernet/intel/ixgbevf/ipsec.c index 66cf17f19408..f804b35d79c7 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ipsec.c +++ b/drivers/net/ethernet/intel/ixgbevf/ipsec.c @@ -629,7 +629,6 @@ void ixgbevf_init_ipsec_offload(struct ixgbevf_adapter *adapter)  	switch (adapter->hw.api_version) {  	case ixgbe_mbox_api_14: -	case ixgbe_mbox_api_15:  		break;  	default:  		return; diff --git a/drivers/net/ethernet/intel/libeth/rx.c b/drivers/net/ethernet/intel/libeth/rx.c index f20926669318..66d1d23b8ad2 100644 --- a/drivers/net/ethernet/intel/libeth/rx.c +++ b/drivers/net/ethernet/intel/libeth/rx.c @@ -186,7 +186,7 @@ err_buf:  	return -ENOMEM;  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_create, LIBETH); +EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_create, "LIBETH");  /**   * libeth_rx_fq_destroy - destroy a &page_pool created by libeth @@ -197,7 +197,7 @@ void libeth_rx_fq_destroy(struct libeth_fq *fq)  	kvfree(fq->fqes);  	page_pool_destroy(fq->pp);  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, LIBETH); +EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, "LIBETH");  /**   * libeth_rx_recycle_slow - recycle a libeth page from the NAPI context @@ -209,7 +209,7 @@ void libeth_rx_recycle_slow(struct page *page)  {  	page_pool_recycle_direct(page->pp, page);  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, LIBETH); +EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, "LIBETH");  /* Converting abstract packet type numbers into a software structure with   * the packet parameters to do O(1) lookup on Rx. @@ -251,7 +251,7 @@ void libeth_rx_pt_gen_hash_type(struct libeth_rx_pt *pt)  	pt->hash_type |= libeth_rx_pt_xdp_iprot[pt->inner_prot];  	pt->hash_type |= libeth_rx_pt_xdp_pl[pt->payload_layer];  } -EXPORT_SYMBOL_NS_GPL(libeth_rx_pt_gen_hash_type, LIBETH); +EXPORT_SYMBOL_NS_GPL(libeth_rx_pt_gen_hash_type, "LIBETH");  /* Module */ diff --git a/drivers/net/ethernet/intel/libie/rx.c b/drivers/net/ethernet/intel/libie/rx.c index aceb8d8813c4..66a9825fe11f 100644 --- a/drivers/net/ethernet/intel/libie/rx.c +++ b/drivers/net/ethernet/intel/libie/rx.c @@ -116,8 +116,8 @@ const struct libeth_rx_pt libie_rx_pt_lut[LIBIE_RX_PT_NUM] = {  	LIBIE_RX_PT_IP(4),  	LIBIE_RX_PT_IP(6),  }; -EXPORT_SYMBOL_NS_GPL(libie_rx_pt_lut, LIBIE); +EXPORT_SYMBOL_NS_GPL(libie_rx_pt_lut, "LIBIE");  MODULE_DESCRIPTION("Intel(R) Ethernet common library"); -MODULE_IMPORT_NS(LIBETH); +MODULE_IMPORT_NS("LIBETH");  MODULE_LICENSE("GPL"); diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c index a06048719e84..67a6ff07c83d 100644 --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c @@ -2704,9 +2704,15 @@ static struct platform_device *port_platdev[3];  static void mv643xx_eth_shared_of_remove(void)  { +	struct mv643xx_eth_platform_data *pd;  	int n;  	for (n = 0; n < 3; n++) { +		if (!port_platdev[n]) +			continue; +		pd = dev_get_platdata(&port_platdev[n]->dev); +		if (pd) +			of_node_put(pd->phy_node);  		platform_device_del(port_platdev[n]);  		port_platdev[n] = NULL;  	} @@ -2769,8 +2775,10 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,  	}  	ppdev = platform_device_alloc(MV643XX_ETH_NAME, dev_num); -	if (!ppdev) -		return -ENOMEM; +	if (!ppdev) { +		ret = -ENOMEM; +		goto put_err; +	}  	ppdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);  	ppdev->dev.of_node = pnp; @@ -2792,6 +2800,8 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,  port_err:  	platform_device_put(ppdev); +put_err: +	of_node_put(ppd.phy_node);  	return ret;  } diff --git a/drivers/net/ethernet/marvell/octeontx2/af/common.h b/drivers/net/ethernet/marvell/octeontx2/af/common.h index 5d84386ed22d..406c59100a35 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/common.h +++ b/drivers/net/ethernet/marvell/octeontx2/af/common.h @@ -159,6 +159,7 @@ enum nix_scheduler {  #define	SDP_HW_MIN_FRS			16  #define CN10K_LMAC_LINK_MAX_FRS		16380 /* 16k - FCS */  #define CN10K_LBK_LINK_MAX_FRS		65535 /* 64k */ +#define SDP_LINK_CREDIT			0x320202  /* NIX RX action operation*/  #define NIX_RX_ACTIONOP_DROP		(0x0ull) diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c index 5d5a01dbbca1..a5d1e2bddd58 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c @@ -4672,6 +4672,9 @@ static void nix_link_config(struct rvu *rvu, int blkaddr,  	rvu_get_lbk_link_max_frs(rvu, &lbk_max_frs);  	rvu_get_lmac_link_max_frs(rvu, &lmac_max_frs); +	/* Set SDP link credit */ +	rvu_write64(rvu, blkaddr, NIX_AF_SDP_LINK_CREDIT, SDP_LINK_CREDIT); +  	/* Set default min/max packet lengths allowed on NIX Rx links.  	 *  	 * With HW reset minlen value of 60byte, HW will treat ARP pkts diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c index da69e454662a..1b765045aa63 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_fs.c @@ -1452,23 +1452,21 @@ process_flow:  	 * hence modify pcifunc accordingly.  	 */ -	/* AF installing for a PF/VF */ -	if (!req->hdr.pcifunc) +	if (!req->hdr.pcifunc) { +		/* AF installing for a PF/VF */  		target = req->vf; - -	/* PF installing for its VF */ -	if (!from_vf && req->vf && !from_rep_dev) { +	} else if (!from_vf && req->vf && !from_rep_dev) { +		/* PF installing for its VF */  		target = (req->hdr.pcifunc & ~RVU_PFVF_FUNC_MASK) | req->vf;  		pf_set_vfs_mac = req->default_rule &&  				(req->features & BIT_ULL(NPC_DMAC)); -	} - -	/* Representor device installing for a representee */ -	if (from_rep_dev && req->vf) +	} else if (from_rep_dev && req->vf) { +		/* Representor device installing for a representee */  		target = req->vf; -	else +	} else {  		/* msg received from PF/VF */  		target = req->hdr.pcifunc; +	}  	/* ignore chan_mask in case pf func is not AF, revisit later */  	if (!is_pffunc_af(req->hdr.pcifunc)) diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/rep.c b/drivers/net/ethernet/marvell/octeontx2/nic/rep.c index 232b10740c13..04e08e06f30f 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/rep.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/rep.c @@ -680,14 +680,17 @@ int rvu_rep_create(struct otx2_nic *priv, struct netlink_ext_ack *extack)  		ndev->features |= ndev->hw_features;  		eth_hw_addr_random(ndev);  		err = rvu_rep_devlink_port_register(rep); -		if (err) +		if (err) { +			free_netdev(ndev);  			goto exit; +		}  		SET_NETDEV_DEVLINK_PORT(ndev, &rep->dl_port);  		err = register_netdev(ndev);  		if (err) {  			NL_SET_ERR_MSG_MOD(extack,  					   "PFVF representor registration failed"); +			rvu_rep_devlink_port_unregister(rep);  			free_netdev(ndev);  			goto exit;  		} diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index 3914cd9210d4..988fa28cfb5f 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c @@ -130,6 +130,7 @@ static const struct pci_device_id sky2_id_table[] = {  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436C) }, /* 88E8072 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436D) }, /* 88E8055 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4370) }, /* 88E8075 */ +	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4373) }, /* 88E8075 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4380) }, /* 88E8057 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4381) }, /* 88E8059 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4382) }, /* 88E8079 */ diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c index 6bd8a18e3af3..e733b81e18a2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c @@ -1013,6 +1013,7 @@ static void cmd_work_handler(struct work_struct *work)  				complete(&ent->done);  			}  			up(&cmd->vars.sem); +			complete(&ent->slotted);  			return;  		}  	} else { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c index 878cbdbf5ec8..e7e01f3298ef 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c @@ -5,6 +5,7 @@  #include <net/nexthop.h>  #include <net/ip_tunnels.h>  #include "tc_tun_encap.h" +#include "fs_core.h"  #include "en_tc.h"  #include "tc_tun.h"  #include "rep/tc.h" @@ -24,10 +25,18 @@ static int mlx5e_set_int_port_tunnel(struct mlx5e_priv *priv,  	route_dev = dev_get_by_index(dev_net(e->out_dev), e->route_dev_ifindex); -	if (!route_dev || !netif_is_ovs_master(route_dev) || -	    attr->parse_attr->filter_dev == e->out_dev) +	if (!route_dev || !netif_is_ovs_master(route_dev))  		goto out; +	if (priv->mdev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_DMFS && +	    mlx5e_eswitch_uplink_rep(attr->parse_attr->filter_dev) && +	    (attr->esw_attr->dests[out_index].flags & MLX5_ESW_DEST_ENCAP)) { +		mlx5_core_warn(priv->mdev, +			       "Matching on external port with encap + fwd to table actions is not allowed for firmware steering\n"); +		err = -EINVAL; +		goto out; +	} +  	err = mlx5e_set_fwd_to_int_port_actions(priv, attr, e->route_dev_ifindex,  						MLX5E_TC_INT_PORT_EGRESS,  						&attr->action, out_index); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c index ca92e518be76..1baf8933a07c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c @@ -724,6 +724,12 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x,  	/* check esn */  	if (x->props.flags & XFRM_STATE_ESN)  		mlx5e_ipsec_update_esn_state(sa_entry); +	else +		/* According to RFC4303, section "3.3.3. Sequence Number Generation", +		 * the first packet sent using a given SA will contain a sequence +		 * number of 1. +		 */ +		sa_entry->esn_state.esn = 1;  	mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, &sa_entry->attrs); @@ -768,9 +774,12 @@ static int mlx5e_xfrm_add_state(struct xfrm_state *x,  				   MLX5_IPSEC_RESCHED);  	if (x->xso.type == XFRM_DEV_OFFLOAD_PACKET && -	    x->props.mode == XFRM_MODE_TUNNEL) -		xa_set_mark(&ipsec->sadb, sa_entry->ipsec_obj_id, -			    MLX5E_IPSEC_TUNNEL_SA); +	    x->props.mode == XFRM_MODE_TUNNEL) { +		xa_lock_bh(&ipsec->sadb); +		__xa_set_mark(&ipsec->sadb, sa_entry->ipsec_obj_id, +			      MLX5E_IPSEC_TUNNEL_SA); +		xa_unlock_bh(&ipsec->sadb); +	}  out:  	x->xso.offload_handle = (unsigned long)sa_entry; @@ -797,7 +806,6 @@ err_xfrm:  static void mlx5e_xfrm_del_state(struct xfrm_state *x)  {  	struct mlx5e_ipsec_sa_entry *sa_entry = to_ipsec_sa_entry(x); -	struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs;  	struct mlx5e_ipsec *ipsec = sa_entry->ipsec;  	struct mlx5e_ipsec_sa_entry *old; @@ -806,12 +814,6 @@ static void mlx5e_xfrm_del_state(struct xfrm_state *x)  	old = xa_erase_bh(&ipsec->sadb, sa_entry->ipsec_obj_id);  	WARN_ON(old != sa_entry); - -	if (attrs->mode == XFRM_MODE_TUNNEL && -	    attrs->type == XFRM_DEV_OFFLOAD_PACKET) -		/* Make sure that no ARP requests are running in parallel */ -		flush_workqueue(ipsec->wq); -  }  static void mlx5e_xfrm_free_state(struct xfrm_state *x) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c index e51b03d4c717..57861d34d46f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c @@ -1718,23 +1718,21 @@ static int tx_add_rule(struct mlx5e_ipsec_sa_entry *sa_entry)  		goto err_alloc;  	} -	if (attrs->family == AF_INET) -		setup_fte_addr4(spec, &attrs->saddr.a4, &attrs->daddr.a4); -	else -		setup_fte_addr6(spec, attrs->saddr.a6, attrs->daddr.a6); -  	setup_fte_no_frags(spec);  	setup_fte_upper_proto_match(spec, &attrs->upspec);  	switch (attrs->type) {  	case XFRM_DEV_OFFLOAD_CRYPTO: +		if (attrs->family == AF_INET) +			setup_fte_addr4(spec, &attrs->saddr.a4, &attrs->daddr.a4); +		else +			setup_fte_addr6(spec, attrs->saddr.a6, attrs->daddr.a6);  		setup_fte_spi(spec, attrs->spi, false);  		setup_fte_esp(spec);  		setup_fte_reg_a(spec);  		break;  	case XFRM_DEV_OFFLOAD_PACKET: -		if (attrs->reqid) -			setup_fte_reg_c4(spec, attrs->reqid); +		setup_fte_reg_c4(spec, attrs->reqid);  		err = setup_pkt_reformat(ipsec, attrs, &flow_act);  		if (err)  			goto err_pkt_reformat; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c index 53cfa39188cb..820debf3fbbf 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c @@ -91,8 +91,9 @@ u32 mlx5_ipsec_device_caps(struct mlx5_core_dev *mdev)  EXPORT_SYMBOL_GPL(mlx5_ipsec_device_caps);  static void mlx5e_ipsec_packet_setup(void *obj, u32 pdn, -				     struct mlx5_accel_esp_xfrm_attrs *attrs) +				     struct mlx5e_ipsec_sa_entry *sa_entry)  { +	struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs;  	void *aso_ctx;  	aso_ctx = MLX5_ADDR_OF(ipsec_obj, obj, ipsec_aso); @@ -120,8 +121,12 @@ static void mlx5e_ipsec_packet_setup(void *obj, u32 pdn,  	 * active.  	 */  	MLX5_SET(ipsec_obj, obj, aso_return_reg, MLX5_IPSEC_ASO_REG_C_4_5); -	if (attrs->dir == XFRM_DEV_OFFLOAD_OUT) +	if (attrs->dir == XFRM_DEV_OFFLOAD_OUT) {  		MLX5_SET(ipsec_aso, aso_ctx, mode, MLX5_IPSEC_ASO_INC_SN); +		if (!attrs->replay_esn.trigger) +			MLX5_SET(ipsec_aso, aso_ctx, mode_parameter, +				 sa_entry->esn_state.esn); +	}  	if (attrs->lft.hard_packet_limit != XFRM_INF) {  		MLX5_SET(ipsec_aso, aso_ctx, remove_flow_pkt_cnt, @@ -175,7 +180,7 @@ static int mlx5_create_ipsec_obj(struct mlx5e_ipsec_sa_entry *sa_entry)  	res = &mdev->mlx5e_res.hw_objs;  	if (attrs->type == XFRM_DEV_OFFLOAD_PACKET) -		mlx5e_ipsec_packet_setup(obj, res->pdn, attrs); +		mlx5e_ipsec_packet_setup(obj, res->pdn, sa_entry);  	err = mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));  	if (!err) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c index cc9bcc420032..6ab02f3fc291 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c @@ -339,9 +339,13 @@ static int mlx5e_macsec_init_sa_fs(struct macsec_context *ctx,  {  	struct mlx5e_priv *priv = macsec_netdev_priv(ctx->netdev);  	struct mlx5_macsec_fs *macsec_fs = priv->mdev->macsec_fs; +	const struct macsec_tx_sc *tx_sc = &ctx->secy->tx_sc;  	struct mlx5_macsec_rule_attrs rule_attrs;  	union mlx5_macsec_rule *macsec_rule; +	if (is_tx && tx_sc->encoding_sa != sa->assoc_num) +		return 0; +  	rule_attrs.macsec_obj_id = sa->macsec_obj_id;  	rule_attrs.sci = sa->sci;  	rule_attrs.assoc_num = sa->assoc_num; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index d0b80b520397..0ec17c276bdd 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -2680,11 +2680,11 @@ void mlx5e_trigger_napi_sched(struct napi_struct *napi)  static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,  			      struct mlx5e_params *params, -			      struct mlx5e_channel_param *cparam,  			      struct xsk_buff_pool *xsk_pool,  			      struct mlx5e_channel **cp)  {  	struct net_device *netdev = priv->netdev; +	struct mlx5e_channel_param *cparam;  	struct mlx5_core_dev *mdev;  	struct mlx5e_xsk_param xsk;  	struct mlx5e_channel *c; @@ -2706,8 +2706,15 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,  		return err;  	c = kvzalloc_node(sizeof(*c), GFP_KERNEL, cpu_to_node(cpu)); -	if (!c) -		return -ENOMEM; +	cparam = kvzalloc(sizeof(*cparam), GFP_KERNEL); +	if (!c || !cparam) { +		err = -ENOMEM; +		goto err_free; +	} + +	err = mlx5e_build_channel_param(mdev, params, cparam); +	if (err) +		goto err_free;  	c->priv     = priv;  	c->mdev     = mdev; @@ -2741,6 +2748,7 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,  	*cp = c; +	kvfree(cparam);  	return 0;  err_close_queues: @@ -2749,6 +2757,8 @@ err_close_queues:  err_napi_del:  	netif_napi_del(&c->napi); +err_free: +	kvfree(cparam);  	kvfree(c);  	return err; @@ -2807,20 +2817,14 @@ static void mlx5e_close_channel(struct mlx5e_channel *c)  int mlx5e_open_channels(struct mlx5e_priv *priv,  			struct mlx5e_channels *chs)  { -	struct mlx5e_channel_param *cparam;  	int err = -ENOMEM;  	int i;  	chs->num = chs->params.num_channels;  	chs->c = kcalloc(chs->num, sizeof(struct mlx5e_channel *), GFP_KERNEL); -	cparam = kvzalloc(sizeof(struct mlx5e_channel_param), GFP_KERNEL); -	if (!chs->c || !cparam) -		goto err_free; - -	err = mlx5e_build_channel_param(priv->mdev, &chs->params, cparam); -	if (err) -		goto err_free; +	if (!chs->c) +		goto err_out;  	for (i = 0; i < chs->num; i++) {  		struct xsk_buff_pool *xsk_pool = NULL; @@ -2828,7 +2832,7 @@ int mlx5e_open_channels(struct mlx5e_priv *priv,  		if (chs->params.xdp_prog)  			xsk_pool = mlx5e_xsk_get_pool(&chs->params, chs->params.xsk, i); -		err = mlx5e_open_channel(priv, i, &chs->params, cparam, xsk_pool, &chs->c[i]); +		err = mlx5e_open_channel(priv, i, &chs->params, xsk_pool, &chs->c[i]);  		if (err)  			goto err_close_channels;  	} @@ -2846,7 +2850,6 @@ int mlx5e_open_channels(struct mlx5e_priv *priv,  	}  	mlx5e_health_channels_update(priv); -	kvfree(cparam);  	return 0;  err_close_ptp: @@ -2857,9 +2860,8 @@ err_close_channels:  	for (i--; i >= 0; i--)  		mlx5e_close_channel(chs->c[i]); -err_free:  	kfree(chs->c); -	kvfree(cparam); +err_out:  	chs->num = 0;  	return err;  } @@ -6540,8 +6542,23 @@ static void _mlx5e_remove(struct auxiliary_device *adev)  	mlx5_core_uplink_netdev_set(mdev, NULL);  	mlx5e_dcbnl_delete_app(priv); -	unregister_netdev(priv->netdev); -	_mlx5e_suspend(adev, false); +	/* When unload driver, the netdev is in registered state +	 * if it's from legacy mode. If from switchdev mode, it +	 * is already unregistered before changing to NIC profile. +	 */ +	if (priv->netdev->reg_state == NETREG_REGISTERED) { +		unregister_netdev(priv->netdev); +		_mlx5e_suspend(adev, false); +	} else { +		struct mlx5_core_dev *pos; +		int i; + +		if (test_bit(MLX5E_STATE_DESTROYING, &priv->state)) +			mlx5_sd_for_each_dev(i, mdev, pos) +				mlx5e_destroy_mdev_resources(pos); +		else +			_mlx5e_suspend(adev, true); +	}  	/* Avoid cleanup if profile rollback failed. */  	if (priv->profile)  		priv->profile->cleanup(priv); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 554f9cb5b53f..fdff9fd8a89e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -1509,6 +1509,21 @@ mlx5e_vport_uplink_rep_unload(struct mlx5e_rep_priv *rpriv)  	priv = netdev_priv(netdev); +	/* This bit is set when using devlink to change eswitch mode from +	 * switchdev to legacy. As need to keep uplink netdev ifindex, we +	 * detach uplink representor profile and attach NIC profile only. +	 * The netdev will be unregistered later when unload NIC auxiliary +	 * driver for this case. +	 * We explicitly block devlink eswitch mode change if any IPSec rules +	 * offloaded, but can't block other cases, such as driver unload +	 * and devlink reload. We have to unregister netdev before profile +	 * change for those cases. This is to avoid resource leak because +	 * the offloaded rules don't have the chance to be unoffloaded before +	 * cleanup which is triggered by detach uplink representor profile. +	 */ +	if (!(priv->mdev->priv.flags & MLX5_PRIV_FLAGS_SWITCH_LEGACY)) +		unregister_netdev(netdev); +  	mlx5e_netdev_attach_nic_profile(priv);  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c index 5a0047bdcb51..ed977ae75fab 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec_fs.c @@ -150,11 +150,11 @@ void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev)  	unsigned long i;  	int err; -	xa_for_each(&esw->offloads.vport_reps, i, rep) { -		rpriv = rep->rep_data[REP_ETH].priv; -		if (!rpriv || !rpriv->netdev) +	mlx5_esw_for_each_rep(esw, i, rep) { +		if (atomic_read(&rep->rep_data[REP_ETH].state) != REP_LOADED)  			continue; +		rpriv = rep->rep_data[REP_ETH].priv;  		rhashtable_walk_enter(&rpriv->tc_ht, &iter);  		rhashtable_walk_start(&iter);  		while ((flow = rhashtable_walk_next(&iter)) != NULL) { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h index a83d41121db6..8573d36785f4 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h @@ -714,6 +714,9 @@ void mlx5e_tc_clean_fdb_peer_flows(struct mlx5_eswitch *esw);  			  MLX5_CAP_GEN_2((esw->dev), ec_vf_vport_base) +\  			  (last) - 1) +#define mlx5_esw_for_each_rep(esw, i, rep) \ +	xa_for_each(&((esw)->offloads.vport_reps), i, rep) +  struct mlx5_eswitch *__must_check  mlx5_devlink_eswitch_get(struct devlink *devlink); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c index d6ff2dc4c19e..06076dd9ec64 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c @@ -53,9 +53,6 @@  #include "lag/lag.h"  #include "en/tc/post_meter.h" -#define mlx5_esw_for_each_rep(esw, i, rep) \ -	xa_for_each(&((esw)->offloads.vport_reps), i, rep) -  /* There are two match-all miss flows, one for unicast dst mac and   * one for multicast.   */ @@ -2335,9 +2332,10 @@ out_free:  static void esw_mode_change(struct mlx5_eswitch *esw, u16 mode)  {  	mlx5_devcom_comp_lock(esw->dev->priv.hca_devcom_comp); - -	if (esw->dev->priv.flags & MLX5_PRIV_FLAGS_DISABLE_IB_ADEV) { +	if (esw->dev->priv.flags & MLX5_PRIV_FLAGS_DISABLE_IB_ADEV || +	    mlx5_core_mp_enabled(esw->dev)) {  		esw->mode = mode; +		mlx5_rescan_drivers_locked(esw->dev);  		mlx5_devcom_comp_unlock(esw->dev->priv.hca_devcom_comp);  		return;  	} @@ -3779,6 +3777,8 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,  	esw->eswitch_operation_in_progress = true;  	up_write(&esw->mode_lock); +	if (mode == DEVLINK_ESWITCH_MODE_LEGACY) +		esw->dev->priv.flags |= MLX5_PRIV_FLAGS_SWITCH_LEGACY;  	mlx5_eswitch_disable_locked(esw);  	if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV) {  		if (mlx5_devlink_trap_get_num_active(esw->dev)) { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c index 2eabfcc247c6..0ce999706d41 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c @@ -2709,6 +2709,7 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,  		break;  	case MLX5_FLOW_NAMESPACE_RDMA_TX:  		root_ns = steering->rdma_tx_root_ns; +		prio = RDMA_TX_BYPASS_PRIO;  		break;  	case MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS:  		root_ns = steering->rdma_rx_root_ns; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.c b/drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.c index ab2717012b79..39e80704b1c4 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/lag/port_sel.c @@ -530,7 +530,7 @@ int mlx5_lag_port_sel_create(struct mlx5_lag *ldev,  	set_tt_map(port_sel, hash_type);  	err = mlx5_lag_create_definers(ldev, hash_type, ports);  	if (err) -		return err; +		goto clear_port_sel;  	if (port_sel->tunnel) {  		err = mlx5_lag_create_inner_ttc_table(ldev); @@ -549,6 +549,8 @@ destroy_inner:  		mlx5_destroy_ttc_table(port_sel->inner.ttc);  destroy_definers:  	mlx5_lag_destroy_definers(ldev); +clear_port_sel: +	memset(port_sel, 0, sizeof(*port_sel));  	return err;  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c index a96be98be032..b96909fbeb12 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/sf/devlink.c @@ -257,6 +257,7 @@ static int mlx5_sf_add(struct mlx5_core_dev *dev, struct mlx5_sf_table *table,  	return 0;  esw_err: +	mlx5_sf_function_id_erase(table, sf);  	mlx5_sf_free(table, sf);  	return err;  } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.c index c00010ca86bd..9fb059a6511f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc_complex.c @@ -39,6 +39,8 @@ bool mlx5hws_bwc_match_params_is_complex(struct mlx5hws_context *ctx,  		} else {  			mlx5hws_err(ctx, "Failed to calculate matcher definer layout\n");  		} +	} else { +		kfree(mt->fc);  	}  	mlx5hws_match_template_destroy(mt); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index 424797b6d802..883b4ed30892 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -990,6 +990,7 @@ static int hws_bwc_send_queues_init(struct mlx5hws_context *ctx)  	for (i = 0; i < bwc_queues; i++) {  		mutex_init(&ctx->bwc_send_queue_locks[i]);  		lockdep_register_key(ctx->bwc_lock_class_keys + i); +		lockdep_set_class(ctx->bwc_send_queue_locks + i, ctx->bwc_lock_class_keys + i);  	}  	return 0; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c index 3d74109f8230..49f22cad92bf 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_domain.c @@ -297,7 +297,9 @@ dr_domain_add_vport_cap(struct mlx5dr_domain *dmn, u16 vport)  	if (ret) {  		mlx5dr_dbg(dmn, "Couldn't insert new vport into xarray (%d)\n", ret);  		kvfree(vport_caps); -		return ERR_PTR(ret); +		if (ret == -EBUSY) +			return ERR_PTR(-EBUSY); +		return NULL;  	}  	return vport_caps; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c index 6fa06ba2d346..f57c84e5128b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c @@ -1067,7 +1067,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,  	int inlen, err, eqn;  	void *cqc, *in;  	__be64 *pas; -	int vector;  	u32 i;  	cq = kzalloc(sizeof(*cq), GFP_KERNEL); @@ -1096,8 +1095,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,  	if (!in)  		goto err_cqwq; -	vector = raw_smp_processor_id() % mlx5_comp_vectors_max(mdev); -	err = mlx5_comp_eqn_get(mdev, vector, &eqn); +	err = mlx5_comp_eqn_get(mdev, 0, &eqn);  	if (err) {  		kvfree(in);  		goto err_cqwq; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wc.c b/drivers/net/ethernet/mellanox/mlx5/core/wc.c index 1bed75eca97d..740b719e7072 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/wc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/wc.c @@ -382,6 +382,7 @@ err_alloc_bfreg:  bool mlx5_wc_support_get(struct mlx5_core_dev *mdev)  { +	struct mutex *wc_state_lock = &mdev->wc_state_lock;  	struct mlx5_core_dev *parent = NULL;  	if (!MLX5_CAP_GEN(mdev, bf)) { @@ -400,32 +401,31 @@ bool mlx5_wc_support_get(struct mlx5_core_dev *mdev)  		 */  		goto out; -	mutex_lock(&mdev->wc_state_lock); - -	if (mdev->wc_state != MLX5_WC_STATE_UNINITIALIZED) -		goto unlock; -  #ifdef CONFIG_MLX5_SF -	if (mlx5_core_is_sf(mdev)) +	if (mlx5_core_is_sf(mdev)) {  		parent = mdev->priv.parent_mdev; +		wc_state_lock = &parent->wc_state_lock; +	}  #endif -	if (parent) { -		mutex_lock(&parent->wc_state_lock); +	mutex_lock(wc_state_lock); +	if (mdev->wc_state != MLX5_WC_STATE_UNINITIALIZED) +		goto unlock; + +	if (parent) {  		mlx5_core_test_wc(parent);  		mlx5_core_dbg(mdev, "parent set wc_state=%d\n",  			      parent->wc_state);  		mdev->wc_state = parent->wc_state; -		mutex_unlock(&parent->wc_state_lock); +	} else { +		mlx5_core_test_wc(mdev);  	} -	mlx5_core_test_wc(mdev); -  unlock: -	mutex_unlock(&mdev->wc_state_lock); +	mutex_unlock(wc_state_lock);  out:  	mlx5_core_dbg(mdev, "wc_state=%d\n", mdev->wc_state); diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c index 6fe185ea6732..1850a975b380 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c @@ -324,6 +324,10 @@ static const struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_5b[] =  	MLXSW_AFK_ELEMENT_INST_EXT_U32(SRC_SYS_PORT, 0x04, 0, 9, -1, true), /* RX_ACL_SYSTEM_PORT */  }; +static const struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_1b[] = { +	MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_0_31, 0x04, 4), +}; +  static const struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_5b[] = {  	MLXSW_AFK_ELEMENT_INST_U32(VIRT_ROUTER, 0x04, 20, 12),  }; @@ -341,7 +345,7 @@ static const struct mlxsw_afk_block mlxsw_sp4_afk_blocks[] = {  	MLXSW_AFK_BLOCK(0x14, mlxsw_sp_afk_element_info_mac_4),  	MLXSW_AFK_BLOCK_HIGH_ENTROPY(0x1A, mlxsw_sp_afk_element_info_mac_5b),  	MLXSW_AFK_BLOCK_HIGH_ENTROPY(0x38, mlxsw_sp_afk_element_info_ipv4_0), -	MLXSW_AFK_BLOCK_HIGH_ENTROPY(0x39, mlxsw_sp_afk_element_info_ipv4_1), +	MLXSW_AFK_BLOCK_HIGH_ENTROPY(0x3F, mlxsw_sp_afk_element_info_ipv4_1b),  	MLXSW_AFK_BLOCK(0x3A, mlxsw_sp_afk_element_info_ipv4_2),  	MLXSW_AFK_BLOCK(0x36, mlxsw_sp_afk_element_info_ipv4_5b),  	MLXSW_AFK_BLOCK(0x40, mlxsw_sp_afk_element_info_ipv6_0), diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c index 4b5fd71c897d..32d2e61f2b82 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c @@ -423,8 +423,7 @@ mlxsw_sp_span_gretap4_route(const struct net_device *to_dev,  	parms = mlxsw_sp_ipip_netdev_parms4(to_dev);  	ip_tunnel_init_flow(&fl4, parms.iph.protocol, *daddrp, *saddrp, -			    0, 0, dev_net(to_dev), parms.link, tun->fwmark, 0, -			    0); +			    0, 0, tun->net, parms.link, tun->fwmark, 0, 0);  	rt = ip_route_output_key(tun->net, &fl4);  	if (IS_ERR(rt)) diff --git a/drivers/net/ethernet/meta/fbnic/Makefile b/drivers/net/ethernet/meta/fbnic/Makefile index 239b2258ec65..ea6214ca48e7 100644 --- a/drivers/net/ethernet/meta/fbnic/Makefile +++ b/drivers/net/ethernet/meta/fbnic/Makefile @@ -13,7 +13,6 @@ fbnic-y := fbnic_csr.o \  	   fbnic_ethtool.o \  	   fbnic_fw.o \  	   fbnic_hw_stats.o \ -	   fbnic_hwmon.o \  	   fbnic_irq.o \  	   fbnic_mac.o \  	   fbnic_netdev.o \ diff --git a/drivers/net/ethernet/meta/fbnic/fbnic.h b/drivers/net/ethernet/meta/fbnic/fbnic.h index 706ae6104c8e..744eb0d95449 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic.h @@ -20,7 +20,6 @@ struct fbnic_dev {  	struct device *dev;  	struct net_device *netdev;  	struct dentry *dbg_fbd; -	struct device *hwmon;  	u32 __iomem *uc_addr0;  	u32 __iomem *uc_addr4; @@ -33,7 +32,6 @@ struct fbnic_dev {  	struct fbnic_fw_mbx mbx[FBNIC_IPC_MBX_INDICES];  	struct fbnic_fw_cap fw_cap; -	struct fbnic_fw_completion *cmpl_data;  	/* Lock protecting Tx Mailbox queue to prevent possible races */  	spinlock_t fw_tx_lock; @@ -142,9 +140,6 @@ void fbnic_devlink_unregister(struct fbnic_dev *fbd);  int fbnic_fw_enable_mbx(struct fbnic_dev *fbd);  void fbnic_fw_disable_mbx(struct fbnic_dev *fbd); -void fbnic_hwmon_register(struct fbnic_dev *fbd); -void fbnic_hwmon_unregister(struct fbnic_dev *fbd); -  int fbnic_pcs_irq_enable(struct fbnic_dev *fbd);  void fbnic_pcs_irq_disable(struct fbnic_dev *fbd); diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_csr.c b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c index 2118901b25e9..aeb9f333f4c7 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_csr.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_csr.c @@ -64,7 +64,7 @@ static void fbnic_csr_get_regs_rpc_ram(struct fbnic_dev *fbd, u32 **data_p)  	u32 i, j;  	*(data++) = start; -	*(data++) = end - 1; +	*(data++) = end;  	/* FBNIC_RPC_TCAM_ACT */  	for (i = 0; i < FBNIC_RPC_TCAM_ACT_NUM_ENTRIES; i++) { diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h index 7cd8841920e4..221faf8c6756 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_fw.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_fw.h @@ -44,13 +44,6 @@ struct fbnic_fw_cap {  	u8	link_fec;  }; -struct fbnic_fw_completion { -	struct { -		s32 millivolts; -		s32 millidegrees; -	} tsene; -}; -  void fbnic_mbx_init(struct fbnic_dev *fbd);  void fbnic_mbx_clean(struct fbnic_dev *fbd);  void fbnic_mbx_poll(struct fbnic_dev *fbd); diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c b/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c deleted file mode 100644 index bcd1086e3768..000000000000 --- a/drivers/net/ethernet/meta/fbnic/fbnic_hwmon.c +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) Meta Platforms, Inc. and affiliates. */ - -#include <linux/hwmon.h> - -#include "fbnic.h" -#include "fbnic_mac.h" - -static int fbnic_hwmon_sensor_id(enum hwmon_sensor_types type) -{ -	if (type == hwmon_temp) -		return FBNIC_SENSOR_TEMP; -	if (type == hwmon_in) -		return FBNIC_SENSOR_VOLTAGE; - -	return -EOPNOTSUPP; -} - -static umode_t fbnic_hwmon_is_visible(const void *drvdata, -				      enum hwmon_sensor_types type, -				      u32 attr, int channel) -{ -	if (type == hwmon_temp && attr == hwmon_temp_input) -		return 0444; -	if (type == hwmon_in && attr == hwmon_in_input) -		return 0444; - -	return 0; -} - -static int fbnic_hwmon_read(struct device *dev, enum hwmon_sensor_types type, -			    u32 attr, int channel, long *val) -{ -	struct fbnic_dev *fbd = dev_get_drvdata(dev); -	const struct fbnic_mac *mac = fbd->mac; -	int id; - -	id = fbnic_hwmon_sensor_id(type); -	return id < 0 ? id : mac->get_sensor(fbd, id, val); -} - -static const struct hwmon_ops fbnic_hwmon_ops = { -	.is_visible = fbnic_hwmon_is_visible, -	.read = fbnic_hwmon_read, -}; - -static const struct hwmon_channel_info *fbnic_hwmon_info[] = { -	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT), -	HWMON_CHANNEL_INFO(in, HWMON_I_INPUT), -	NULL -}; - -static const struct hwmon_chip_info fbnic_chip_info = { -	.ops = &fbnic_hwmon_ops, -	.info = fbnic_hwmon_info, -}; - -void fbnic_hwmon_register(struct fbnic_dev *fbd) -{ -	if (!IS_REACHABLE(CONFIG_HWMON)) -		return; - -	fbd->hwmon = hwmon_device_register_with_info(fbd->dev, "fbnic", -						     fbd, &fbnic_chip_info, -						     NULL); -	if (IS_ERR(fbd->hwmon)) { -		dev_notice(fbd->dev, -			   "Failed to register hwmon device %pe\n", -			fbd->hwmon); -		fbd->hwmon = NULL; -	} -} - -void fbnic_hwmon_unregister(struct fbnic_dev *fbd) -{ -	if (!IS_REACHABLE(CONFIG_HWMON) || !fbd->hwmon) -		return; - -	hwmon_device_unregister(fbd->hwmon); -	fbd->hwmon = NULL; -} diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_mac.c b/drivers/net/ethernet/meta/fbnic/fbnic_mac.c index 80b82ff12c4d..7b654d0a6dac 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_mac.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_mac.c @@ -686,27 +686,6 @@ fbnic_mac_get_eth_mac_stats(struct fbnic_dev *fbd, bool reset,  			    MAC_STAT_TX_BROADCAST);  } -static int fbnic_mac_get_sensor_asic(struct fbnic_dev *fbd, int id, long *val) -{ -	struct fbnic_fw_completion fw_cmpl; -	s32 *sensor; - -	switch (id) { -	case FBNIC_SENSOR_TEMP: -		sensor = &fw_cmpl.tsene.millidegrees; -		break; -	case FBNIC_SENSOR_VOLTAGE: -		sensor = &fw_cmpl.tsene.millivolts; -		break; -	default: -		return -EINVAL; -	} - -	*val = *sensor; - -	return 0; -} -  static const struct fbnic_mac fbnic_mac_asic = {  	.init_regs = fbnic_mac_init_regs,  	.pcs_enable = fbnic_pcs_enable_asic, @@ -716,7 +695,6 @@ static const struct fbnic_mac fbnic_mac_asic = {  	.get_eth_mac_stats = fbnic_mac_get_eth_mac_stats,  	.link_down = fbnic_mac_link_down_asic,  	.link_up = fbnic_mac_link_up_asic, -	.get_sensor = fbnic_mac_get_sensor_asic,  };  /** diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_mac.h b/drivers/net/ethernet/meta/fbnic/fbnic_mac.h index 05a591653e09..476239a9d381 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_mac.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_mac.h @@ -47,11 +47,6 @@ enum {  #define FBNIC_LINK_MODE_PAM4	(FBNIC_LINK_50R1)  #define FBNIC_LINK_MODE_MASK	(FBNIC_LINK_AUTO - 1) -enum fbnic_sensor_id { -	FBNIC_SENSOR_TEMP,		/* Temp in millidegrees Centigrade */ -	FBNIC_SENSOR_VOLTAGE,		/* Voltage in millivolts */ -}; -  /* This structure defines the interface hooks for the MAC. The MAC hooks   * will be configured as a const struct provided with a set of function   * pointers. @@ -88,8 +83,6 @@ struct fbnic_mac {  	void (*link_down)(struct fbnic_dev *fbd);  	void (*link_up)(struct fbnic_dev *fbd, bool tx_pause, bool rx_pause); - -	int (*get_sensor)(struct fbnic_dev *fbd, int id, long *val);  };  int fbnic_mac_init(struct fbnic_dev *fbd); diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_pci.c b/drivers/net/ethernet/meta/fbnic/fbnic_pci.c index 32702dc4a066..7ccf192f13d5 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_pci.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_pci.c @@ -296,8 +296,6 @@ static int fbnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	/* Capture snapshot of hardware stats so netdev can calculate delta */  	fbnic_reset_hw_stats(fbd); -	fbnic_hwmon_register(fbd); -  	if (!fbd->dsn) {  		dev_warn(&pdev->dev, "Reading serial number failed\n");  		goto init_failure_mode; @@ -360,7 +358,6 @@ static void fbnic_remove(struct pci_dev *pdev)  		fbnic_netdev_free(fbd);  	} -	fbnic_hwmon_unregister(fbd);  	fbnic_dbg_fbd_exit(fbd);  	fbnic_devlink_unregister(fbd);  	fbnic_fw_disable_mbx(fbd); diff --git a/drivers/net/ethernet/microchip/Kconfig b/drivers/net/ethernet/microchip/Kconfig index 73832fb2bc32..ee046468652c 100644 --- a/drivers/net/ethernet/microchip/Kconfig +++ b/drivers/net/ethernet/microchip/Kconfig @@ -59,7 +59,6 @@ config LAN743X  source "drivers/net/ethernet/microchip/lan865x/Kconfig"  source "drivers/net/ethernet/microchip/lan966x/Kconfig" -source "drivers/net/ethernet/microchip/lan969x/Kconfig"  source "drivers/net/ethernet/microchip/sparx5/Kconfig"  source "drivers/net/ethernet/microchip/vcap/Kconfig"  source "drivers/net/ethernet/microchip/fdma/Kconfig" diff --git a/drivers/net/ethernet/microchip/Makefile b/drivers/net/ethernet/microchip/Makefile index 7770df82200f..3c65baed9fd8 100644 --- a/drivers/net/ethernet/microchip/Makefile +++ b/drivers/net/ethernet/microchip/Makefile @@ -11,7 +11,6 @@ lan743x-objs := lan743x_main.o lan743x_ethtool.o lan743x_ptp.o  obj-$(CONFIG_LAN865X) += lan865x/  obj-$(CONFIG_LAN966X_SWITCH) += lan966x/ -obj-$(CONFIG_LAN969X_SWITCH) += lan969x/  obj-$(CONFIG_SPARX5_SWITCH) += sparx5/  obj-$(CONFIG_VCAP) += vcap/  obj-$(CONFIG_FDMA) += fdma/ diff --git a/drivers/net/ethernet/microchip/lan969x/Kconfig b/drivers/net/ethernet/microchip/lan969x/Kconfig deleted file mode 100644 index c5c6122ae2ec..000000000000 --- a/drivers/net/ethernet/microchip/lan969x/Kconfig +++ /dev/null @@ -1,5 +0,0 @@ -config LAN969X_SWITCH -	bool "Lan969x switch driver" -	depends on SPARX5_SWITCH -	help -	  This driver supports the lan969x family of network switch devices. diff --git a/drivers/net/ethernet/microchip/lan969x/Makefile b/drivers/net/ethernet/microchip/lan969x/Makefile deleted file mode 100644 index 316405cbbc71..000000000000 --- a/drivers/net/ethernet/microchip/lan969x/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# Makefile for the Microchip lan969x network device drivers. -# - -obj-$(CONFIG_SPARX5_SWITCH) += lan969x-switch.o - -lan969x-switch-y := lan969x_regs.o lan969x.o lan969x_calendar.o \ - lan969x_vcap_ag_api.o lan969x_vcap_impl.o - -# Provide include files -ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/fdma -ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/vcap diff --git a/drivers/net/ethernet/microchip/sparx5/Kconfig b/drivers/net/ethernet/microchip/sparx5/Kconfig index 3f04992eace6..35b057c9d0cb 100644 --- a/drivers/net/ethernet/microchip/sparx5/Kconfig +++ b/drivers/net/ethernet/microchip/sparx5/Kconfig @@ -24,3 +24,9 @@ config SPARX5_DCB  	  DSCP and PCP.  	  If unsure, set to Y. + +config LAN969X_SWITCH +	bool "Lan969x switch driver" +	depends on SPARX5_SWITCH +	help +	  This driver supports the lan969x family of network switch devices. diff --git a/drivers/net/ethernet/microchip/sparx5/Makefile b/drivers/net/ethernet/microchip/sparx5/Makefile index 3435ca86dd70..4bf2a885a9da 100644 --- a/drivers/net/ethernet/microchip/sparx5/Makefile +++ b/drivers/net/ethernet/microchip/sparx5/Makefile @@ -16,6 +16,12 @@ sparx5-switch-y  := sparx5_main.o sparx5_packet.o \  sparx5-switch-$(CONFIG_SPARX5_DCB) += sparx5_dcb.o  sparx5-switch-$(CONFIG_DEBUG_FS) += sparx5_vcap_debugfs.o +sparx5-switch-$(CONFIG_LAN969X_SWITCH) += lan969x/lan969x_regs.o \ +					  lan969x/lan969x.o \ +					  lan969x/lan969x_calendar.o \ +					  lan969x/lan969x_vcap_ag_api.o \ +					  lan969x/lan969x_vcap_impl.o +  # Provide include files  ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/vcap  ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/fdma diff --git a/drivers/net/ethernet/microchip/lan969x/lan969x.c b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.c index ac37d0f74ee3..c2afa2176b08 100644 --- a/drivers/net/ethernet/microchip/lan969x/lan969x.c +++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.c @@ -273,9 +273,9 @@ static irqreturn_t lan969x_ptp_irq_handler(int irq, void *args)  		if (WARN_ON(!skb_match))  			continue; -		spin_lock(&sparx5->ptp_ts_id_lock); +		spin_lock_irqsave(&sparx5->ptp_ts_id_lock, flags);  		sparx5->ptp_skbs--; -		spin_unlock(&sparx5->ptp_ts_id_lock); +		spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags);  		/* Get the h/w timestamp */  		sparx5_get_hwtimestamp(sparx5, &ts, delay); @@ -346,8 +346,3 @@ const struct sparx5_match_data lan969x_desc = {  	.consts     = &lan969x_consts,  	.ops        = &lan969x_ops,  }; -EXPORT_SYMBOL_GPL(lan969x_desc); - -MODULE_DESCRIPTION("Microchip lan969x switch driver"); -MODULE_AUTHOR("Daniel Machon <daniel.machon@microchip.com>"); -MODULE_LICENSE("Dual MIT/GPL"); diff --git a/drivers/net/ethernet/microchip/lan969x/lan969x.h b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.h index 2489d0d32dfd..2489d0d32dfd 100644 --- a/drivers/net/ethernet/microchip/lan969x/lan969x.h +++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x.h diff --git a/drivers/net/ethernet/microchip/lan969x/lan969x_calendar.c b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_calendar.c index e857640df185..e857640df185 100644 --- a/drivers/net/ethernet/microchip/lan969x/lan969x_calendar.c +++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_calendar.c diff --git a/drivers/net/ethernet/microchip/lan969x/lan969x_regs.c b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_regs.c index ace4ba21eec4..ace4ba21eec4 100644 --- a/drivers/net/ethernet/microchip/lan969x/lan969x_regs.c +++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_regs.c diff --git a/drivers/net/ethernet/microchip/lan969x/lan969x_vcap_ag_api.c b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c index 7acc5bcf337a..7acc5bcf337a 100644 --- a/drivers/net/ethernet/microchip/lan969x/lan969x_vcap_ag_api.c +++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_ag_api.c diff --git a/drivers/net/ethernet/microchip/lan969x/lan969x_vcap_impl.c b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_impl.c index 543a1f2bf6bd..543a1f2bf6bd 100644 --- a/drivers/net/ethernet/microchip/lan969x/lan969x_vcap_impl.c +++ b/drivers/net/ethernet/microchip/sparx5/lan969x/lan969x_vcap_impl.c diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_calendar.c b/drivers/net/ethernet/microchip/sparx5/sparx5_calendar.c index 5fe941c66c17..5c46d81de530 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_calendar.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_calendar.c @@ -98,7 +98,6 @@ u32 sparx5_cal_speed_to_value(enum sparx5_cal_bw speed)  	default: return 0;  	}  } -EXPORT_SYMBOL_GPL(sparx5_cal_speed_to_value);  static u32 sparx5_bandwidth_to_calendar(u32 bw)  { @@ -150,7 +149,6 @@ enum sparx5_cal_bw sparx5_get_port_cal_speed(struct sparx5 *sparx5, u32 portno)  		return SPX5_CAL_SPEED_NONE;  	return sparx5_bandwidth_to_calendar(port->conf.bandwidth);  } -EXPORT_SYMBOL_GPL(sparx5_get_port_cal_speed);  /* Auto configure the QSYS calendar based on port configuration */  int sparx5_config_auto_calendar(struct sparx5 *sparx5) diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c index 2f1013f870fb..f61aa15beab7 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c @@ -24,7 +24,7 @@  #include <linux/types.h>  #include <linux/reset.h> -#include "../lan969x/lan969x.h" /* for lan969x match data */ +#include "lan969x/lan969x.h" /* for lan969x match data */  #include "sparx5_main_regs.h"  #include "sparx5_main.h" @@ -780,12 +780,11 @@ static int sparx5_start(struct sparx5 *sparx5)  	err = -ENXIO;  	if (sparx5->fdma_irq >= 0 && is_sparx5(sparx5)) {  		if (GCB_CHIP_ID_REV_ID_GET(sparx5->chip_id) > 0) -			err = devm_request_threaded_irq(sparx5->dev, -							sparx5->fdma_irq, -							NULL, -							sparx5_fdma_handler, -							IRQF_ONESHOT, -							"sparx5-fdma", sparx5); +			err = devm_request_irq(sparx5->dev, +					       sparx5->fdma_irq, +					       sparx5_fdma_handler, +					       0, +					       "sparx5-fdma", sparx5);  		if (!err)  			err = sparx5_fdma_start(sparx5);  		if (err) @@ -1093,7 +1092,7 @@ static const struct sparx5_match_data sparx5_desc = {  static const struct of_device_id mchp_sparx5_match[] = {  	{ .compatible = "microchip,sparx5-switch", .data = &sparx5_desc }, -#if IS_ENABLED(CONFIG_LAN969X_SWITCH) +#ifdef CONFIG_LAN969X_SWITCH  	{ .compatible = "microchip,lan9691-switch", .data = &lan969x_desc },  #endif  	{ } diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mirror.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mirror.c index 9806729e9c62..76097761fa97 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_mirror.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mirror.c @@ -12,7 +12,6 @@  #define SPX5_MIRROR_DISABLED 0  #define SPX5_MIRROR_EGRESS 1  #define SPX5_MIRROR_INGRESS 2 -#define SPX5_MIRROR_MONITOR_PORT_DEFAULT 65  #define SPX5_QFWD_MP_OFFSET 9 /* Mirror port offset in the QFWD register */  /* Convert from bool ingress/egress to mirror direction */ @@ -200,7 +199,7 @@ void sparx5_mirror_del(struct sparx5_mall_entry *entry)  	sparx5_mirror_monitor_set(sparx5,  				  mirror_idx, -				  SPX5_MIRROR_MONITOR_PORT_DEFAULT); +				  sparx5->data->consts->n_ports);  }  void sparx5_mirror_stats(struct sparx5_mall_entry *entry, diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_port.c b/drivers/net/ethernet/microchip/sparx5/sparx5_port.c index 1401761c6251..f9d1a6bb9bff 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_port.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_port.c @@ -1151,7 +1151,7 @@ int sparx5_port_init(struct sparx5 *sparx5,  	spx5_inst_rmw(DEV10G_MAC_MAXLEN_CFG_MAX_LEN_SET(ETH_MAXLEN),  		      DEV10G_MAC_MAXLEN_CFG_MAX_LEN,  		      devinst, -		      DEV10G_MAC_ENA_CFG(0)); +		      DEV10G_MAC_MAXLEN_CFG(0));  	/* Handle Signal Detect in 10G PCS */  	spx5_inst_wr(PCS10G_BR_PCS_SD_CFG_SD_POL_SET(sd_pol) | diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c b/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c index 1c2903700a9c..2f168700f63c 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c @@ -303,7 +303,6 @@ void sparx5_get_hwtimestamp(struct sparx5 *sparx5,  	spin_unlock_irqrestore(&sparx5->ptp_clock_lock, flags);  } -EXPORT_SYMBOL_GPL(sparx5_get_hwtimestamp);  irqreturn_t sparx5_ptp_irq_handler(int irq, void *args)  { diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c b/drivers/net/ethernet/microsoft/mana/gdma_main.c index e97af7ac2bb2..be95336ce089 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c @@ -177,7 +177,7 @@ int mana_gd_send_request(struct gdma_context *gc, u32 req_len, const void *req,  	return mana_hwc_send_request(hwc, req_len, req, resp_len, resp);  } -EXPORT_SYMBOL_NS(mana_gd_send_request, NET_MANA); +EXPORT_SYMBOL_NS(mana_gd_send_request, "NET_MANA");  int mana_gd_alloc_memory(struct gdma_context *gc, unsigned int length,  			 struct gdma_mem_info *gmi) @@ -716,7 +716,7 @@ int mana_gd_destroy_dma_region(struct gdma_context *gc, u64 dma_region_handle)  	return 0;  } -EXPORT_SYMBOL_NS(mana_gd_destroy_dma_region, NET_MANA); +EXPORT_SYMBOL_NS(mana_gd_destroy_dma_region, "NET_MANA");  static int mana_gd_create_dma_region(struct gdma_dev *gd,  				     struct gdma_mem_info *gmi) @@ -820,7 +820,7 @@ free_q:  	kfree(queue);  	return err;  } -EXPORT_SYMBOL_NS(mana_gd_create_mana_eq, NET_MANA); +EXPORT_SYMBOL_NS(mana_gd_create_mana_eq, "NET_MANA");  int mana_gd_create_mana_wq_cq(struct gdma_dev *gd,  			      const struct gdma_queue_spec *spec, @@ -897,7 +897,7 @@ void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue *queue)  	mana_gd_free_memory(gmi);  	kfree(queue);  } -EXPORT_SYMBOL_NS(mana_gd_destroy_queue, NET_MANA); +EXPORT_SYMBOL_NS(mana_gd_destroy_queue, "NET_MANA");  int mana_gd_verify_vf_version(struct pci_dev *pdev)  { @@ -974,7 +974,7 @@ int mana_gd_register_device(struct gdma_dev *gd)  	return 0;  } -EXPORT_SYMBOL_NS(mana_gd_register_device, NET_MANA); +EXPORT_SYMBOL_NS(mana_gd_register_device, "NET_MANA");  int mana_gd_deregister_device(struct gdma_dev *gd)  { @@ -1005,7 +1005,7 @@ int mana_gd_deregister_device(struct gdma_dev *gd)  	return err;  } -EXPORT_SYMBOL_NS(mana_gd_deregister_device, NET_MANA); +EXPORT_SYMBOL_NS(mana_gd_deregister_device, "NET_MANA");  u32 mana_gd_wq_avail_space(struct gdma_queue *wq)  { @@ -1318,7 +1318,7 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev)  				   GFP_KERNEL);  	if (!gc->irq_contexts) {  		err = -ENOMEM; -		goto free_irq_vector; +		goto free_irq_array;  	}  	for (i = 0; i < nvec; i++) { @@ -1375,6 +1375,7 @@ static int mana_gd_setup_irqs(struct pci_dev *pdev)  	gc->max_num_msix = nvec;  	gc->num_msix_usable = nvec;  	cpus_read_unlock(); +	kfree(irqs);  	return 0;  free_irq: @@ -1387,8 +1388,9 @@ free_irq:  	}  	kfree(gc->irq_contexts); -	kfree(irqs);  	gc->irq_contexts = NULL; +free_irq_array: +	kfree(irqs);  free_irq_vector:  	cpus_read_unlock();  	pci_free_irq_vectors(pdev); @@ -1654,9 +1656,9 @@ static int __init mana_driver_init(void)  static void __exit mana_driver_exit(void)  { -	debugfs_remove(mana_debugfs_root); -  	pci_unregister_driver(&mana_driver); + +	debugfs_remove(mana_debugfs_root);  }  module_init(mana_driver_init); diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index 57ac732e7707..aa1e47233fe5 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -1022,7 +1022,7 @@ void mana_uncfg_vport(struct mana_port_context *apc)  	WARN_ON(apc->vport_use_count < 0);  	mutex_unlock(&apc->vport_mutex);  } -EXPORT_SYMBOL_NS(mana_uncfg_vport, NET_MANA); +EXPORT_SYMBOL_NS(mana_uncfg_vport, "NET_MANA");  int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,  		   u32 doorbell_pg_id) @@ -1092,7 +1092,7 @@ out:  	return err;  } -EXPORT_SYMBOL_NS(mana_cfg_vport, NET_MANA); +EXPORT_SYMBOL_NS(mana_cfg_vport, "NET_MANA");  static int mana_cfg_vport_steering(struct mana_port_context *apc,  				   enum TRI_STATE rx, @@ -1214,7 +1214,7 @@ int mana_create_wq_obj(struct mana_port_context *apc,  out:  	return err;  } -EXPORT_SYMBOL_NS(mana_create_wq_obj, NET_MANA); +EXPORT_SYMBOL_NS(mana_create_wq_obj, "NET_MANA");  void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type,  			 mana_handle_t wq_obj) @@ -1242,7 +1242,7 @@ void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type,  		netdev_err(ndev, "Failed to destroy WQ object: %d, 0x%x\n", err,  			   resp.hdr.status);  } -EXPORT_SYMBOL_NS(mana_destroy_wq_obj, NET_MANA); +EXPORT_SYMBOL_NS(mana_destroy_wq_obj, "NET_MANA");  static void mana_destroy_eq(struct mana_context *ac)  { @@ -2536,6 +2536,7 @@ void mana_query_gf_stats(struct mana_port_context *apc)  	mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_GF_STAT,  			     sizeof(req), sizeof(resp)); +	req.hdr.resp.msg_version = GDMA_MESSAGE_V2;  	req.req_stats = STATISTICS_FLAGS_RX_DISCARDS_NO_WQE |  			STATISTICS_FLAGS_RX_ERRORS_VPORT_DISABLED |  			STATISTICS_FLAGS_HC_RX_BYTES | @@ -3147,4 +3148,4 @@ struct net_device *mana_get_primary_netdev_rcu(struct mana_context *ac, u32 port  	return ndev;  } -EXPORT_SYMBOL_NS(mana_get_primary_netdev_rcu, NET_MANA); +EXPORT_SYMBOL_NS(mana_get_primary_netdev_rcu, "NET_MANA"); diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c index 3d72aa7b1305..ef93df520887 100644 --- a/drivers/net/ethernet/mscc/ocelot.c +++ b/drivers/net/ethernet/mscc/ocelot.c @@ -1432,7 +1432,7 @@ void ocelot_ifh_set_basic(void *ifh, struct ocelot *ocelot, int port,  	memset(ifh, 0, OCELOT_TAG_LEN);  	ocelot_ifh_set_bypass(ifh, 1); -	ocelot_ifh_set_src(ifh, BIT_ULL(ocelot->num_phys_ports)); +	ocelot_ifh_set_src(ifh, ocelot->num_phys_ports);  	ocelot_ifh_set_dest(ifh, BIT_ULL(port));  	ocelot_ifh_set_qos_class(ifh, qos_class);  	ocelot_ifh_set_tag_type(ifh, tag_type); diff --git a/drivers/net/ethernet/mscc/ocelot_ptp.c b/drivers/net/ethernet/mscc/ocelot_ptp.c index e172638b0601..808ce8e68d39 100644 --- a/drivers/net/ethernet/mscc/ocelot_ptp.c +++ b/drivers/net/ethernet/mscc/ocelot_ptp.c @@ -14,6 +14,8 @@  #include <soc/mscc/ocelot.h>  #include "ocelot.h" +#define OCELOT_PTP_TX_TSTAMP_TIMEOUT		(5 * HZ) +  int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts)  {  	struct ocelot *ocelot = container_of(ptp, struct ocelot, ptp_info); @@ -495,6 +497,28 @@ static int ocelot_traps_to_ptp_rx_filter(unsigned int proto)  	return HWTSTAMP_FILTER_NONE;  } +static int ocelot_ptp_tx_type_to_cmd(int tx_type, int *ptp_cmd) +{ +	switch (tx_type) { +	case HWTSTAMP_TX_ON: +		*ptp_cmd = IFH_REW_OP_TWO_STEP_PTP; +		break; +	case HWTSTAMP_TX_ONESTEP_SYNC: +		/* IFH_REW_OP_ONE_STEP_PTP updates the correctionField, +		 * what we need to update is the originTimestamp. +		 */ +		*ptp_cmd = IFH_REW_OP_ORIGIN_PTP; +		break; +	case HWTSTAMP_TX_OFF: +		*ptp_cmd = 0; +		break; +	default: +		return -ERANGE; +	} + +	return 0; +} +  int ocelot_hwstamp_get(struct ocelot *ocelot, int port, struct ifreq *ifr)  {  	struct ocelot_port *ocelot_port = ocelot->ports[port]; @@ -521,30 +545,19 @@ EXPORT_SYMBOL(ocelot_hwstamp_get);  int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr)  {  	struct ocelot_port *ocelot_port = ocelot->ports[port]; +	int ptp_cmd, old_ptp_cmd = ocelot_port->ptp_cmd;  	bool l2 = false, l4 = false;  	struct hwtstamp_config cfg; +	bool old_l2, old_l4;  	int err;  	if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))  		return -EFAULT;  	/* Tx type sanity check */ -	switch (cfg.tx_type) { -	case HWTSTAMP_TX_ON: -		ocelot_port->ptp_cmd = IFH_REW_OP_TWO_STEP_PTP; -		break; -	case HWTSTAMP_TX_ONESTEP_SYNC: -		/* IFH_REW_OP_ONE_STEP_PTP updates the correctional field, we -		 * need to update the origin time. -		 */ -		ocelot_port->ptp_cmd = IFH_REW_OP_ORIGIN_PTP; -		break; -	case HWTSTAMP_TX_OFF: -		ocelot_port->ptp_cmd = 0; -		break; -	default: -		return -ERANGE; -	} +	err = ocelot_ptp_tx_type_to_cmd(cfg.tx_type, &ptp_cmd); +	if (err) +		return err;  	switch (cfg.rx_filter) {  	case HWTSTAMP_FILTER_NONE: @@ -569,13 +582,27 @@ int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr)  		return -ERANGE;  	} +	old_l2 = ocelot_port->trap_proto & OCELOT_PROTO_PTP_L2; +	old_l4 = ocelot_port->trap_proto & OCELOT_PROTO_PTP_L4; +  	err = ocelot_setup_ptp_traps(ocelot, port, l2, l4);  	if (err)  		return err; +	ocelot_port->ptp_cmd = ptp_cmd; +  	cfg.rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto); -	return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; +	if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) { +		err = -EFAULT; +		goto out_restore_ptp_traps; +	} + +	return 0; +out_restore_ptp_traps: +	ocelot_setup_ptp_traps(ocelot, port, old_l2, old_l4); +	ocelot_port->ptp_cmd = old_ptp_cmd; +	return err;  }  EXPORT_SYMBOL(ocelot_hwstamp_set); @@ -603,34 +630,87 @@ int ocelot_get_ts_info(struct ocelot *ocelot, int port,  }  EXPORT_SYMBOL(ocelot_get_ts_info); -static int ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, int port, -					struct sk_buff *clone) +static struct sk_buff *ocelot_port_dequeue_ptp_tx_skb(struct ocelot *ocelot, +						      int port, u8 ts_id, +						      u32 seqid)  {  	struct ocelot_port *ocelot_port = ocelot->ports[port]; -	unsigned long flags; +	struct sk_buff *skb, *skb_tmp, *skb_match = NULL; +	struct ptp_header *hdr; -	spin_lock_irqsave(&ocelot->ts_id_lock, flags); +	spin_lock(&ocelot->ts_id_lock); -	if (ocelot_port->ptp_skbs_in_flight == OCELOT_MAX_PTP_ID || -	    ocelot->ptp_skbs_in_flight == OCELOT_PTP_FIFO_SIZE) { -		spin_unlock_irqrestore(&ocelot->ts_id_lock, flags); -		return -EBUSY; +	skb_queue_walk_safe(&ocelot_port->tx_skbs, skb, skb_tmp) { +		if (OCELOT_SKB_CB(skb)->ts_id != ts_id) +			continue; + +		/* Check that the timestamp ID is for the expected PTP +		 * sequenceId. We don't have to test ptp_parse_header() against +		 * NULL, because we've pre-validated the packet's ptp_class. +		 */ +		hdr = ptp_parse_header(skb, OCELOT_SKB_CB(skb)->ptp_class); +		if (seqid != ntohs(hdr->sequence_id)) +			continue; + +		__skb_unlink(skb, &ocelot_port->tx_skbs); +		ocelot->ptp_skbs_in_flight--; +		skb_match = skb; +		break;  	} -	skb_shinfo(clone)->tx_flags |= SKBTX_IN_PROGRESS; -	/* Store timestamp ID in OCELOT_SKB_CB(clone)->ts_id */ -	OCELOT_SKB_CB(clone)->ts_id = ocelot_port->ts_id; +	spin_unlock(&ocelot->ts_id_lock); -	ocelot_port->ts_id++; -	if (ocelot_port->ts_id == OCELOT_MAX_PTP_ID) -		ocelot_port->ts_id = 0; +	return skb_match; +} + +static int ocelot_port_queue_ptp_tx_skb(struct ocelot *ocelot, int port, +					struct sk_buff *clone) +{ +	struct ocelot_port *ocelot_port = ocelot->ports[port]; +	DECLARE_BITMAP(ts_id_in_flight, OCELOT_MAX_PTP_ID); +	struct sk_buff *skb, *skb_tmp; +	unsigned long n; + +	spin_lock(&ocelot->ts_id_lock); + +	/* To get a better chance of acquiring a timestamp ID, first flush the +	 * stale packets still waiting in the TX timestamping queue. They are +	 * probably lost. +	 */ +	skb_queue_walk_safe(&ocelot_port->tx_skbs, skb, skb_tmp) { +		if (time_before(OCELOT_SKB_CB(skb)->ptp_tx_time + +				OCELOT_PTP_TX_TSTAMP_TIMEOUT, jiffies)) { +			dev_warn_ratelimited(ocelot->dev, +					     "port %d invalidating stale timestamp ID %u which seems lost\n", +					     port, OCELOT_SKB_CB(skb)->ts_id); +			__skb_unlink(skb, &ocelot_port->tx_skbs); +			kfree_skb(skb); +			ocelot->ptp_skbs_in_flight--; +		} else { +			__set_bit(OCELOT_SKB_CB(skb)->ts_id, ts_id_in_flight); +		} +	} + +	if (ocelot->ptp_skbs_in_flight == OCELOT_PTP_FIFO_SIZE) { +		spin_unlock(&ocelot->ts_id_lock); +		return -EBUSY; +	} + +	n = find_first_zero_bit(ts_id_in_flight, OCELOT_MAX_PTP_ID); +	if (n == OCELOT_MAX_PTP_ID) { +		spin_unlock(&ocelot->ts_id_lock); +		return -EBUSY; +	} -	ocelot_port->ptp_skbs_in_flight++; +	/* Found an available timestamp ID, use it */ +	OCELOT_SKB_CB(clone)->ts_id = n; +	OCELOT_SKB_CB(clone)->ptp_tx_time = jiffies;  	ocelot->ptp_skbs_in_flight++; +	__skb_queue_tail(&ocelot_port->tx_skbs, clone); -	skb_queue_tail(&ocelot_port->tx_skbs, clone); +	spin_unlock(&ocelot->ts_id_lock); -	spin_unlock_irqrestore(&ocelot->ts_id_lock, flags); +	dev_dbg_ratelimited(ocelot->dev, "port %d timestamp id %lu\n", port, n);  	return 0;  } @@ -687,10 +767,14 @@ int ocelot_port_txtstamp_request(struct ocelot *ocelot, int port,  		if (!(*clone))  			return -ENOMEM; -		err = ocelot_port_add_txtstamp_skb(ocelot, port, *clone); -		if (err) +		/* Store timestamp ID in OCELOT_SKB_CB(clone)->ts_id */ +		err = ocelot_port_queue_ptp_tx_skb(ocelot, port, *clone); +		if (err) { +			kfree_skb(*clone);  			return err; +		} +		skb_shinfo(*clone)->tx_flags |= SKBTX_IN_PROGRESS;  		OCELOT_SKB_CB(skb)->ptp_cmd = ptp_cmd;  		OCELOT_SKB_CB(*clone)->ptp_class = ptp_class;  	} @@ -726,28 +810,15 @@ static void ocelot_get_hwtimestamp(struct ocelot *ocelot,  	spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);  } -static bool ocelot_validate_ptp_skb(struct sk_buff *clone, u16 seqid) -{ -	struct ptp_header *hdr; - -	hdr = ptp_parse_header(clone, OCELOT_SKB_CB(clone)->ptp_class); -	if (WARN_ON(!hdr)) -		return false; - -	return seqid == ntohs(hdr->sequence_id); -} -  void ocelot_get_txtstamp(struct ocelot *ocelot)  {  	int budget = OCELOT_PTP_QUEUE_SZ;  	while (budget--) { -		struct sk_buff *skb, *skb_tmp, *skb_match = NULL;  		struct skb_shared_hwtstamps shhwtstamps;  		u32 val, id, seqid, txport; -		struct ocelot_port *port; +		struct sk_buff *skb_match;  		struct timespec64 ts; -		unsigned long flags;  		val = ocelot_read(ocelot, SYS_PTP_STATUS); @@ -762,36 +833,14 @@ void ocelot_get_txtstamp(struct ocelot *ocelot)  		txport = SYS_PTP_STATUS_PTP_MESS_TXPORT_X(val);  		seqid = SYS_PTP_STATUS_PTP_MESS_SEQ_ID(val); -		port = ocelot->ports[txport]; - -		spin_lock(&ocelot->ts_id_lock); -		port->ptp_skbs_in_flight--; -		ocelot->ptp_skbs_in_flight--; -		spin_unlock(&ocelot->ts_id_lock); -  		/* Retrieve its associated skb */ -try_again: -		spin_lock_irqsave(&port->tx_skbs.lock, flags); - -		skb_queue_walk_safe(&port->tx_skbs, skb, skb_tmp) { -			if (OCELOT_SKB_CB(skb)->ts_id != id) -				continue; -			__skb_unlink(skb, &port->tx_skbs); -			skb_match = skb; -			break; -		} - -		spin_unlock_irqrestore(&port->tx_skbs.lock, flags); - -		if (WARN_ON(!skb_match)) -			continue; - -		if (!ocelot_validate_ptp_skb(skb_match, seqid)) { -			dev_err_ratelimited(ocelot->dev, -					    "port %d received stale TX timestamp for seqid %d, discarding\n", -					    txport, seqid); -			dev_kfree_skb_any(skb); -			goto try_again; +		skb_match = ocelot_port_dequeue_ptp_tx_skb(ocelot, txport, id, +							   seqid); +		if (!skb_match) { +			dev_warn_ratelimited(ocelot->dev, +					     "port %d received TX timestamp (seqid %d, ts id %u) for packet previously declared stale\n", +					     txport, seqid, id); +			goto next_ts;  		}  		/* Get the h/w timestamp */ @@ -802,7 +851,7 @@ try_again:  		shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);  		skb_complete_tx_timestamp(skb_match, &shhwtstamps); -		/* Next ts */ +next_ts:  		ocelot_write(ocelot, SYS_PTP_NXT_PTP_NXT, SYS_PTP_NXT);  	}  } diff --git a/drivers/net/ethernet/netronome/nfp/bpf/offload.c b/drivers/net/ethernet/netronome/nfp/bpf/offload.c index 9d97cd281f18..c03558adda91 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/offload.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/offload.c @@ -458,7 +458,8 @@ int nfp_bpf_event_output(struct nfp_app_bpf *bpf, const void *data,  	map_id_full = be64_to_cpu(cbe->map_ptr);  	map_id = map_id_full; -	if (len < sizeof(struct cmsg_bpf_event) + pkt_size + data_size) +	if (size_add(pkt_size, data_size) > INT_MAX || +	    len < sizeof(struct cmsg_bpf_event) + pkt_size + data_size)  		return -EINVAL;  	if (cbe->hdr.ver != NFP_CCM_ABI_VERSION)  		return -EINVAL; diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c index f9c0dcd965c2..db200e4ec284 100644 --- a/drivers/net/ethernet/oa_tc6.c +++ b/drivers/net/ethernet/oa_tc6.c @@ -113,6 +113,7 @@ struct oa_tc6 {  	struct mii_bus *mdiobus;  	struct spi_device *spi;  	struct mutex spi_ctrl_lock; /* Protects spi control transfer */ +	spinlock_t tx_skb_lock; /* Protects tx skb handling */  	void *spi_ctrl_tx_buf;  	void *spi_ctrl_rx_buf;  	void *spi_data_tx_buf; @@ -1004,8 +1005,10 @@ static u16 oa_tc6_prepare_spi_tx_buf_for_tx_skbs(struct oa_tc6 *tc6)  	for (used_tx_credits = 0; used_tx_credits < tc6->tx_credits;  	     used_tx_credits++) {  		if (!tc6->ongoing_tx_skb) { +			spin_lock_bh(&tc6->tx_skb_lock);  			tc6->ongoing_tx_skb = tc6->waiting_tx_skb;  			tc6->waiting_tx_skb = NULL; +			spin_unlock_bh(&tc6->tx_skb_lock);  		}  		if (!tc6->ongoing_tx_skb)  			break; @@ -1111,8 +1114,9 @@ static int oa_tc6_spi_thread_handler(void *data)  		/* This kthread will be waken up if there is a tx skb or mac-phy  		 * interrupt to perform spi transfer with tx chunks.  		 */ -		wait_event_interruptible(tc6->spi_wq, tc6->waiting_tx_skb || -					 tc6->int_flag || +		wait_event_interruptible(tc6->spi_wq, tc6->int_flag || +					 (tc6->waiting_tx_skb && +					 tc6->tx_credits) ||  					 kthread_should_stop());  		if (kthread_should_stop()) @@ -1209,7 +1213,9 @@ netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)  		return NETDEV_TX_OK;  	} +	spin_lock_bh(&tc6->tx_skb_lock);  	tc6->waiting_tx_skb = skb; +	spin_unlock_bh(&tc6->tx_skb_lock);  	/* Wake spi kthread to perform spi transfer */  	wake_up_interruptible(&tc6->spi_wq); @@ -1239,6 +1245,7 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)  	tc6->netdev = netdev;  	SET_NETDEV_DEV(netdev, &spi->dev);  	mutex_init(&tc6->spi_ctrl_lock); +	spin_lock_init(&tc6->tx_skb_lock);  	/* Set the SPI controller to pump at realtime priority */  	tc6->spi->rt = true; diff --git a/drivers/net/ethernet/pensando/ionic/ionic_dev.c b/drivers/net/ethernet/pensando/ionic/ionic_dev.c index 9e42d599840d..57edcde9e6f8 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_dev.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_dev.c @@ -277,7 +277,10 @@ void ionic_dev_teardown(struct ionic *ionic)  	idev->phy_cmb_pages = 0;  	idev->cmb_npages = 0; -	destroy_workqueue(ionic->wq); +	if (ionic->wq) { +		destroy_workqueue(ionic->wq); +		ionic->wq = NULL; +	}  	mutex_destroy(&idev->cmb_inuse_lock);  } diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c index dda22fa4448c..9b7f78b6cdb1 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c @@ -961,8 +961,8 @@ static int ionic_get_module_eeprom(struct net_device *netdev,  	len = min_t(u32, sizeof(xcvr->sprom), ee->len);  	do { -		memcpy(data, xcvr->sprom, len); -		memcpy(tbuf, xcvr->sprom, len); +		memcpy(data, &xcvr->sprom[ee->offset], len); +		memcpy(tbuf, &xcvr->sprom[ee->offset], len);  		/* Let's make sure we got a consistent copy */  		if (!memcmp(data, tbuf, len)) diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c index 40496587b2b3..3d3f936779f7 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c @@ -3869,8 +3869,8 @@ int ionic_lif_register(struct ionic_lif *lif)  	/* only register LIF0 for now */  	err = register_netdev(lif->netdev);  	if (err) { -		dev_err(lif->ionic->dev, "Cannot register net device, aborting\n"); -		ionic_lif_unregister_phc(lif); +		dev_err(lif->ionic->dev, "Cannot register net device: %d, aborting\n", err); +		ionic_lif_unregister(lif);  		return err;  	} diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c index 26a714bfad4e..c7f497c36f66 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c +++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c @@ -3301,7 +3301,9 @@ int qed_mcp_bist_nvm_get_num_images(struct qed_hwfn *p_hwfn,  	if (rc)  		return rc; -	if (((rsp & FW_MSG_CODE_MASK) != FW_MSG_CODE_OK)) +	if (((rsp & FW_MSG_CODE_MASK) == FW_MSG_CODE_UNSUPPORTED)) +		rc = -EOPNOTSUPP; +	else if (((rsp & FW_MSG_CODE_MASK) != FW_MSG_CODE_OK))  		rc = -EINVAL;  	return rc; @@ -3356,6 +3358,7 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)  					     p_ptt, &nvm_info.num_images);  	if (rc == -EOPNOTSUPP) {  		DP_INFO(p_hwfn, "DRV_MSG_CODE_BIST_TEST is not supported\n"); +		nvm_info.num_images = 0;  		goto out;  	} else if (rc || !nvm_info.num_images) {  		DP_ERR(p_hwfn, "Failed getting number of images\n"); diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c index ef9c02b000e4..38a779f4b866 100644 --- a/drivers/net/ethernet/qualcomm/qca_spi.c +++ b/drivers/net/ethernet/qualcomm/qca_spi.c @@ -54,7 +54,7 @@ MODULE_PARM_DESC(qcaspi_burst_len, "Number of data bytes per burst. Use 1-5000."  #define QCASPI_PLUGGABLE_MIN 0  #define QCASPI_PLUGGABLE_MAX 1 -static int qcaspi_pluggable = QCASPI_PLUGGABLE_MIN; +static int qcaspi_pluggable = QCASPI_PLUGGABLE_MAX;  module_param(qcaspi_pluggable, int, 0);  MODULE_PARM_DESC(qcaspi_pluggable, "Pluggable SPI connection (yes/no)."); @@ -818,7 +818,6 @@ qcaspi_netdev_init(struct net_device *dev)  	dev->mtu = QCAFRM_MAX_MTU;  	dev->type = ARPHRD_ETHER; -	qca->clkspeed = qcaspi_clkspeed;  	qca->burst_len = qcaspi_burst_len;  	qca->spi_thread = NULL;  	qca->buffer_size = (QCAFRM_MAX_MTU + VLAN_ETH_HLEN + QCAFRM_HEADER_LEN + @@ -909,17 +908,15 @@ qca_spi_probe(struct spi_device *spi)  	legacy_mode = of_property_read_bool(spi->dev.of_node,  					    "qca,legacy-mode"); -	if (qcaspi_clkspeed == 0) { -		if (spi->max_speed_hz) -			qcaspi_clkspeed = spi->max_speed_hz; -		else -			qcaspi_clkspeed = QCASPI_CLK_SPEED; -	} +	if (qcaspi_clkspeed) +		spi->max_speed_hz = qcaspi_clkspeed; +	else if (!spi->max_speed_hz) +		spi->max_speed_hz = QCASPI_CLK_SPEED; -	if ((qcaspi_clkspeed < QCASPI_CLK_SPEED_MIN) || -	    (qcaspi_clkspeed > QCASPI_CLK_SPEED_MAX)) { -		dev_err(&spi->dev, "Invalid clkspeed: %d\n", -			qcaspi_clkspeed); +	if (spi->max_speed_hz < QCASPI_CLK_SPEED_MIN || +	    spi->max_speed_hz > QCASPI_CLK_SPEED_MAX) { +		dev_err(&spi->dev, "Invalid clkspeed: %u\n", +			spi->max_speed_hz);  		return -EINVAL;  	} @@ -944,14 +941,13 @@ qca_spi_probe(struct spi_device *spi)  		return -EINVAL;  	} -	dev_info(&spi->dev, "ver=%s, clkspeed=%d, burst_len=%d, pluggable=%d\n", +	dev_info(&spi->dev, "ver=%s, clkspeed=%u, burst_len=%d, pluggable=%d\n",  		 QCASPI_DRV_VERSION, -		 qcaspi_clkspeed, +		 spi->max_speed_hz,  		 qcaspi_burst_len,  		 qcaspi_pluggable);  	spi->mode = SPI_MODE_3; -	spi->max_speed_hz = qcaspi_clkspeed;  	if (spi_setup(spi) < 0) {  		dev_err(&spi->dev, "Unable to setup SPI device\n");  		return -EFAULT; diff --git a/drivers/net/ethernet/qualcomm/qca_spi.h b/drivers/net/ethernet/qualcomm/qca_spi.h index 7ba5c9e2f61c..90b290f94c27 100644 --- a/drivers/net/ethernet/qualcomm/qca_spi.h +++ b/drivers/net/ethernet/qualcomm/qca_spi.h @@ -89,7 +89,6 @@ struct qcaspi {  #endif  	/* user configurable options */ -	u32 clkspeed;  	u8 legacy_mode;  	u16 burst_len;  }; diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 739707a7b40f..8a3959bb2360 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -16,7 +16,6 @@  #include <linux/clk.h>  #include <linux/delay.h>  #include <linux/ethtool.h> -#include <linux/hwmon.h>  #include <linux/phy.h>  #include <linux/if_vlan.h>  #include <linux/in.h> @@ -5347,43 +5346,6 @@ static bool rtl_aspm_is_safe(struct rtl8169_private *tp)  	return false;  } -static umode_t r8169_hwmon_is_visible(const void *drvdata, -				      enum hwmon_sensor_types type, -				      u32 attr, int channel) -{ -	return 0444; -} - -static int r8169_hwmon_read(struct device *dev, enum hwmon_sensor_types type, -			    u32 attr, int channel, long *val) -{ -	struct rtl8169_private *tp = dev_get_drvdata(dev); -	int val_raw; - -	val_raw = phy_read_paged(tp->phydev, 0xbd8, 0x12) & 0x3ff; -	if (val_raw >= 512) -		val_raw -= 1024; - -	*val = 1000 * val_raw / 2; - -	return 0; -} - -static const struct hwmon_ops r8169_hwmon_ops = { -	.is_visible =  r8169_hwmon_is_visible, -	.read = r8169_hwmon_read, -}; - -static const struct hwmon_channel_info * const r8169_hwmon_info[] = { -	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT), -	NULL -}; - -static const struct hwmon_chip_info r8169_hwmon_chip_info = { -	.ops = &r8169_hwmon_ops, -	.info = r8169_hwmon_info, -}; -  static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	struct rtl8169_private *tp; @@ -5563,12 +5525,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (rc)  		return rc; -	/* The temperature sensor is available from RTl8125B */ -	if (IS_REACHABLE(CONFIG_HWMON) && tp->mac_version >= RTL_GIGA_MAC_VER_63) -		/* ignore errors */ -		devm_hwmon_device_register_with_info(&pdev->dev, "nic_temp", tp, -						     &r8169_hwmon_chip_info, -						     NULL);  	rc = register_netdev(dev);  	if (rc)  		return rc; diff --git a/drivers/net/ethernet/realtek/rtase/rtase_main.c b/drivers/net/ethernet/realtek/rtase/rtase_main.c index de7f11232593..c42c0516656b 100644 --- a/drivers/net/ethernet/realtek/rtase/rtase_main.c +++ b/drivers/net/ethernet/realtek/rtase/rtase_main.c @@ -1827,7 +1827,7 @@ static int rtase_alloc_msix(struct pci_dev *pdev, struct rtase_private *tp)  	for (i = 0; i < tp->int_nums; i++) {  		irq = pci_irq_vector(pdev, i); -		if (!irq) { +		if (irq < 0) {  			pci_disable_msix(pdev);  			return irq;  		} diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c index ac0f093f647a..bc395294a32d 100644 --- a/drivers/net/ethernet/renesas/ravb_main.c +++ b/drivers/net/ethernet/renesas/ravb_main.c @@ -2763,6 +2763,7 @@ static const struct ravb_hw_info ravb_rzv2m_hw_info = {  	.net_features = NETIF_F_RXCSUM,  	.stats_len = ARRAY_SIZE(ravb_gstrings_stats),  	.tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3, +	.tx_max_frame_size = SZ_2K,  	.rx_max_frame_size = SZ_2K,  	.rx_buffer_size = SZ_2K +  			  SKB_DATA_ALIGN(sizeof(struct skb_shared_info)), diff --git a/drivers/net/ethernet/renesas/rswitch.c b/drivers/net/ethernet/renesas/rswitch.c index 8d18dae4d8fb..9ac6e2aad18f 100644 --- a/drivers/net/ethernet/renesas/rswitch.c +++ b/drivers/net/ethernet/renesas/rswitch.c @@ -547,7 +547,6 @@ static int rswitch_gwca_ts_queue_alloc(struct rswitch_private *priv)  	desc = &gq->ts_ring[gq->ring_size];  	desc->desc.die_dt = DT_LINKFIX;  	rswitch_desc_set_dptr(&desc->desc, gq->ring_dma); -	INIT_LIST_HEAD(&priv->gwca.ts_info_list);  	return 0;  } @@ -862,13 +861,10 @@ static void rswitch_tx_free(struct net_device *ndev)  	struct rswitch_ext_desc *desc;  	struct sk_buff *skb; -	for (; rswitch_get_num_cur_queues(gq) > 0; -	     gq->dirty = rswitch_next_queue_index(gq, false, 1)) { -		desc = &gq->tx_ring[gq->dirty]; -		if ((desc->desc.die_dt & DT_MASK) != DT_FEMPTY) -			break; - +	desc = &gq->tx_ring[gq->dirty]; +	while ((desc->desc.die_dt & DT_MASK) == DT_FEMPTY) {  		dma_rmb(); +  		skb = gq->skbs[gq->dirty];  		if (skb) {  			rdev->ndev->stats.tx_packets++; @@ -879,7 +875,10 @@ static void rswitch_tx_free(struct net_device *ndev)  			dev_kfree_skb_any(gq->skbs[gq->dirty]);  			gq->skbs[gq->dirty] = NULL;  		} +  		desc->desc.die_dt = DT_EEMPTY; +		gq->dirty = rswitch_next_queue_index(gq, false, 1); +		desc = &gq->tx_ring[gq->dirty];  	}  } @@ -908,8 +907,10 @@ retry:  	if (napi_complete_done(napi, budget - quota)) {  		spin_lock_irqsave(&priv->lock, flags); -		rswitch_enadis_data_irq(priv, rdev->tx_queue->index, true); -		rswitch_enadis_data_irq(priv, rdev->rx_queue->index, true); +		if (test_bit(rdev->port, priv->opened_ports)) { +			rswitch_enadis_data_irq(priv, rdev->tx_queue->index, true); +			rswitch_enadis_data_irq(priv, rdev->rx_queue->index, true); +		}  		spin_unlock_irqrestore(&priv->lock, flags);  	} @@ -1001,9 +1002,10 @@ static int rswitch_gwca_request_irqs(struct rswitch_private *priv)  static void rswitch_ts(struct rswitch_private *priv)  {  	struct rswitch_gwca_queue *gq = &priv->gwca.ts_queue; -	struct rswitch_gwca_ts_info *ts_info, *ts_info2;  	struct skb_shared_hwtstamps shhwtstamps;  	struct rswitch_ts_desc *desc; +	struct rswitch_device *rdev; +	struct sk_buff *ts_skb;  	struct timespec64 ts;  	unsigned int num;  	u32 tag, port; @@ -1013,23 +1015,28 @@ static void rswitch_ts(struct rswitch_private *priv)  		dma_rmb();  		port = TS_DESC_DPN(__le32_to_cpu(desc->desc.dptrl)); -		tag = TS_DESC_TSUN(__le32_to_cpu(desc->desc.dptrl)); - -		list_for_each_entry_safe(ts_info, ts_info2, &priv->gwca.ts_info_list, list) { -			if (!(ts_info->port == port && ts_info->tag == tag)) -				continue; - -			memset(&shhwtstamps, 0, sizeof(shhwtstamps)); -			ts.tv_sec = __le32_to_cpu(desc->ts_sec); -			ts.tv_nsec = __le32_to_cpu(desc->ts_nsec & cpu_to_le32(0x3fffffff)); -			shhwtstamps.hwtstamp = timespec64_to_ktime(ts); -			skb_tstamp_tx(ts_info->skb, &shhwtstamps); -			dev_consume_skb_irq(ts_info->skb); -			list_del(&ts_info->list); -			kfree(ts_info); -			break; -		} +		if (unlikely(port >= RSWITCH_NUM_PORTS)) +			goto next; +		rdev = priv->rdev[port]; +		tag = TS_DESC_TSUN(__le32_to_cpu(desc->desc.dptrl)); +		if (unlikely(tag >= TS_TAGS_PER_PORT)) +			goto next; +		ts_skb = xchg(&rdev->ts_skb[tag], NULL); +		smp_mb(); /* order rdev->ts_skb[] read before bitmap update */ +		clear_bit(tag, rdev->ts_skb_used); + +		if (unlikely(!ts_skb)) +			goto next; + +		memset(&shhwtstamps, 0, sizeof(shhwtstamps)); +		ts.tv_sec = __le32_to_cpu(desc->ts_sec); +		ts.tv_nsec = __le32_to_cpu(desc->ts_nsec & cpu_to_le32(0x3fffffff)); +		shhwtstamps.hwtstamp = timespec64_to_ktime(ts); +		skb_tstamp_tx(ts_skb, &shhwtstamps); +		dev_consume_skb_irq(ts_skb); + +next:  		gq->cur = rswitch_next_queue_index(gq, true, 1);  		desc = &gq->ts_ring[gq->cur];  	} @@ -1114,25 +1121,40 @@ static int rswitch_etha_wait_link_verification(struct rswitch_etha *etha)  static void rswitch_rmac_setting(struct rswitch_etha *etha, const u8 *mac)  { -	u32 val; +	u32 pis, lsc;  	rswitch_etha_write_mac_address(etha, mac); +	switch (etha->phy_interface) { +	case PHY_INTERFACE_MODE_SGMII: +		pis = MPIC_PIS_GMII; +		break; +	case PHY_INTERFACE_MODE_USXGMII: +	case PHY_INTERFACE_MODE_5GBASER: +		pis = MPIC_PIS_XGMII; +		break; +	default: +		pis = FIELD_GET(MPIC_PIS, ioread32(etha->addr + MPIC)); +		break; +	} +  	switch (etha->speed) {  	case 100: -		val = MPIC_LSC_100M; +		lsc = MPIC_LSC_100M;  		break;  	case 1000: -		val = MPIC_LSC_1G; +		lsc = MPIC_LSC_1G;  		break;  	case 2500: -		val = MPIC_LSC_2_5G; +		lsc = MPIC_LSC_2_5G;  		break;  	default: -		return; +		lsc = FIELD_GET(MPIC_LSC, ioread32(etha->addr + MPIC)); +		break;  	} -	iowrite32(MPIC_PIS_GMII | val, etha->addr + MPIC); +	rswitch_modify(etha->addr, MPIC, MPIC_PIS | MPIC_LSC, +		       FIELD_PREP(MPIC_PIS, pis) | FIELD_PREP(MPIC_LSC, lsc));  }  static void rswitch_etha_enable_mii(struct rswitch_etha *etha) @@ -1538,20 +1560,20 @@ static int rswitch_open(struct net_device *ndev)  	struct rswitch_device *rdev = netdev_priv(ndev);  	unsigned long flags; -	phy_start(ndev->phydev); +	if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) +		iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDIE);  	napi_enable(&rdev->napi); -	netif_start_queue(ndev);  	spin_lock_irqsave(&rdev->priv->lock, flags); +	bitmap_set(rdev->priv->opened_ports, rdev->port, 1);  	rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, true);  	rswitch_enadis_data_irq(rdev->priv, rdev->rx_queue->index, true);  	spin_unlock_irqrestore(&rdev->priv->lock, flags); -	if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) -		iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDIE); +	phy_start(ndev->phydev); -	bitmap_set(rdev->priv->opened_ports, rdev->port, 1); +	netif_start_queue(ndev);  	return 0;  }; @@ -1559,31 +1581,34 @@ static int rswitch_open(struct net_device *ndev)  static int rswitch_stop(struct net_device *ndev)  {  	struct rswitch_device *rdev = netdev_priv(ndev); -	struct rswitch_gwca_ts_info *ts_info, *ts_info2; +	struct sk_buff *ts_skb;  	unsigned long flags; +	unsigned int tag;  	netif_tx_stop_all_queues(ndev); -	bitmap_clear(rdev->priv->opened_ports, rdev->port, 1); - -	if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) -		iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID); -	list_for_each_entry_safe(ts_info, ts_info2, &rdev->priv->gwca.ts_info_list, list) { -		if (ts_info->port != rdev->port) -			continue; -		dev_kfree_skb_irq(ts_info->skb); -		list_del(&ts_info->list); -		kfree(ts_info); -	} +	phy_stop(ndev->phydev);  	spin_lock_irqsave(&rdev->priv->lock, flags);  	rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, false);  	rswitch_enadis_data_irq(rdev->priv, rdev->rx_queue->index, false); +	bitmap_clear(rdev->priv->opened_ports, rdev->port, 1);  	spin_unlock_irqrestore(&rdev->priv->lock, flags); -	phy_stop(ndev->phydev);  	napi_disable(&rdev->napi); +	if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) +		iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID); + +	for (tag = find_first_bit(rdev->ts_skb_used, TS_TAGS_PER_PORT); +	     tag < TS_TAGS_PER_PORT; +	     tag = find_next_bit(rdev->ts_skb_used, TS_TAGS_PER_PORT, tag + 1)) { +		ts_skb = xchg(&rdev->ts_skb[tag], NULL); +		clear_bit(tag, rdev->ts_skb_used); +		if (ts_skb) +			dev_kfree_skb(ts_skb); +	} +  	return 0;  }; @@ -1594,20 +1619,17 @@ static bool rswitch_ext_desc_set_info1(struct rswitch_device *rdev,  	desc->info1 = cpu_to_le64(INFO1_DV(BIT(rdev->etha->index)) |  				  INFO1_IPV(GWCA_IPV_NUM) | INFO1_FMT);  	if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { -		struct rswitch_gwca_ts_info *ts_info; +		unsigned int tag; -		ts_info = kzalloc(sizeof(*ts_info), GFP_ATOMIC); -		if (!ts_info) +		tag = find_first_zero_bit(rdev->ts_skb_used, TS_TAGS_PER_PORT); +		if (tag == TS_TAGS_PER_PORT)  			return false; +		smp_mb(); /* order bitmap read before rdev->ts_skb[] write */ +		rdev->ts_skb[tag] = skb_get(skb); +		set_bit(tag, rdev->ts_skb_used);  		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; -		rdev->ts_tag++; -		desc->info1 |= cpu_to_le64(INFO1_TSUN(rdev->ts_tag) | INFO1_TXC); - -		ts_info->skb = skb_get(skb); -		ts_info->port = rdev->port; -		ts_info->tag = rdev->ts_tag; -		list_add_tail(&ts_info->list, &rdev->priv->gwca.ts_info_list); +		desc->info1 |= cpu_to_le64(INFO1_TSUN(tag) | INFO1_TXC);  		skb_tx_timestamp(skb);  	} @@ -1681,8 +1703,11 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd  	if (dma_mapping_error(ndev->dev.parent, dma_addr_orig))  		goto err_kfree; -	gq->skbs[gq->cur] = skb; -	gq->unmap_addrs[gq->cur] = dma_addr_orig; +	/* Stored the skb at the last descriptor to avoid skb free before hardware completes send */ +	gq->skbs[(gq->cur + nr_desc - 1) % gq->ring_size] = skb; +	gq->unmap_addrs[(gq->cur + nr_desc - 1) % gq->ring_size] = dma_addr_orig; + +	dma_wmb();  	/* DT_FSTART should be set at last. So, this is reverse order. */  	for (i = nr_desc; i-- > 0; ) { @@ -1694,14 +1719,13 @@ static netdev_tx_t rswitch_start_xmit(struct sk_buff *skb, struct net_device *nd  			goto err_unmap;  	} -	wmb();	/* gq->cur must be incremented after die_dt was set */ -  	gq->cur = rswitch_next_queue_index(gq, true, nr_desc);  	rswitch_modify(rdev->addr, GWTRC(gq->index), 0, BIT(gq->index % 32));  	return ret;  err_unmap: +	gq->skbs[(gq->cur + nr_desc - 1) % gq->ring_size] = NULL;  	dma_unmap_single(ndev->dev.parent, dma_addr_orig, skb->len, DMA_TO_DEVICE);  err_kfree: @@ -1889,7 +1913,6 @@ static int rswitch_device_alloc(struct rswitch_private *priv, unsigned int index  	rdev->np_port = rswitch_get_port_node(rdev);  	rdev->disabled = !rdev->np_port;  	err = of_get_ethdev_address(rdev->np_port, ndev); -	of_node_put(rdev->np_port);  	if (err) {  		if (is_valid_ether_addr(rdev->etha->mac_addr))  			eth_hw_addr_set(ndev, rdev->etha->mac_addr); @@ -1919,6 +1942,7 @@ out_txdmac:  out_rxdmac:  out_get_params: +	of_node_put(rdev->np_port);  	netif_napi_del(&rdev->napi);  	free_netdev(ndev); @@ -1932,6 +1956,7 @@ static void rswitch_device_free(struct rswitch_private *priv, unsigned int index  	rswitch_txdmac_free(ndev);  	rswitch_rxdmac_free(ndev); +	of_node_put(rdev->np_port);  	netif_napi_del(&rdev->napi);  	free_netdev(ndev);  } diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/renesas/rswitch.h index 72e3ff596d31..d8d4ed7d7f8b 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -724,13 +724,13 @@ enum rswitch_etha_mode {  #define EAVCC_VEM_SC_TAG	(0x3 << 16) -#define MPIC_PIS_MII		0x00 -#define MPIC_PIS_GMII		0x02 -#define MPIC_PIS_XGMII		0x04 -#define MPIC_LSC_SHIFT		3 -#define MPIC_LSC_100M		(1 << MPIC_LSC_SHIFT) -#define MPIC_LSC_1G		(2 << MPIC_LSC_SHIFT) -#define MPIC_LSC_2_5G		(3 << MPIC_LSC_SHIFT) +#define MPIC_PIS		GENMASK(2, 0) +#define MPIC_PIS_GMII		2 +#define MPIC_PIS_XGMII		4 +#define MPIC_LSC		GENMASK(5, 3) +#define MPIC_LSC_100M		1 +#define MPIC_LSC_1G		2 +#define MPIC_LSC_2_5G		3  #define MDIO_READ_C45		0x03  #define MDIO_WRITE_C45		0x01 @@ -972,14 +972,6 @@ struct rswitch_gwca_queue {  	};  }; -struct rswitch_gwca_ts_info { -	struct sk_buff *skb; -	struct list_head list; - -	int port; -	u8 tag; -}; -  #define RSWITCH_NUM_IRQ_REGS	(RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32))  struct rswitch_gwca {  	unsigned int index; @@ -989,7 +981,6 @@ struct rswitch_gwca {  	struct rswitch_gwca_queue *queues;  	int num_queues;  	struct rswitch_gwca_queue ts_queue; -	struct list_head ts_info_list;  	DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES);  	u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS];  	u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS]; @@ -997,6 +988,7 @@ struct rswitch_gwca {  };  #define NUM_QUEUES_PER_NDEV	2 +#define TS_TAGS_PER_PORT	256  struct rswitch_device {  	struct rswitch_private *priv;  	struct net_device *ndev; @@ -1004,7 +996,8 @@ struct rswitch_device {  	void __iomem *addr;  	struct rswitch_gwca_queue *tx_queue;  	struct rswitch_gwca_queue *rx_queue; -	u8 ts_tag; +	struct sk_buff *ts_skb[TS_TAGS_PER_PORT]; +	DECLARE_BITMAP(ts_skb_used, TS_TAGS_PER_PORT);  	bool disabled;  	int port; diff --git a/drivers/net/ethernet/sfc/tc_conntrack.c b/drivers/net/ethernet/sfc/tc_conntrack.c index d90206f27161..c0603f54cec3 100644 --- a/drivers/net/ethernet/sfc/tc_conntrack.c +++ b/drivers/net/ethernet/sfc/tc_conntrack.c @@ -16,7 +16,7 @@ static int efx_tc_flow_block(enum tc_setup_type type, void *type_data,  			     void *cb_priv);  static const struct rhashtable_params efx_tc_ct_zone_ht_params = { -	.key_len	= offsetof(struct efx_tc_ct_zone, linkage), +	.key_len	= sizeof_field(struct efx_tc_ct_zone, zone),  	.key_offset	= 0,  	.head_offset	= offsetof(struct efx_tc_ct_zone, linkage),  }; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c index 3827997d2132..dc903b846b1b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-tegra.c @@ -1,4 +1,5 @@  // SPDX-License-Identifier: GPL-2.0-only +#include <linux/iommu.h>  #include <linux/platform_device.h>  #include <linux/of.h>  #include <linux/module.h> @@ -19,6 +20,8 @@ struct tegra_mgbe {  	struct reset_control *rst_mac;  	struct reset_control *rst_pcs; +	u32 iommu_sid; +  	void __iomem *hv;  	void __iomem *regs;  	void __iomem *xpcs; @@ -50,7 +53,6 @@ struct tegra_mgbe {  #define MGBE_WRAP_COMMON_INTR_ENABLE	0x8704  #define MAC_SBD_INTR			BIT(2)  #define MGBE_WRAP_AXI_ASID0_CTRL	0x8400 -#define MGBE_SID			0x6  static int __maybe_unused tegra_mgbe_suspend(struct device *dev)  { @@ -84,7 +86,7 @@ static int __maybe_unused tegra_mgbe_resume(struct device *dev)  	writel(MAC_SBD_INTR, mgbe->regs + MGBE_WRAP_COMMON_INTR_ENABLE);  	/* Program SID */ -	writel(MGBE_SID, mgbe->hv + MGBE_WRAP_AXI_ASID0_CTRL); +	writel(mgbe->iommu_sid, mgbe->hv + MGBE_WRAP_AXI_ASID0_CTRL);  	value = readl(mgbe->xpcs + XPCS_WRAP_UPHY_STATUS);  	if ((value & XPCS_WRAP_UPHY_STATUS_TX_P_UP) == 0) { @@ -241,6 +243,12 @@ static int tegra_mgbe_probe(struct platform_device *pdev)  	if (IS_ERR(mgbe->xpcs))  		return PTR_ERR(mgbe->xpcs); +	/* get controller's stream id from iommu property in device tree */ +	if (!tegra_dev_iommu_get_stream_id(mgbe->dev, &mgbe->iommu_sid)) { +		dev_err(mgbe->dev, "failed to get iommu stream id\n"); +		return -EINVAL; +	} +  	res.addr = mgbe->regs;  	res.irq = irq; @@ -346,7 +354,7 @@ static int tegra_mgbe_probe(struct platform_device *pdev)  	writel(MAC_SBD_INTR, mgbe->regs + MGBE_WRAP_COMMON_INTR_ENABLE);  	/* Program SID */ -	writel(MGBE_SID, mgbe->hv + MGBE_WRAP_AXI_ASID0_CTRL); +	writel(mgbe->iommu_sid, mgbe->hv + MGBE_WRAP_AXI_ASID0_CTRL);  	plat->flags |= STMMAC_FLAG_SERDES_UP_AFTER_PHY_LINKUP; diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 9b262cdad60b..c81ea8cdfe6e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -4192,8 +4192,8 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)  	struct stmmac_txq_stats *txq_stats;  	struct stmmac_tx_queue *tx_q;  	u32 pay_len, mss, queue; +	dma_addr_t tso_des, des;  	u8 proto_hdr_len, hdr; -	dma_addr_t des;  	bool set_ic;  	int i; @@ -4289,14 +4289,15 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)  		/* If needed take extra descriptors to fill the remaining payload */  		tmp_pay_len = pay_len - TSO_MAX_BUFF_SIZE; +		tso_des = des;  	} else {  		stmmac_set_desc_addr(priv, first, des);  		tmp_pay_len = pay_len; -		des += proto_hdr_len; +		tso_des = des + proto_hdr_len;  		pay_len = 0;  	} -	stmmac_tso_allocator(priv, des, tmp_pay_len, (nfrags == 0), queue); +	stmmac_tso_allocator(priv, tso_des, tmp_pay_len, (nfrags == 0), queue);  	/* In case two or more DMA transmit descriptors are allocated for this  	 * non-paged SKB data, the DMA buffer address should be saved to diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 3ac32444e492..dc9884130b91 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -406,22 +406,6 @@ static int stmmac_of_get_mac_mode(struct device_node *np)  }  /** - * stmmac_remove_config_dt - undo the effects of stmmac_probe_config_dt() - * @pdev: platform_device structure - * @plat: driver data platform structure - * - * Release resources claimed by stmmac_probe_config_dt(). - */ -static void stmmac_remove_config_dt(struct platform_device *pdev, -				    struct plat_stmmacenet_data *plat) -{ -	clk_disable_unprepare(plat->stmmac_clk); -	clk_disable_unprepare(plat->pclk); -	of_node_put(plat->phy_node); -	of_node_put(plat->mdio_node); -} - -/**   * stmmac_probe_config_dt - parse device-tree driver parameters   * @pdev: platform_device structure   * @mac: MAC address to use @@ -490,8 +474,10 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)  		dev_warn(&pdev->dev, "snps,phy-addr property is deprecated\n");  	rc = stmmac_mdio_setup(plat, np, &pdev->dev); -	if (rc) -		return ERR_PTR(rc); +	if (rc) { +		ret = ERR_PTR(rc); +		goto error_put_phy; +	}  	of_property_read_u32(np, "tx-fifo-depth", &plat->tx_fifo_size); @@ -581,8 +567,8 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)  	dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),  			       GFP_KERNEL);  	if (!dma_cfg) { -		stmmac_remove_config_dt(pdev, plat); -		return ERR_PTR(-ENOMEM); +		ret = ERR_PTR(-ENOMEM); +		goto error_put_mdio;  	}  	plat->dma_cfg = dma_cfg; @@ -610,8 +596,8 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)  	rc = stmmac_mtl_setup(pdev, plat);  	if (rc) { -		stmmac_remove_config_dt(pdev, plat); -		return ERR_PTR(rc); +		ret = ERR_PTR(rc); +		goto error_put_mdio;  	}  	/* clock setup */ @@ -663,6 +649,10 @@ error_hw_init:  	clk_disable_unprepare(plat->pclk);  error_pclk_get:  	clk_disable_unprepare(plat->stmmac_clk); +error_put_mdio: +	of_node_put(plat->mdio_node); +error_put_phy: +	of_node_put(plat->phy_node);  	return ret;  } @@ -671,16 +661,17 @@ static void devm_stmmac_remove_config_dt(void *data)  {  	struct plat_stmmacenet_data *plat = data; -	/* Platform data argument is unused */ -	stmmac_remove_config_dt(NULL, plat); +	clk_disable_unprepare(plat->stmmac_clk); +	clk_disable_unprepare(plat->pclk); +	of_node_put(plat->mdio_node); +	of_node_put(plat->phy_node);  }  /**   * devm_stmmac_probe_config_dt   * @pdev: platform_device structure   * @mac: MAC address to use - * Description: Devres variant of stmmac_probe_config_dt(). Does not require - * the user to call stmmac_remove_config_dt() at driver detach. + * Description: Devres variant of stmmac_probe_config_dt().   */  struct plat_stmmacenet_data *  devm_stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac) diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c index 14e1df721f2e..5465bf872734 100644 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c @@ -3551,7 +3551,7 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)  	init_completion(&common->tdown_complete);  	common->tx_ch_num = AM65_CPSW_DEFAULT_TX_CHNS;  	common->rx_ch_num_flows = AM65_CPSW_DEFAULT_RX_CHN_FLOWS; -	common->pf_p0_rx_ptype_rrobin = false; +	common->pf_p0_rx_ptype_rrobin = true;  	common->default_vlan = 1;  	common->ports = devm_kcalloc(dev, common->port_num, diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c index 52e4e350b734..5cc72a91f220 100644 --- a/drivers/net/ethernet/ti/cpsw_ale.c +++ b/drivers/net/ethernet/ti/cpsw_ale.c @@ -127,15 +127,15 @@ struct cpsw_ale_dev_id {  static inline int cpsw_ale_get_field(u32 *ale_entry, u32 start, u32 bits)  { -	int idx, idx2; +	int idx, idx2, index;  	u32 hi_val = 0;  	idx    = start / 32;  	idx2 = (start + bits - 1) / 32;  	/* Check if bits to be fetched exceed a word */  	if (idx != idx2) { -		idx2 = 2 - idx2; /* flip */ -		hi_val = ale_entry[idx2] << ((idx2 * 32) - start); +		index = 2 - idx2; /* flip */ +		hi_val = ale_entry[index] << ((idx2 * 32) - start);  	}  	start -= idx * 32;  	idx    = 2 - idx; /* flip */ @@ -145,16 +145,16 @@ static inline int cpsw_ale_get_field(u32 *ale_entry, u32 start, u32 bits)  static inline void cpsw_ale_set_field(u32 *ale_entry, u32 start, u32 bits,  				      u32 value)  { -	int idx, idx2; +	int idx, idx2, index;  	value &= BITMASK(bits);  	idx = start / 32;  	idx2 = (start + bits - 1) / 32;  	/* Check if bits to be set exceed a word */  	if (idx != idx2) { -		idx2 = 2 - idx2; /* flip */ -		ale_entry[idx2] &= ~(BITMASK(bits + start - (idx2 * 32))); -		ale_entry[idx2] |= (value >> ((idx2 * 32) - start)); +		index = 2 - idx2; /* flip */ +		ale_entry[index] &= ~(BITMASK(bits + start - (idx2 * 32))); +		ale_entry[index] |= (value >> ((idx2 * 32) - start));  	}  	start -= idx * 32;  	idx = 2 - idx; /* flip */ diff --git a/drivers/net/ethernet/ti/icssg/icss_iep.c b/drivers/net/ethernet/ti/icssg/icss_iep.c index 5d6d1cf78e93..768578c0d958 100644 --- a/drivers/net/ethernet/ti/icssg/icss_iep.c +++ b/drivers/net/ethernet/ti/icssg/icss_iep.c @@ -215,6 +215,9 @@ static void icss_iep_enable_shadow_mode(struct icss_iep *iep)  	for (cmp = IEP_MIN_CMP; cmp < IEP_MAX_CMP; cmp++) {  		regmap_update_bits(iep->map, ICSS_IEP_CMP_STAT_REG,  				   IEP_CMP_STATUS(cmp), IEP_CMP_STATUS(cmp)); + +		regmap_update_bits(iep->map, ICSS_IEP_CMP_CFG_REG, +				   IEP_CMP_CFG_CMP_EN(cmp), 0);  	}  	/* enable reset counter on CMP0 event */ @@ -780,6 +783,11 @@ int icss_iep_exit(struct icss_iep *iep)  	}  	icss_iep_disable(iep); +	if (iep->pps_enabled) +		icss_iep_pps_enable(iep, false); +	else if (iep->perout_enabled) +		icss_iep_perout_enable(iep, NULL, false); +  	return 0;  }  EXPORT_SYMBOL_GPL(icss_iep_exit); diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/ethernet/ti/icssg/icssg_common.c index fdebeb2f84e0..74f0f200a89d 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_common.c +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c @@ -855,31 +855,6 @@ irqreturn_t prueth_rx_irq(int irq, void *dev_id)  }  EXPORT_SYMBOL_GPL(prueth_rx_irq); -void prueth_emac_stop(struct prueth_emac *emac) -{ -	struct prueth *prueth = emac->prueth; -	int slice; - -	switch (emac->port_id) { -	case PRUETH_PORT_MII0: -		slice = ICSS_SLICE0; -		break; -	case PRUETH_PORT_MII1: -		slice = ICSS_SLICE1; -		break; -	default: -		netdev_err(emac->ndev, "invalid port\n"); -		return; -	} - -	emac->fw_running = 0; -	if (!emac->is_sr1) -		rproc_shutdown(prueth->txpru[slice]); -	rproc_shutdown(prueth->rtu[slice]); -	rproc_shutdown(prueth->pru[slice]); -} -EXPORT_SYMBOL_GPL(prueth_emac_stop); -  void prueth_cleanup_tx_ts(struct prueth_emac *emac)  {  	int i; diff --git a/drivers/net/ethernet/ti/icssg/icssg_config.c b/drivers/net/ethernet/ti/icssg/icssg_config.c index 5d2491c2943a..ddfd1c02a885 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_config.c +++ b/drivers/net/ethernet/ti/icssg/icssg_config.c @@ -397,7 +397,7 @@ static int prueth_emac_buffer_setup(struct prueth_emac *emac)  	return 0;  } -static void icssg_init_emac_mode(struct prueth *prueth) +void icssg_init_emac_mode(struct prueth *prueth)  {  	/* When the device is configured as a bridge and it is being brought  	 * back to the emac mode, the host mac address has to be set as 0. @@ -406,9 +406,6 @@ static void icssg_init_emac_mode(struct prueth *prueth)  	int i;  	u8 mac[ETH_ALEN] = { 0 }; -	if (prueth->emacs_initialized) -		return; -  	/* Set VLAN TABLE address base */  	regmap_update_bits(prueth->miig_rt, FDB_GEN_CFG1, SMEM_VLAN_OFFSET_MASK,  			   addr <<  SMEM_VLAN_OFFSET); @@ -423,15 +420,13 @@ static void icssg_init_emac_mode(struct prueth *prueth)  	/* Clear host MAC address */  	icssg_class_set_host_mac_addr(prueth->miig_rt, mac);  } +EXPORT_SYMBOL_GPL(icssg_init_emac_mode); -static void icssg_init_fw_offload_mode(struct prueth *prueth) +void icssg_init_fw_offload_mode(struct prueth *prueth)  {  	u32 addr = prueth->shram.pa + EMAC_ICSSG_SWITCH_DEFAULT_VLAN_TABLE_OFFSET;  	int i; -	if (prueth->emacs_initialized) -		return; -  	/* Set VLAN TABLE address base */  	regmap_update_bits(prueth->miig_rt, FDB_GEN_CFG1, SMEM_VLAN_OFFSET_MASK,  			   addr <<  SMEM_VLAN_OFFSET); @@ -448,6 +443,7 @@ static void icssg_init_fw_offload_mode(struct prueth *prueth)  		icssg_class_set_host_mac_addr(prueth->miig_rt, prueth->hw_bridge_dev->dev_addr);  	icssg_set_pvid(prueth, prueth->default_vlan, PRUETH_PORT_HOST);  } +EXPORT_SYMBOL_GPL(icssg_init_fw_offload_mode);  int icssg_config(struct prueth *prueth, struct prueth_emac *emac, int slice)  { @@ -455,11 +451,6 @@ int icssg_config(struct prueth *prueth, struct prueth_emac *emac, int slice)  	struct icssg_flow_cfg __iomem *flow_cfg;  	int ret; -	if (prueth->is_switch_mode || prueth->is_hsr_offload_mode) -		icssg_init_fw_offload_mode(prueth); -	else -		icssg_init_emac_mode(prueth); -  	memset_io(config, 0, TAS_GATE_MASK_LIST0);  	icssg_miig_queues_init(prueth, slice); @@ -786,3 +777,27 @@ void icssg_set_pvid(struct prueth *prueth, u8 vid, u8 port)  		writel(pvid, prueth->shram.va + EMAC_ICSSG_SWITCH_PORT0_DEFAULT_VLAN_OFFSET);  }  EXPORT_SYMBOL_GPL(icssg_set_pvid); + +int emac_fdb_flow_id_updated(struct prueth_emac *emac) +{ +	struct mgmt_cmd_rsp fdb_cmd_rsp = { 0 }; +	int slice = prueth_emac_slice(emac); +	struct mgmt_cmd fdb_cmd = { 0 }; +	int ret; + +	fdb_cmd.header = ICSSG_FW_MGMT_CMD_HEADER; +	fdb_cmd.type   = ICSSG_FW_MGMT_FDB_CMD_TYPE_RX_FLOW; +	fdb_cmd.seqnum = ++(emac->prueth->icssg_hwcmdseq); +	fdb_cmd.param  = 0; + +	fdb_cmd.param |= (slice << 4); +	fdb_cmd.cmd_args[0] = 0; + +	ret = icssg_send_fdb_msg(emac, &fdb_cmd, &fdb_cmd_rsp); +	if (ret) +		return ret; + +	WARN_ON(fdb_cmd.seqnum != fdb_cmd_rsp.seqnum); +	return fdb_cmd_rsp.status == 1 ? 0 : -EINVAL; +} +EXPORT_SYMBOL_GPL(emac_fdb_flow_id_updated); diff --git a/drivers/net/ethernet/ti/icssg/icssg_config.h b/drivers/net/ethernet/ti/icssg/icssg_config.h index 92c2deaa3068..c884e9fa099e 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_config.h +++ b/drivers/net/ethernet/ti/icssg/icssg_config.h @@ -55,6 +55,7 @@ struct icssg_rxq_ctx {  #define ICSSG_FW_MGMT_FDB_CMD_TYPE	0x03  #define ICSSG_FW_MGMT_CMD_TYPE		0x04  #define ICSSG_FW_MGMT_PKT		0x80000000 +#define ICSSG_FW_MGMT_FDB_CMD_TYPE_RX_FLOW	0x05  struct icssg_r30_cmd {  	u32 cmd[4]; diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/ethernet/ti/icssg/icssg_prueth.c index c568c84a032b..d76fe6d05e10 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -164,11 +164,26 @@ static struct icssg_firmwares icssg_emac_firmwares[] = {  	}  }; -static int prueth_emac_start(struct prueth *prueth, struct prueth_emac *emac) +static int prueth_start(struct rproc *rproc, const char *fw_name) +{ +	int ret; + +	ret = rproc_set_firmware(rproc, fw_name); +	if (ret) +		return ret; +	return rproc_boot(rproc); +} + +static void prueth_shutdown(struct rproc *rproc) +{ +	rproc_shutdown(rproc); +} + +static int prueth_emac_start(struct prueth *prueth)  {  	struct icssg_firmwares *firmwares;  	struct device *dev = prueth->dev; -	int slice, ret; +	int ret, slice;  	if (prueth->is_switch_mode)  		firmwares = icssg_switch_firmwares; @@ -177,49 +192,126 @@ static int prueth_emac_start(struct prueth *prueth, struct prueth_emac *emac)  	else  		firmwares = icssg_emac_firmwares; -	slice = prueth_emac_slice(emac); -	if (slice < 0) { -		netdev_err(emac->ndev, "invalid port\n"); -		return -EINVAL; +	for (slice = 0; slice < PRUETH_NUM_MACS; slice++) { +		ret = prueth_start(prueth->pru[slice], firmwares[slice].pru); +		if (ret) { +			dev_err(dev, "failed to boot PRU%d: %d\n", slice, ret); +			goto unwind_slices; +		} + +		ret = prueth_start(prueth->rtu[slice], firmwares[slice].rtu); +		if (ret) { +			dev_err(dev, "failed to boot RTU%d: %d\n", slice, ret); +			rproc_shutdown(prueth->pru[slice]); +			goto unwind_slices; +		} + +		ret = prueth_start(prueth->txpru[slice], firmwares[slice].txpru); +		if (ret) { +			dev_err(dev, "failed to boot TX_PRU%d: %d\n", slice, ret); +			rproc_shutdown(prueth->rtu[slice]); +			rproc_shutdown(prueth->pru[slice]); +			goto unwind_slices; +		}  	} -	ret = icssg_config(prueth, emac, slice); -	if (ret) -		return ret; +	return 0; -	ret = rproc_set_firmware(prueth->pru[slice], firmwares[slice].pru); -	ret = rproc_boot(prueth->pru[slice]); -	if (ret) { -		dev_err(dev, "failed to boot PRU%d: %d\n", slice, ret); -		return -EINVAL; +unwind_slices: +	while (--slice >= 0) { +		prueth_shutdown(prueth->txpru[slice]); +		prueth_shutdown(prueth->rtu[slice]); +		prueth_shutdown(prueth->pru[slice]);  	} -	ret = rproc_set_firmware(prueth->rtu[slice], firmwares[slice].rtu); -	ret = rproc_boot(prueth->rtu[slice]); -	if (ret) { -		dev_err(dev, "failed to boot RTU%d: %d\n", slice, ret); -		goto halt_pru; +	return ret; +} + +static void prueth_emac_stop(struct prueth *prueth) +{ +	int slice; + +	for (slice = 0; slice < PRUETH_NUM_MACS; slice++) { +		prueth_shutdown(prueth->txpru[slice]); +		prueth_shutdown(prueth->rtu[slice]); +		prueth_shutdown(prueth->pru[slice]);  	} +} + +static int prueth_emac_common_start(struct prueth *prueth) +{ +	struct prueth_emac *emac; +	int ret = 0; +	int slice; + +	if (!prueth->emac[ICSS_SLICE0] && !prueth->emac[ICSS_SLICE1]) +		return -EINVAL; + +	/* clear SMEM and MSMC settings for all slices */ +	memset_io(prueth->msmcram.va, 0, prueth->msmcram.size); +	memset_io(prueth->shram.va, 0, ICSSG_CONFIG_OFFSET_SLICE1 * PRUETH_NUM_MACS); + +	icssg_class_default(prueth->miig_rt, ICSS_SLICE0, 0, false); +	icssg_class_default(prueth->miig_rt, ICSS_SLICE1, 0, false); + +	if (prueth->is_switch_mode || prueth->is_hsr_offload_mode) +		icssg_init_fw_offload_mode(prueth); +	else +		icssg_init_emac_mode(prueth); + +	for (slice = 0; slice < PRUETH_NUM_MACS; slice++) { +		emac = prueth->emac[slice]; +		if (!emac) +			continue; +		ret = icssg_config(prueth, emac, slice); +		if (ret) +			goto disable_class; +	} + +	ret = prueth_emac_start(prueth); +	if (ret) +		goto disable_class; -	ret = rproc_set_firmware(prueth->txpru[slice], firmwares[slice].txpru); -	ret = rproc_boot(prueth->txpru[slice]); +	emac = prueth->emac[ICSS_SLICE0] ? prueth->emac[ICSS_SLICE0] : +	       prueth->emac[ICSS_SLICE1]; +	ret = icss_iep_init(emac->iep, &prueth_iep_clockops, +			    emac, IEP_DEFAULT_CYCLE_TIME_NS);  	if (ret) { -		dev_err(dev, "failed to boot TX_PRU%d: %d\n", slice, ret); -		goto halt_rtu; +		dev_err(prueth->dev, "Failed to initialize IEP module\n"); +		goto stop_pruss;  	} -	emac->fw_running = 1;  	return 0; -halt_rtu: -	rproc_shutdown(prueth->rtu[slice]); +stop_pruss: +	prueth_emac_stop(prueth); -halt_pru: -	rproc_shutdown(prueth->pru[slice]); +disable_class: +	icssg_class_disable(prueth->miig_rt, ICSS_SLICE0); +	icssg_class_disable(prueth->miig_rt, ICSS_SLICE1);  	return ret;  } +static int prueth_emac_common_stop(struct prueth *prueth) +{ +	struct prueth_emac *emac; + +	if (!prueth->emac[ICSS_SLICE0] && !prueth->emac[ICSS_SLICE1]) +		return -EINVAL; + +	icssg_class_disable(prueth->miig_rt, ICSS_SLICE0); +	icssg_class_disable(prueth->miig_rt, ICSS_SLICE1); + +	prueth_emac_stop(prueth); + +	emac = prueth->emac[ICSS_SLICE0] ? prueth->emac[ICSS_SLICE0] : +	       prueth->emac[ICSS_SLICE1]; +	icss_iep_exit(emac->iep); + +	return 0; +} +  /* called back by PHY layer if there is change in link state of hw port*/  static void emac_adjust_link(struct net_device *ndev)  { @@ -374,9 +466,6 @@ static void prueth_iep_settime(void *clockops_data, u64 ns)  	u32 cycletime;  	int timeout; -	if (!emac->fw_running) -		return; -  	sc_descp = emac->prueth->shram.va + TIMESYNC_FW_WC_SETCLOCK_DESC_OFFSET;  	cycletime = IEP_DEFAULT_CYCLE_TIME_NS; @@ -543,23 +632,17 @@ static int emac_ndo_open(struct net_device *ndev)  {  	struct prueth_emac *emac = netdev_priv(ndev);  	int ret, i, num_data_chn = emac->tx_ch_num; +	struct icssg_flow_cfg __iomem *flow_cfg;  	struct prueth *prueth = emac->prueth;  	int slice = prueth_emac_slice(emac);  	struct device *dev = prueth->dev;  	int max_rx_flows;  	int rx_flow; -	/* clear SMEM and MSMC settings for all slices */ -	if (!prueth->emacs_initialized) { -		memset_io(prueth->msmcram.va, 0, prueth->msmcram.size); -		memset_io(prueth->shram.va, 0, ICSSG_CONFIG_OFFSET_SLICE1 * PRUETH_NUM_MACS); -	} -  	/* set h/w MAC as user might have re-configured */  	ether_addr_copy(emac->mac_addr, ndev->dev_addr);  	icssg_class_set_mac_addr(prueth->miig_rt, slice, emac->mac_addr); -	icssg_class_default(prueth->miig_rt, slice, 0, false);  	icssg_ft1_set_mac_addr(prueth->miig_rt, slice, emac->mac_addr);  	/* Notify the stack of the actual queue counts. */ @@ -597,18 +680,23 @@ static int emac_ndo_open(struct net_device *ndev)  		goto cleanup_napi;  	} -	/* reset and start PRU firmware */ -	ret = prueth_emac_start(prueth, emac); -	if (ret) -		goto free_rx_irq; +	if (!prueth->emacs_initialized) { +		ret = prueth_emac_common_start(prueth); +		if (ret) +			goto free_rx_irq; +	} -	icssg_mii_update_mtu(prueth->mii_rt, slice, ndev->max_mtu); +	flow_cfg = emac->dram.va + ICSSG_CONFIG_OFFSET + PSI_L_REGULAR_FLOW_ID_BASE_OFFSET; +	writew(emac->rx_flow_id_base, &flow_cfg->rx_base_flow); +	ret = emac_fdb_flow_id_updated(emac); -	if (!prueth->emacs_initialized) { -		ret = icss_iep_init(emac->iep, &prueth_iep_clockops, -				    emac, IEP_DEFAULT_CYCLE_TIME_NS); +	if (ret) { +		netdev_err(ndev, "Failed to update Rx Flow ID %d", ret); +		goto stop;  	} +	icssg_mii_update_mtu(prueth->mii_rt, slice, ndev->max_mtu); +  	ret = request_threaded_irq(emac->tx_ts_irq, NULL, prueth_tx_ts_irq,  				   IRQF_ONESHOT, dev_name(dev), emac);  	if (ret) @@ -653,7 +741,8 @@ reset_rx_chn:  free_tx_ts_irq:  	free_irq(emac->tx_ts_irq, emac);  stop: -	prueth_emac_stop(emac); +	if (!prueth->emacs_initialized) +		prueth_emac_common_stop(prueth);  free_rx_irq:  	free_irq(emac->rx_chns.irq[rx_flow], emac);  cleanup_napi: @@ -689,8 +778,6 @@ static int emac_ndo_stop(struct net_device *ndev)  	if (ndev->phydev)  		phy_stop(ndev->phydev); -	icssg_class_disable(prueth->miig_rt, prueth_emac_slice(emac)); -  	if (emac->prueth->is_hsr_offload_mode)  		__dev_mc_unsync(ndev, icssg_prueth_hsr_del_mcast);  	else @@ -728,11 +815,9 @@ static int emac_ndo_stop(struct net_device *ndev)  	/* Destroying the queued work in ndo_stop() */  	cancel_delayed_work_sync(&emac->stats_work); -	if (prueth->emacs_initialized == 1) -		icss_iep_exit(emac->iep); -  	/* stop PRUs */ -	prueth_emac_stop(emac); +	if (prueth->emacs_initialized == 1) +		prueth_emac_common_stop(prueth);  	free_irq(emac->tx_ts_irq, emac); @@ -1053,10 +1138,11 @@ static void prueth_offload_fwd_mark_update(struct prueth *prueth)  	}  } -static void prueth_emac_restart(struct prueth *prueth) +static int prueth_emac_restart(struct prueth *prueth)  {  	struct prueth_emac *emac0 = prueth->emac[PRUETH_MAC0];  	struct prueth_emac *emac1 = prueth->emac[PRUETH_MAC1]; +	int ret;  	/* Detach the net_device for both PRUeth ports*/  	if (netif_running(emac0->ndev)) @@ -1065,36 +1151,46 @@ static void prueth_emac_restart(struct prueth *prueth)  		netif_device_detach(emac1->ndev);  	/* Disable both PRUeth ports */ -	icssg_set_port_state(emac0, ICSSG_EMAC_PORT_DISABLE); -	icssg_set_port_state(emac1, ICSSG_EMAC_PORT_DISABLE); +	ret = icssg_set_port_state(emac0, ICSSG_EMAC_PORT_DISABLE); +	ret |= icssg_set_port_state(emac1, ICSSG_EMAC_PORT_DISABLE); +	if (ret) +		return ret;  	/* Stop both pru cores for both PRUeth ports*/ -	prueth_emac_stop(emac0); -	prueth->emacs_initialized--; -	prueth_emac_stop(emac1); -	prueth->emacs_initialized--; +	ret = prueth_emac_common_stop(prueth); +	if (ret) { +		dev_err(prueth->dev, "Failed to stop the firmwares"); +		return ret; +	}  	/* Start both pru cores for both PRUeth ports */ -	prueth_emac_start(prueth, emac0); -	prueth->emacs_initialized++; -	prueth_emac_start(prueth, emac1); -	prueth->emacs_initialized++; +	ret = prueth_emac_common_start(prueth); +	if (ret) { +		dev_err(prueth->dev, "Failed to start the firmwares"); +		return ret; +	}  	/* Enable forwarding for both PRUeth ports */ -	icssg_set_port_state(emac0, ICSSG_EMAC_PORT_FORWARD); -	icssg_set_port_state(emac1, ICSSG_EMAC_PORT_FORWARD); +	ret = icssg_set_port_state(emac0, ICSSG_EMAC_PORT_FORWARD); +	ret |= icssg_set_port_state(emac1, ICSSG_EMAC_PORT_FORWARD);  	/* Attache net_device for both PRUeth ports */  	netif_device_attach(emac0->ndev);  	netif_device_attach(emac1->ndev); + +	return ret;  }  static void icssg_change_mode(struct prueth *prueth)  {  	struct prueth_emac *emac; -	int mac; +	int mac, ret; -	prueth_emac_restart(prueth); +	ret = prueth_emac_restart(prueth); +	if (ret) { +		dev_err(prueth->dev, "Failed to restart the firmwares, aborting the process"); +		return; +	}  	for (mac = PRUETH_MAC0; mac < PRUETH_NUM_MACS; mac++) {  		emac = prueth->emac[mac]; @@ -1173,13 +1269,18 @@ static void prueth_netdevice_port_unlink(struct net_device *ndev)  {  	struct prueth_emac *emac = netdev_priv(ndev);  	struct prueth *prueth = emac->prueth; +	int ret;  	prueth->br_members &= ~BIT(emac->port_id);  	if (prueth->is_switch_mode) {  		prueth->is_switch_mode = false;  		emac->port_vlan = 0; -		prueth_emac_restart(prueth); +		ret = prueth_emac_restart(prueth); +		if (ret) { +			dev_err(prueth->dev, "Failed to restart the firmwares, aborting the process"); +			return; +		}  	}  	prueth_offload_fwd_mark_update(prueth); @@ -1228,6 +1329,7 @@ static void prueth_hsr_port_unlink(struct net_device *ndev)  	struct prueth *prueth = emac->prueth;  	struct prueth_emac *emac0;  	struct prueth_emac *emac1; +	int ret;  	emac0 = prueth->emac[PRUETH_MAC0];  	emac1 = prueth->emac[PRUETH_MAC1]; @@ -1238,7 +1340,11 @@ static void prueth_hsr_port_unlink(struct net_device *ndev)  		emac0->port_vlan = 0;  		emac1->port_vlan = 0;  		prueth->hsr_dev = NULL; -		prueth_emac_restart(prueth); +		ret = prueth_emac_restart(prueth); +		if (ret) { +			dev_err(prueth->dev, "Failed to restart the firmwares, aborting the process"); +			return; +		}  		netdev_dbg(ndev, "Disabling HSR Offload mode\n");  	}  } @@ -1413,13 +1519,10 @@ static int prueth_probe(struct platform_device *pdev)  		prueth->pa_stats = NULL;  	} -	if (eth0_node) { +	if (eth0_node || eth1_node) {  		ret = prueth_get_cores(prueth, ICSS_SLICE0, false);  		if (ret)  			goto put_cores; -	} - -	if (eth1_node) {  		ret = prueth_get_cores(prueth, ICSS_SLICE1, false);  		if (ret)  			goto put_cores; @@ -1618,14 +1721,12 @@ put_pruss:  	pruss_put(prueth->pruss);  put_cores: -	if (eth1_node) { -		prueth_put_cores(prueth, ICSS_SLICE1); -		of_node_put(eth1_node); -	} - -	if (eth0_node) { +	if (eth0_node || eth1_node) {  		prueth_put_cores(prueth, ICSS_SLICE0);  		of_node_put(eth0_node); + +		prueth_put_cores(prueth, ICSS_SLICE1); +		of_node_put(eth1_node);  	}  	return ret; diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/ethernet/ti/icssg/icssg_prueth.h index f5c1d473e9f9..5473315ea204 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -140,7 +140,6 @@ struct prueth_rx_chn {  /* data for each emac port */  struct prueth_emac {  	bool is_sr1; -	bool fw_running;  	struct prueth *prueth;  	struct net_device *ndev;  	u8 mac_addr[6]; @@ -361,6 +360,8 @@ int icssg_set_port_state(struct prueth_emac *emac,  			 enum icssg_port_state_cmd state);  void icssg_config_set_speed(struct prueth_emac *emac);  void icssg_config_half_duplex(struct prueth_emac *emac); +void icssg_init_emac_mode(struct prueth *prueth); +void icssg_init_fw_offload_mode(struct prueth *prueth);  /* Buffer queue helpers */  int icssg_queue_pop(struct prueth *prueth, u8 queue); @@ -377,6 +378,7 @@ void icssg_vtbl_modify(struct prueth_emac *emac, u8 vid, u8 port_mask,  		       u8 untag_mask, bool add);  u16 icssg_get_pvid(struct prueth_emac *emac);  void icssg_set_pvid(struct prueth *prueth, u8 vid, u8 port); +int emac_fdb_flow_id_updated(struct prueth_emac *emac);  #define prueth_napi_to_tx_chn(pnapi) \  	container_of(pnapi, struct prueth_tx_chn, napi_tx) @@ -407,7 +409,6 @@ void emac_rx_timestamp(struct prueth_emac *emac,  		       struct sk_buff *skb, u32 *psdata);  enum netdev_tx icssg_ndo_start_xmit(struct sk_buff *skb, struct net_device *ndev);  irqreturn_t prueth_rx_irq(int irq, void *dev_id); -void prueth_emac_stop(struct prueth_emac *emac);  void prueth_cleanup_tx_ts(struct prueth_emac *emac);  int icssg_napi_rx_poll(struct napi_struct *napi_rx, int budget);  int prueth_prepare_rx_chan(struct prueth_emac *emac, diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c b/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c index 5024f0647a0d..3dc86397c367 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c @@ -440,7 +440,6 @@ static int prueth_emac_start(struct prueth *prueth, struct prueth_emac *emac)  		goto halt_pru;  	} -	emac->fw_running = 1;  	return 0;  halt_pru: @@ -449,6 +448,29 @@ halt_pru:  	return ret;  } +static void prueth_emac_stop(struct prueth_emac *emac) +{ +	struct prueth *prueth = emac->prueth; +	int slice; + +	switch (emac->port_id) { +	case PRUETH_PORT_MII0: +		slice = ICSS_SLICE0; +		break; +	case PRUETH_PORT_MII1: +		slice = ICSS_SLICE1; +		break; +	default: +		netdev_err(emac->ndev, "invalid port\n"); +		return; +	} + +	if (!emac->is_sr1) +		rproc_shutdown(prueth->txpru[slice]); +	rproc_shutdown(prueth->rtu[slice]); +	rproc_shutdown(prueth->pru[slice]); +} +  /**   * emac_ndo_open - EMAC device open   * @ndev: network adapter device diff --git a/drivers/net/ethernet/wangxun/libwx/wx_hw.c b/drivers/net/ethernet/wangxun/libwx/wx_hw.c index 1bf9c38e4125..deaf670c160e 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_hw.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_hw.c @@ -334,27 +334,25 @@ int wx_host_interface_command(struct wx *wx, u32 *buffer,  	status = read_poll_timeout(rd32, hicr, hicr & WX_MNG_MBOX_CTL_FWRDY, 1000,  				   timeout * 1000, false, wx, WX_MNG_MBOX_CTL); +	buf[0] = rd32(wx, WX_MNG_MBOX); +	if ((buf[0] & 0xff0000) >> 16 == 0x80) { +		wx_err(wx, "Unknown FW command: 0x%x\n", buffer[0] & 0xff); +		status = -EINVAL; +		goto rel_out; +	} +  	/* Check command completion */  	if (status) { -		wx_dbg(wx, "Command has failed with no status valid.\n"); - -		buf[0] = rd32(wx, WX_MNG_MBOX); -		if ((buffer[0] & 0xff) != (~buf[0] >> 24)) { -			status = -EINVAL; -			goto rel_out; -		} -		if ((buf[0] & 0xff0000) >> 16 == 0x80) { -			wx_dbg(wx, "It's unknown cmd.\n"); -			status = -EINVAL; -			goto rel_out; -		} - +		wx_err(wx, "Command has failed with no status valid.\n");  		wx_dbg(wx, "write value:\n");  		for (i = 0; i < dword_len; i++)  			wx_dbg(wx, "%x ", buffer[i]);  		wx_dbg(wx, "read value:\n");  		for (i = 0; i < dword_len; i++)  			wx_dbg(wx, "%x ", buf[i]); +		wx_dbg(wx, "\ncheck: %x %x\n", buffer[0] & 0xff, ~buf[0] >> 24); + +		goto rel_out;  	}  	if (!return_data) diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 0f4b02fe6f85..ae743991117c 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -2056,6 +2056,12 @@ axienet_ethtools_set_coalesce(struct net_device *ndev,  		return -EBUSY;  	} +	if (ecoalesce->rx_max_coalesced_frames > 255 || +	    ecoalesce->tx_max_coalesced_frames > 255) { +		NL_SET_ERR_MSG(extack, "frames must be less than 256"); +		return -EINVAL; +	} +  	if (ecoalesce->rx_max_coalesced_frames)  		lp->coalesce_count_rx = ecoalesce->rx_max_coalesced_frames;  	if (ecoalesce->rx_coalesce_usecs) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 2f29b1386b1c..bc658bc60885 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -895,7 +895,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,  		if (geneve->cfg.df == GENEVE_DF_SET) {  			df = htons(IP_DF);  		} else if (geneve->cfg.df == GENEVE_DF_INHERIT) { -			struct ethhdr *eth = eth_hdr(skb); +			struct ethhdr *eth = skb_eth_hdr(skb);  			if (ntohs(eth->h_proto) == ETH_P_IPV6) {  				df = htons(IP_DF); diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c index 89a996ad8cd0..fbabada7d3ba 100644 --- a/drivers/net/gtp.c +++ b/drivers/net/gtp.c @@ -1524,8 +1524,8 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,  		goto out_encap;  	} -	gn = net_generic(dev_net(dev), gtp_net_id); -	list_add_rcu(>p->list, &gn->gtp_dev_list); +	gn = net_generic(src_net, gtp_net_id); +	list_add(>p->list, &gn->gtp_dev_list);  	dev->priv_destructor = gtp_destructor;  	netdev_dbg(dev, "registered new GTP interface\n"); @@ -1551,7 +1551,7 @@ static void gtp_dellink(struct net_device *dev, struct list_head *head)  		hlist_for_each_entry_safe(pctx, next, >p->tid_hash[i], hlist_tid)  			pdp_context_delete(pctx); -	list_del_rcu(>p->list); +	list_del(>p->list);  	unregister_netdevice_queue(dev, head);  } @@ -2271,16 +2271,19 @@ static int gtp_genl_dump_pdp(struct sk_buff *skb,  	struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp;  	int i, j, bucket = cb->args[0], skip = cb->args[1];  	struct net *net = sock_net(skb->sk); +	struct net_device *dev;  	struct pdp_ctx *pctx; -	struct gtp_net *gn; - -	gn = net_generic(net, gtp_net_id);  	if (cb->args[4])  		return 0;  	rcu_read_lock(); -	list_for_each_entry_rcu(gtp, &gn->gtp_dev_list, list) { +	for_each_netdev_rcu(net, dev) { +		if (dev->rtnl_link_ops != >p_link_ops) +			continue; + +		gtp = netdev_priv(dev); +  		if (last_gtp && last_gtp != gtp)  			continue;  		else @@ -2475,9 +2478,14 @@ static void __net_exit gtp_net_exit_batch_rtnl(struct list_head *net_list,  	list_for_each_entry(net, net_list, exit_list) {  		struct gtp_net *gn = net_generic(net, gtp_net_id); -		struct gtp_dev *gtp; +		struct gtp_dev *gtp, *gtp_next; +		struct net_device *dev; + +		for_each_netdev(net, dev) +			if (dev->rtnl_link_ops == >p_link_ops) +				gtp_dellink(dev, dev_to_kill); -		list_for_each_entry(gtp, &gn->gtp_dev_list, list) +		list_for_each_entry_safe(gtp, gtp_next, &gn->gtp_dev_list, list)  			gtp_dellink(gtp->dev, dev_to_kill);  	}  } diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c index e685a7f946f0..753215ebc67c 100644 --- a/drivers/net/ieee802154/ca8210.c +++ b/drivers/net/ieee802154/ca8210.c @@ -3072,7 +3072,11 @@ static int ca8210_probe(struct spi_device *spi_device)  	spi_set_drvdata(priv->spi, priv);  	if (IS_ENABLED(CONFIG_IEEE802154_CA8210_DEBUGFS)) {  		cascoda_api_upstream = ca8210_test_int_driver_write; -		ca8210_test_interface_init(priv); +		ret = ca8210_test_interface_init(priv); +		if (ret) { +			dev_crit(&spi_device->dev, "ca8210_test_interface_init failed\n"); +			goto error; +		}  	} else {  		cascoda_api_upstream = NULL;  	} diff --git a/drivers/net/mctp/mctp-i3c.c b/drivers/net/mctp/mctp-i3c.c index 9adad59b8676..d247fe483c58 100644 --- a/drivers/net/mctp/mctp-i3c.c +++ b/drivers/net/mctp/mctp-i3c.c @@ -125,6 +125,8 @@ static int mctp_i3c_read(struct mctp_i3c_device *mi)  	xfer.data.in = skb_put(skb, mi->mrl); +	/* Make sure netif_rx() is read in the same order as i3c. */ +	mutex_lock(&mi->lock);  	rc = i3c_device_do_priv_xfers(mi->i3c, &xfer, 1);  	if (rc < 0)  		goto err; @@ -166,8 +168,10 @@ static int mctp_i3c_read(struct mctp_i3c_device *mi)  		stats->rx_dropped++;  	} +	mutex_unlock(&mi->lock);  	return 0;  err: +	mutex_unlock(&mi->lock);  	kfree_skb(skb);  	return rc;  } diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c index b156493d7084..aea0f0357568 100644 --- a/drivers/net/mdio/fwnode_mdio.c +++ b/drivers/net/mdio/fwnode_mdio.c @@ -40,6 +40,7 @@ fwnode_find_pse_control(struct fwnode_handle *fwnode)  static struct mii_timestamper *  fwnode_find_mii_timestamper(struct fwnode_handle *fwnode)  { +	struct mii_timestamper *mii_ts;  	struct of_phandle_args arg;  	int err; @@ -53,10 +54,16 @@ fwnode_find_mii_timestamper(struct fwnode_handle *fwnode)  	else if (err)  		return ERR_PTR(err); -	if (arg.args_count != 1) -		return ERR_PTR(-EINVAL); +	if (arg.args_count != 1) { +		mii_ts = ERR_PTR(-EINVAL); +		goto put_node; +	} + +	mii_ts = register_mii_timestamper(arg.np, arg.args[0]); -	return register_mii_timestamper(arg.np, arg.args[0]); +put_node: +	of_node_put(arg.np); +	return mii_ts;  }  int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio, diff --git a/drivers/net/netdevsim/health.c b/drivers/net/netdevsim/health.c index 70e8bdf34be9..688f05316b5e 100644 --- a/drivers/net/netdevsim/health.c +++ b/drivers/net/netdevsim/health.c @@ -149,6 +149,8 @@ static ssize_t nsim_dev_health_break_write(struct file *file,  	char *break_msg;  	int err; +	if (count == 0 || count > PAGE_SIZE) +		return -EINVAL;  	break_msg = memdup_user_nul(data, count);  	if (IS_ERR(break_msg))  		return PTR_ERR(break_msg); diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 0be47fed4efc..e068a9761c09 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -635,10 +635,10 @@ nsim_pp_hold_write(struct file *file, const char __user *data,  		page_pool_put_full_page(ns->page->pp, ns->page, false);  		ns->page = NULL;  	} -	rtnl_unlock();  exit: -	return count; +	rtnl_unlock(); +	return ret;  }  static const struct file_operations nsim_pp_hold_fops = { diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c index bb07725d1c72..c1d881dc6409 100644 --- a/drivers/net/netkit.c +++ b/drivers/net/netkit.c @@ -327,7 +327,7 @@ static int netkit_validate(struct nlattr *tb[], struct nlattr *data[],  static struct rtnl_link_ops netkit_link_ops; -static int netkit_new_link(struct net *src_net, struct net_device *dev, +static int netkit_new_link(struct net *peer_net, struct net_device *dev,  			   struct nlattr *tb[], struct nlattr *data[],  			   struct netlink_ext_ack *extack)  { @@ -342,7 +342,6 @@ static int netkit_new_link(struct net *src_net, struct net_device *dev,  	struct net_device *peer;  	char ifname[IFNAMSIZ];  	struct netkit *nk; -	struct net *net;  	int err;  	if (data) { @@ -385,13 +384,10 @@ static int netkit_new_link(struct net *src_net, struct net_device *dev,  	    (tb[IFLA_ADDRESS] || tbp[IFLA_ADDRESS]))  		return -EOPNOTSUPP; -	net = rtnl_link_get_net(src_net, tbp); -	peer = rtnl_create_link(net, ifname, ifname_assign_type, +	peer = rtnl_create_link(peer_net, ifname, ifname_assign_type,  				&netkit_link_ops, tbp, extack); -	if (IS_ERR(peer)) { -		put_net(net); +	if (IS_ERR(peer))  		return PTR_ERR(peer); -	}  	netif_inherit_tso_max(peer, dev); @@ -408,7 +404,6 @@ static int netkit_new_link(struct net *src_net, struct net_device *dev,  	bpf_mprog_bundle_init(&nk->bundle);  	err = register_netdevice(peer); -	put_net(net);  	if (err < 0)  		goto err_register_peer;  	netif_carrier_off(peer); diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index 7246a910728d..3059435af596 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -684,7 +684,9 @@ static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs,  	if (ret < 0)  		return ret; -	mask = DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW; +	val = 0; +	mask = DW_VR_MII_DIG_CTRL1_2G5_EN | DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW; +  	if (neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED)  		val = DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW; diff --git a/drivers/net/pfcp.c b/drivers/net/pfcp.c index 69434fd13f96..68d0d9e92a22 100644 --- a/drivers/net/pfcp.c +++ b/drivers/net/pfcp.c @@ -206,8 +206,8 @@ static int pfcp_newlink(struct net *net, struct net_device *dev,  		goto exit_del_pfcp_sock;  	} -	pn = net_generic(dev_net(dev), pfcp_net_id); -	list_add_rcu(&pfcp->list, &pn->pfcp_dev_list); +	pn = net_generic(net, pfcp_net_id); +	list_add(&pfcp->list, &pn->pfcp_dev_list);  	netdev_dbg(dev, "registered new PFCP interface\n"); @@ -224,7 +224,7 @@ static void pfcp_dellink(struct net_device *dev, struct list_head *head)  {  	struct pfcp_dev *pfcp = netdev_priv(dev); -	list_del_rcu(&pfcp->list); +	list_del(&pfcp->list);  	unregister_netdevice_queue(dev, head);  } @@ -247,11 +247,16 @@ static int __net_init pfcp_net_init(struct net *net)  static void __net_exit pfcp_net_exit(struct net *net)  {  	struct pfcp_net *pn = net_generic(net, pfcp_net_id); -	struct pfcp_dev *pfcp; +	struct pfcp_dev *pfcp, *pfcp_next; +	struct net_device *dev;  	LIST_HEAD(list);  	rtnl_lock(); -	list_for_each_entry(pfcp, &pn->pfcp_dev_list, list) +	for_each_netdev(net, dev) +		if (dev->rtnl_link_ops == &pfcp_link_ops) +			pfcp_dellink(dev, &list); + +	list_for_each_entry_safe(pfcp, pfcp_next, &pn->pfcp_dev_list, list)  		pfcp_dellink(pfcp->dev, &list);  	unregister_netdevice_many(&list); diff --git a/drivers/net/phy/aquantia/aquantia_leds.c b/drivers/net/phy/aquantia/aquantia_leds.c index 00ad2313fed3..951f46104eff 100644 --- a/drivers/net/phy/aquantia/aquantia_leds.c +++ b/drivers/net/phy/aquantia/aquantia_leds.c @@ -156,5 +156,5 @@ int aqr_phy_led_polarity_set(struct phy_device *phydev, int index, unsigned long  	if (force_active_high || force_active_low)  		return aqr_phy_led_active_low_set(phydev, index, force_active_low); -	unreachable(); +	return -EINVAL;  } diff --git a/drivers/net/phy/intel-xway.c b/drivers/net/phy/intel-xway.c index b672c55a7a4e..e6ed2413e514 100644 --- a/drivers/net/phy/intel-xway.c +++ b/drivers/net/phy/intel-xway.c @@ -529,7 +529,7 @@ static int xway_gphy_led_polarity_set(struct phy_device *phydev, int index,  	if (force_active_high)  		return phy_clear_bits(phydev, XWAY_MDIO_LED, XWAY_GPHY_LED_INV(index)); -	unreachable(); +	return -EINVAL;  }  static struct phy_driver xway_gphy[] = { diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 3ef508840674..eeb33eb181ac 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -432,10 +432,12 @@ struct kszphy_ptp_priv {  struct kszphy_priv {  	struct kszphy_ptp_priv ptp_priv;  	const struct kszphy_type *type; +	struct clk *clk;  	int led_mode;  	u16 vct_ctrl1000;  	bool rmii_ref_clk_sel;  	bool rmii_ref_clk_sel_val; +	bool clk_enable;  	u64 stats[ARRAY_SIZE(kszphy_hw_stats)];  }; @@ -2050,6 +2052,46 @@ static void kszphy_get_stats(struct phy_device *phydev,  		data[i] = kszphy_get_stat(phydev, i);  } +static void kszphy_enable_clk(struct phy_device *phydev) +{ +	struct kszphy_priv *priv = phydev->priv; + +	if (!priv->clk_enable && priv->clk) { +		clk_prepare_enable(priv->clk); +		priv->clk_enable = true; +	} +} + +static void kszphy_disable_clk(struct phy_device *phydev) +{ +	struct kszphy_priv *priv = phydev->priv; + +	if (priv->clk_enable && priv->clk) { +		clk_disable_unprepare(priv->clk); +		priv->clk_enable = false; +	} +} + +static int kszphy_generic_resume(struct phy_device *phydev) +{ +	kszphy_enable_clk(phydev); + +	return genphy_resume(phydev); +} + +static int kszphy_generic_suspend(struct phy_device *phydev) +{ +	int ret; + +	ret = genphy_suspend(phydev); +	if (ret) +		return ret; + +	kszphy_disable_clk(phydev); + +	return 0; +} +  static int kszphy_suspend(struct phy_device *phydev)  {  	/* Disable PHY Interrupts */ @@ -2059,7 +2101,7 @@ static int kszphy_suspend(struct phy_device *phydev)  			phydev->drv->config_intr(phydev);  	} -	return genphy_suspend(phydev); +	return kszphy_generic_suspend(phydev);  }  static void kszphy_parse_led_mode(struct phy_device *phydev) @@ -2090,7 +2132,9 @@ static int kszphy_resume(struct phy_device *phydev)  {  	int ret; -	genphy_resume(phydev); +	ret = kszphy_generic_resume(phydev); +	if (ret) +		return ret;  	/* After switching from power-down to normal mode, an internal global  	 * reset is automatically generated. Wait a minimum of 1 ms before @@ -2112,6 +2156,24 @@ static int kszphy_resume(struct phy_device *phydev)  	return 0;  } +/* Because of errata DS80000700A, receiver error following software + * power down. Suspend and resume callbacks only disable and enable + * external rmii reference clock. + */ +static int ksz8041_resume(struct phy_device *phydev) +{ +	kszphy_enable_clk(phydev); + +	return 0; +} + +static int ksz8041_suspend(struct phy_device *phydev) +{ +	kszphy_disable_clk(phydev); + +	return 0; +} +  static int ksz9477_resume(struct phy_device *phydev)  {  	int ret; @@ -2159,7 +2221,10 @@ static int ksz8061_resume(struct phy_device *phydev)  	if (!(ret & BMCR_PDOWN))  		return 0; -	genphy_resume(phydev); +	ret = kszphy_generic_resume(phydev); +	if (ret) +		return ret; +  	usleep_range(1000, 2000);  	/* Re-program the value after chip is reset. */ @@ -2177,6 +2242,11 @@ static int ksz8061_resume(struct phy_device *phydev)  	return 0;  } +static int ksz8061_suspend(struct phy_device *phydev) +{ +	return kszphy_suspend(phydev); +} +  static int kszphy_probe(struct phy_device *phydev)  {  	const struct kszphy_type *type = phydev->drv->driver_data; @@ -2217,10 +2287,14 @@ static int kszphy_probe(struct phy_device *phydev)  	} else if (!clk) {  		/* unnamed clock from the generic ethernet-phy binding */  		clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL); -		if (IS_ERR(clk)) -			return PTR_ERR(clk);  	} +	if (IS_ERR(clk)) +		return PTR_ERR(clk); + +	clk_disable_unprepare(clk); +	priv->clk = clk; +  	if (ksz8041_fiber_mode(phydev))  		phydev->port = PORT_FIBRE; @@ -5290,6 +5364,21 @@ static int lan8841_probe(struct phy_device *phydev)  	return 0;  } +static int lan8804_resume(struct phy_device *phydev) +{ +	return kszphy_resume(phydev); +} + +static int lan8804_suspend(struct phy_device *phydev) +{ +	return kszphy_generic_suspend(phydev); +} + +static int lan8841_resume(struct phy_device *phydev) +{ +	return kszphy_generic_resume(phydev); +} +  static int lan8841_suspend(struct phy_device *phydev)  {  	struct kszphy_priv *priv = phydev->priv; @@ -5298,7 +5387,7 @@ static int lan8841_suspend(struct phy_device *phydev)  	if (ptp_priv->ptp_clock)  		ptp_cancel_worker_sync(ptp_priv->ptp_clock); -	return genphy_suspend(phydev); +	return kszphy_generic_suspend(phydev);  }  static struct phy_driver ksphy_driver[] = { @@ -5358,9 +5447,8 @@ static struct phy_driver ksphy_driver[] = {  	.get_sset_count = kszphy_get_sset_count,  	.get_strings	= kszphy_get_strings,  	.get_stats	= kszphy_get_stats, -	/* No suspend/resume callbacks because of errata DS80000700A, -	 * receiver error following software power down. -	 */ +	.suspend	= ksz8041_suspend, +	.resume		= ksz8041_resume,  }, {  	.phy_id		= PHY_ID_KSZ8041RNLI,  	.phy_id_mask	= MICREL_PHY_ID_MASK, @@ -5436,7 +5524,7 @@ static struct phy_driver ksphy_driver[] = {  	.soft_reset	= genphy_soft_reset,  	.config_intr	= kszphy_config_intr,  	.handle_interrupt = kszphy_handle_interrupt, -	.suspend	= kszphy_suspend, +	.suspend	= ksz8061_suspend,  	.resume		= ksz8061_resume,  }, {  	.phy_id		= PHY_ID_KSZ9021, @@ -5507,8 +5595,8 @@ static struct phy_driver ksphy_driver[] = {  	.get_sset_count	= kszphy_get_sset_count,  	.get_strings	= kszphy_get_strings,  	.get_stats	= kszphy_get_stats, -	.suspend	= genphy_suspend, -	.resume		= kszphy_resume, +	.suspend	= lan8804_suspend, +	.resume		= lan8804_resume,  	.config_intr	= lan8804_config_intr,  	.handle_interrupt = lan8804_handle_interrupt,  }, { @@ -5526,7 +5614,7 @@ static struct phy_driver ksphy_driver[] = {  	.get_strings	= kszphy_get_strings,  	.get_stats	= kszphy_get_stats,  	.suspend	= lan8841_suspend, -	.resume		= genphy_resume, +	.resume		= lan8841_resume,  	.cable_test_start	= lan8814_cable_test_start,  	.cable_test_get_status	= ksz886x_cable_test_get_status,  }, { diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c index d3273bc0da4a..691969a4910f 100644 --- a/drivers/net/phy/microchip.c +++ b/drivers/net/phy/microchip.c @@ -351,6 +351,22 @@ static int lan88xx_config_aneg(struct phy_device *phydev)  static void lan88xx_link_change_notify(struct phy_device *phydev)  {  	int temp; +	int ret; + +	/* Reset PHY to ensure MII_LPA provides up-to-date information. This +	 * issue is reproducible only after parallel detection, as described +	 * in IEEE 802.3-2022, Section 28.2.3.1 ("Parallel detection function"), +	 * where the link partner does not support auto-negotiation. +	 */ +	if (phydev->state == PHY_NOLINK) { +		ret = phy_init_hw(phydev); +		if (ret < 0) +			goto link_change_notify_failed; + +		ret = _phy_start_aneg(phydev); +		if (ret < 0) +			goto link_change_notify_failed; +	}  	/* At forced 100 F/H mode, chip may fail to set mode correctly  	 * when cable is switched between long(~50+m) and short one. @@ -377,6 +393,11 @@ static void lan88xx_link_change_notify(struct phy_device *phydev)  		temp |= LAN88XX_INT_MASK_MDINTPIN_EN_;  		phy_write(phydev, LAN88XX_INT_MASK, temp);  	} + +	return; + +link_change_notify_failed: +	phydev_err(phydev, "Link change process failed %pe\n", ERR_PTR(ret));  }  /** diff --git a/drivers/net/phy/mxl-gpy.c b/drivers/net/phy/mxl-gpy.c index db3c1f72b407..a8ccf257c109 100644 --- a/drivers/net/phy/mxl-gpy.c +++ b/drivers/net/phy/mxl-gpy.c @@ -1014,7 +1014,7 @@ static int gpy_led_polarity_set(struct phy_device *phydev, int index,  	if (force_active_high)  		return phy_clear_bits(phydev, PHY_LED, PHY_LED_POLARITY(index)); -	unreachable(); +	return -EINVAL;  }  static struct phy_driver gpy_drivers[] = { diff --git a/drivers/net/pse-pd/tps23881.c b/drivers/net/pse-pd/tps23881.c index 5c4e88be46ee..8797ca1a8a21 100644 --- a/drivers/net/pse-pd/tps23881.c +++ b/drivers/net/pse-pd/tps23881.c @@ -64,15 +64,11 @@ static int tps23881_pi_enable(struct pse_controller_dev *pcdev, int id)  	if (id >= TPS23881_MAX_CHANS)  		return -ERANGE; -	ret = i2c_smbus_read_word_data(client, TPS23881_REG_PW_STATUS); -	if (ret < 0) -		return ret; -  	chan = priv->port[id].chan[0];  	if (chan < 4) -		val = (u16)(ret | BIT(chan)); +		val = BIT(chan);  	else -		val = (u16)(ret | BIT(chan + 4)); +		val = BIT(chan + 4);  	if (priv->port[id].is_4p) {  		chan = priv->port[id].chan[1]; @@ -100,15 +96,11 @@ static int tps23881_pi_disable(struct pse_controller_dev *pcdev, int id)  	if (id >= TPS23881_MAX_CHANS)  		return -ERANGE; -	ret = i2c_smbus_read_word_data(client, TPS23881_REG_PW_STATUS); -	if (ret < 0) -		return ret; -  	chan = priv->port[id].chan[0];  	if (chan < 4) -		val = (u16)(ret | BIT(chan + 4)); +		val = BIT(chan + 4);  	else -		val = (u16)(ret | BIT(chan + 8)); +		val = BIT(chan + 8);  	if (priv->port[id].is_4p) {  		chan = priv->port[id].chan[1]; diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c index a1b27b69f010..c7690adec8db 100644 --- a/drivers/net/team/team_core.c +++ b/drivers/net/team/team_core.c @@ -983,7 +983,8 @@ static void team_port_disable(struct team *team,  #define TEAM_VLAN_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \  			    NETIF_F_FRAGLIST | NETIF_F_GSO_SOFTWARE | \ -			    NETIF_F_HIGHDMA | NETIF_F_LRO) +			    NETIF_F_HIGHDMA | NETIF_F_LRO | \ +			    NETIF_F_GSO_ENCAP_ALL)  #define TEAM_ENC_FEATURES	(NETIF_F_HW_CSUM | NETIF_F_SG | \  				 NETIF_F_RXCSUM | NETIF_F_GSO_SOFTWARE) @@ -991,14 +992,19 @@ static void team_port_disable(struct team *team,  static void __team_compute_features(struct team *team)  {  	struct team_port *port; -	netdev_features_t vlan_features = TEAM_VLAN_FEATURES & -					  NETIF_F_ALL_FOR_ALL; +	netdev_features_t vlan_features = TEAM_VLAN_FEATURES;  	netdev_features_t enc_features  = TEAM_ENC_FEATURES;  	unsigned short max_hard_header_len = ETH_HLEN;  	unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE |  					IFF_XMIT_DST_RELEASE_PERM;  	rcu_read_lock(); +	if (list_empty(&team->port_list)) +		goto done; + +	vlan_features = netdev_base_features(vlan_features); +	enc_features = netdev_base_features(enc_features); +  	list_for_each_entry_rcu(port, &team->port_list, list) {  		vlan_features = netdev_increment_features(vlan_features,  					port->dev->vlan_features, @@ -1008,11 +1014,11 @@ static void __team_compute_features(struct team *team)  						  port->dev->hw_enc_features,  						  TEAM_ENC_FEATURES); -  		dst_release_flag &= port->dev->priv_flags;  		if (port->dev->hard_header_len > max_hard_header_len)  			max_hard_header_len = port->dev->hard_header_len;  	} +done:  	rcu_read_unlock();  	team->dev->vlan_features = vlan_features; @@ -2011,8 +2017,7 @@ static netdev_features_t team_fix_features(struct net_device *dev,  	netdev_features_t mask;  	mask = features; -	features &= ~NETIF_F_ONE_FOR_ALL; -	features |= NETIF_F_ALL_FOR_ALL; +	features = netdev_base_features(features);  	rcu_read_lock();  	list_for_each_entry_rcu(port, &team->port_list, list) { diff --git a/drivers/net/tun.c b/drivers/net/tun.c index d7a865ef370b..e816aaba8e5f 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1481,7 +1481,7 @@ static struct sk_buff *tun_napi_alloc_frags(struct tun_file *tfile,  	skb->truesize += skb->data_len;  	for (i = 1; i < it->nr_segs; i++) { -		const struct iovec *iov = iter_iov(it); +		const struct iovec *iov = iter_iov(it) + i;  		size_t fragsz = iov->iov_len;  		struct page *page;  		void *frag; diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 0c011d8f5d4d..e9208a8d2bfa 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -1365,6 +1365,9 @@ static const struct usb_device_id products[] = {  	{QMI_QUIRK_SET_DTR(0x1bc7, 0x10a0, 0)}, /* Telit FN920C04 */  	{QMI_QUIRK_SET_DTR(0x1bc7, 0x10a4, 0)}, /* Telit FN920C04 */  	{QMI_QUIRK_SET_DTR(0x1bc7, 0x10a9, 0)}, /* Telit FN920C04 */ +	{QMI_QUIRK_SET_DTR(0x1bc7, 0x10c0, 0)}, /* Telit FE910C04 */ +	{QMI_QUIRK_SET_DTR(0x1bc7, 0x10c4, 0)}, /* Telit FE910C04 */ +	{QMI_QUIRK_SET_DTR(0x1bc7, 0x10c8, 0)}, /* Telit FE910C04 */  	{QMI_FIXED_INTF(0x1bc7, 0x1100, 3)},	/* Telit ME910 */  	{QMI_FIXED_INTF(0x1bc7, 0x1101, 3)},	/* Telit ME910 dual modem */  	{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)},	/* Telit LE920 */ @@ -1426,6 +1429,7 @@ static const struct usb_device_id products[] = {  	{QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)},	/* Quectel EG95 */  	{QMI_FIXED_INTF(0x2c7c, 0x0296, 4)},	/* Quectel BG96 */  	{QMI_QUIRK_SET_DTR(0x2c7c, 0x030e, 4)},	/* Quectel EM05GV2 */ +	{QMI_QUIRK_SET_DTR(0x2c7c, 0x0316, 3)},	/* Quectel RG255C */  	{QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)},	/* Fibocom NL678 series */  	{QMI_QUIRK_SET_DTR(0x2cb7, 0x0112, 0)},	/* Fibocom FG132 */  	{QMI_FIXED_INTF(0x0489, 0xe0b4, 0)},	/* Foxconn T77W968 LTE */ diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 0d6d0d749d44..07ebb800edf1 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -1765,7 +1765,7 @@ static int veth_init_queues(struct net_device *dev, struct nlattr *tb[])  	return 0;  } -static int veth_newlink(struct net *src_net, struct net_device *dev, +static int veth_newlink(struct net *peer_net, struct net_device *dev,  			struct nlattr *tb[], struct nlattr *data[],  			struct netlink_ext_ack *extack)  { @@ -1776,7 +1776,6 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,  	struct nlattr *peer_tb[IFLA_MAX + 1], **tbp;  	unsigned char name_assign_type;  	struct ifinfomsg *ifmp; -	struct net *net;  	/*  	 * create and register peer first @@ -1800,13 +1799,10 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,  		name_assign_type = NET_NAME_ENUM;  	} -	net = rtnl_link_get_net(src_net, tbp); -	peer = rtnl_create_link(net, ifname, name_assign_type, +	peer = rtnl_create_link(peer_net, ifname, name_assign_type,  				&veth_link_ops, tbp, extack); -	if (IS_ERR(peer)) { -		put_net(net); +	if (IS_ERR(peer))  		return PTR_ERR(peer); -	}  	if (!ifmp || !tbp[IFLA_ADDRESS])  		eth_hw_addr_random(peer); @@ -1817,8 +1813,6 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,  	netif_inherit_tso_max(peer, dev);  	err = register_netdevice(peer); -	put_net(net); -	net = NULL;  	if (err < 0)  		goto err_register_peer; diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 64c87bb48a41..7646ddd9bef7 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -503,6 +503,7 @@ struct virtio_net_common_hdr {  static struct virtio_net_common_hdr xsk_hdr;  static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf); +static void virtnet_sq_free_unused_buf_done(struct virtqueue *vq);  static int virtnet_xdp_handler(struct bpf_prog *xdp_prog, struct xdp_buff *xdp,  			       struct net_device *dev,  			       unsigned int *xdp_xmit, @@ -3054,7 +3055,6 @@ static int virtnet_enable_queue_pair(struct virtnet_info *vi, int qp_index)  	if (err < 0)  		goto err_xdp_reg_mem_model; -	netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, qp_index));  	virtnet_napi_enable(vi->rq[qp_index].vq, &vi->rq[qp_index].napi);  	virtnet_napi_tx_enable(vi, vi->sq[qp_index].vq, &vi->sq[qp_index].napi); @@ -3332,7 +3332,7 @@ static int virtnet_rx_resize(struct virtnet_info *vi,  	virtnet_rx_pause(vi, rq); -	err = virtqueue_resize(rq->vq, ring_num, virtnet_rq_unmap_free_buf); +	err = virtqueue_resize(rq->vq, ring_num, virtnet_rq_unmap_free_buf, NULL);  	if (err)  		netdev_err(vi->dev, "resize rx fail: rx queue index: %d err: %d\n", qindex, err); @@ -3395,7 +3395,8 @@ static int virtnet_tx_resize(struct virtnet_info *vi, struct send_queue *sq,  	virtnet_tx_pause(vi, sq); -	err = virtqueue_resize(sq->vq, ring_num, virtnet_sq_free_unused_buf); +	err = virtqueue_resize(sq->vq, ring_num, virtnet_sq_free_unused_buf, +			       virtnet_sq_free_unused_buf_done);  	if (err)  		netdev_err(vi->dev, "resize tx fail: tx queue index: %d err: %d\n", qindex, err); @@ -5710,7 +5711,7 @@ static int virtnet_rq_bind_xsk_pool(struct virtnet_info *vi, struct receive_queu  	virtnet_rx_pause(vi, rq); -	err = virtqueue_reset(rq->vq, virtnet_rq_unmap_free_buf); +	err = virtqueue_reset(rq->vq, virtnet_rq_unmap_free_buf, NULL);  	if (err) {  		netdev_err(vi->dev, "reset rx fail: rx queue index: %d err: %d\n", qindex, err); @@ -5739,7 +5740,8 @@ static int virtnet_sq_bind_xsk_pool(struct virtnet_info *vi,  	virtnet_tx_pause(vi, sq); -	err = virtqueue_reset(sq->vq, virtnet_sq_free_unused_buf); +	err = virtqueue_reset(sq->vq, virtnet_sq_free_unused_buf, +			      virtnet_sq_free_unused_buf_done);  	if (err) {  		netdev_err(vi->dev, "reset tx fail: tx queue index: %d err: %d\n", qindex, err);  		pool = NULL; @@ -6214,7 +6216,7 @@ static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf)  {  	struct virtnet_info *vi = vq->vdev->priv;  	struct send_queue *sq; -	int i = vq2rxq(vq); +	int i = vq2txq(vq);  	sq = &vi->sq[i]; @@ -6234,6 +6236,14 @@ static void virtnet_sq_free_unused_buf(struct virtqueue *vq, void *buf)  	}  } +static void virtnet_sq_free_unused_buf_done(struct virtqueue *vq) +{ +	struct virtnet_info *vi = vq->vdev->priv; +	int i = vq2txq(vq); + +	netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, i)); +} +  static void free_unused_bufs(struct virtnet_info *vi)  {  	void *buf; @@ -6966,11 +6976,20 @@ free:  static void remove_vq_common(struct virtnet_info *vi)  { +	int i; +  	virtio_reset_device(vi->vdev);  	/* Free unused buffers in both send and recv, if any. */  	free_unused_bufs(vi); +	/* +	 * Rule of thumb is netdev_tx_reset_queue() should follow any +	 * skb freeing not followed by netdev_tx_completed_queue() +	 */ +	for (i = 0; i < vi->max_queue_pairs; i++) +		netdev_tx_reset_queue(netdev_get_tx_queue(vi->dev, i)); +  	free_receive_bufs(vi);  	free_receive_page_frags(vi); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c index 4f0c1e1a8e60..1e1c79b18c5b 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c @@ -22,7 +22,7 @@ static void __exit brcmf_bca_exit(void)  MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom AP chipsets");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(BRCMFMAC); +MODULE_IMPORT_NS("BRCMFMAC");  module_init(brcmf_bca_init);  module_exit(brcmf_bca_exit); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h index 39226b9c0fa8..d53839f855d7 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h @@ -14,7 +14,7 @@  #include "fweh.h"  #if IS_MODULE(CONFIG_BRCMFMAC) -#define BRCMF_EXPORT_SYMBOL_GPL(__sym)	EXPORT_SYMBOL_NS_GPL(__sym, BRCMFMAC) +#define BRCMF_EXPORT_SYMBOL_GPL(__sym)	EXPORT_SYMBOL_NS_GPL(__sym, "BRCMFMAC")  #else  #define BRCMF_EXPORT_SYMBOL_GPL(__sym)  #endif diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c index 90d06cda03a2..ce5fcfd42a7e 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c @@ -22,7 +22,7 @@ static void __exit brcmf_cyw_exit(void)  MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Cypress/Infineon chipsets");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(BRCMFMAC); +MODULE_IMPORT_NS("BRCMFMAC");  module_init(brcmf_cyw_init);  module_exit(brcmf_cyw_exit); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c index b66135e3cff4..cfe01ca63ba6 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c @@ -22,7 +22,7 @@ static void __exit brcmf_wcc_exit(void)  MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom mobility chipsets");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(BRCMFMAC); +MODULE_IMPORT_NS("BRCMFMAC");  module_init(brcmf_wcc_init);  module_exit(brcmf_wcc_exit); diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/bz.c b/drivers/net/wireless/intel/iwlwifi/cfg/bz.c index cd1fe8490ae5..1c43f283ac4a 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/bz.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/bz.c @@ -161,6 +161,7 @@ const struct iwl_cfg_trans_params iwl_gl_trans_cfg = {  const char iwl_bz_name[] = "Intel(R) TBD Bz device";  const char iwl_fm_name[] = "Intel(R) Wi-Fi 7 BE201 320MHz"; +const char iwl_wh_name[] = "Intel(R) Wi-Fi 7 BE211 320MHz";  const char iwl_gl_name[] = "Intel(R) Wi-Fi 7 BE200 320MHz";  const char iwl_mtp_name[] = "Intel(R) Wi-Fi 7 BE202 160MHz"; diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c index e0b14be25b02..769b75c3fa5b 100644 --- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c +++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c @@ -48,7 +48,7 @@  #define DRV_DESCRIPTION	"Intel(R) Wireless WiFi Link AGN driver for Linux"  MODULE_DESCRIPTION(DRV_DESCRIPTION);  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IWLWIFI); +MODULE_IMPORT_NS("IWLWIFI");  /* Please keep this array *SORTED* by hex value.   * Access is done through binary search. diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h index 34c91deca57b..17721bb47e25 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h @@ -545,6 +545,7 @@ extern const char iwl_ax231_name[];  extern const char iwl_ax411_name[];  extern const char iwl_bz_name[];  extern const char iwl_fm_name[]; +extern const char iwl_wh_name[];  extern const char iwl_gl_name[];  extern const char iwl_mtp_name[];  extern const char iwl_sc_name[]; diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.h b/drivers/net/wireless/intel/iwlwifi/iwl-drv.h index 6a1d31892417..854957bdf79d 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.h @@ -85,7 +85,7 @@ void iwl_drv_stop(struct iwl_drv *drv);   * everything is built-in, then we can avoid that.   */  #ifdef CONFIG_IWLWIFI_OPMODE_MODULAR -#define IWL_EXPORT_SYMBOL(sym)	EXPORT_SYMBOL_NS_GPL(sym, IWLWIFI) +#define IWL_EXPORT_SYMBOL(sym)	EXPORT_SYMBOL_NS_GPL(sym, "IWLWIFI")  #else  #define IWL_EXPORT_SYMBOL(sym)  #endif diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c index f85c01e04ebf..7d973546c9fb 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c @@ -2954,6 +2954,7 @@ static void iwl_mvm_query_set_freqs(struct iwl_mvm *mvm,  				    int idx)  {  	int i; +	int n_channels = 0;  	if (fw_has_api(&mvm->fw->ucode_capa,  		       IWL_UCODE_TLV_API_SCAN_OFFLOAD_CHANS)) { @@ -2962,7 +2963,7 @@ static void iwl_mvm_query_set_freqs(struct iwl_mvm *mvm,  		for (i = 0; i < SCAN_OFFLOAD_MATCHING_CHANNELS_LEN * 8; i++)  			if (matches[idx].matching_channels[i / 8] & (BIT(i % 8))) -				match->channels[match->n_channels++] = +				match->channels[n_channels++] =  					mvm->nd_channels[i]->center_freq;  	} else {  		struct iwl_scan_offload_profile_match_v1 *matches = @@ -2970,9 +2971,11 @@ static void iwl_mvm_query_set_freqs(struct iwl_mvm *mvm,  		for (i = 0; i < SCAN_OFFLOAD_MATCHING_CHANNELS_LEN_V1 * 8; i++)  			if (matches[idx].matching_channels[i / 8] & (BIT(i % 8))) -				match->channels[match->n_channels++] = +				match->channels[n_channels++] =  					mvm->nd_channels[i]->center_freq;  	} +	/* We may have ended up with fewer channels than we allocated. */ +	match->n_channels = n_channels;  }  /** @@ -3053,6 +3056,8 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,  			     GFP_KERNEL);  	if (!net_detect || !n_matches)  		goto out_report_nd; +	net_detect->n_matches = n_matches; +	n_matches = 0;  	for_each_set_bit(i, &matched_profiles, mvm->n_nd_match_sets) {  		struct cfg80211_wowlan_nd_match *match; @@ -3066,8 +3071,9 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,  				GFP_KERNEL);  		if (!match)  			goto out_report_nd; +		match->n_channels = n_channels; -		net_detect->matches[net_detect->n_matches++] = match; +		net_detect->matches[n_matches++] = match;  		/* We inverted the order of the SSIDs in the scan  		 * request, so invert the index here. @@ -3082,6 +3088,8 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,  		iwl_mvm_query_set_freqs(mvm, d3_data->nd_results, match, i);  	} +	/* We may have fewer matches than we allocated. */ +	net_detect->n_matches = n_matches;  out_report_nd:  	wakeup.net_detect = net_detect; diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c index 2a13d70da46c..51ee62ae70fb 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c @@ -1972,7 +1972,7 @@ void iwl_mvm_channel_switch_error_notif(struct iwl_mvm *mvm,  	if (csa_err_mask & (CS_ERR_COUNT_ERROR |  			    CS_ERR_LONG_DELAY_AFTER_CS |  			    CS_ERR_TX_BLOCK_TIMER_EXPIRED)) -		ieee80211_channel_switch_disconnect(vif, true); +		ieee80211_channel_switch_disconnect(vif);  	rcu_read_unlock();  } diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c index e25d7570ffab..30fcc733395e 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c @@ -34,7 +34,7 @@  #define DRV_DESCRIPTION	"The new Intel(R) wireless AGN driver for Linux"  MODULE_DESCRIPTION(DRV_DESCRIPTION);  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IWLWIFI); +MODULE_IMPORT_NS("IWLWIFI");  static const struct iwl_op_mode_ops iwl_mvm_ops;  static const struct iwl_op_mode_ops iwl_mvm_ops_mq; diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tests/links.c b/drivers/net/wireless/intel/iwlwifi/mvm/tests/links.c index 47b8e7b64ead..1dc57e022191 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tests/links.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tests/links.c @@ -8,7 +8,7 @@  #include "../mvm.h"  #include <kunit/test.h> -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");  static struct wiphy wiphy = {  	.mtx = __MUTEX_INITIALIZER(wiphy.mtx), diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tests/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/tests/scan.c index d3b6a57c3ebe..7a3275199ace 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tests/scan.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tests/scan.c @@ -8,7 +8,7 @@  #include "../mvm.h"  #include <kunit/test.h> -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");  static const struct acs_average_db_case {  	const char *desc; diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c index 805fb249a0c6..8fb2aa282242 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c @@ -1106,19 +1106,54 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {  		      iwlax210_2ax_cfg_so_jf_b0, iwl9462_name),  /* Bz */ -/* FIXME: need to change the naming according to the actual CRF */  	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_MAC_TYPE_BZ, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_HR2, IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, +		      iwl_cfg_bz, iwl_ax201_name), + +	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_MAC_TYPE_BZ, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_GF, IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, +		      iwl_cfg_bz, iwl_ax211_name), + +	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_MAC_TYPE_BZ, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_FM, IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY,  		      iwl_cfg_bz, iwl_fm_name),  	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_MAC_TYPE_BZ, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_WH, IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, +		      iwl_cfg_bz, iwl_wh_name), + +	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_MAC_TYPE_BZ_W, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_HR2, IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, +		      iwl_cfg_bz, iwl_ax201_name), + +	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_MAC_TYPE_BZ_W, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_GF, IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, +		      iwl_cfg_bz, iwl_ax211_name), + +	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_MAC_TYPE_BZ_W, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_FM, IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY,  		      iwl_cfg_bz, iwl_fm_name), +	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_MAC_TYPE_BZ_W, IWL_CFG_ANY, +		      IWL_CFG_RF_TYPE_WH, IWL_CFG_ANY, IWL_CFG_ANY, +		      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, +		      iwl_cfg_bz, iwl_wh_name), +  /* Ga (Gl) */  	_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,  		      IWL_CFG_MAC_TYPE_GL, IWL_CFG_ANY, diff --git a/drivers/net/wireless/intel/iwlwifi/tests/devinfo.c b/drivers/net/wireless/intel/iwlwifi/tests/devinfo.c index 7361b6d0cdb8..d0bda23c628a 100644 --- a/drivers/net/wireless/intel/iwlwifi/tests/devinfo.c +++ b/drivers/net/wireless/intel/iwlwifi/tests/devinfo.c @@ -9,7 +9,7 @@  #include "iwl-drv.h"  #include "iwl-config.h" -MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING); +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");  static void iwl_pci_print_dev_info(const char *pfx, const struct iwl_dev_info *di)  { diff --git a/drivers/net/wireless/st/cw1200/cw1200_spi.c b/drivers/net/wireless/st/cw1200/cw1200_spi.c index 862964a8cc87..52386dfb5f4a 100644 --- a/drivers/net/wireless/st/cw1200/cw1200_spi.c +++ b/drivers/net/wireless/st/cw1200/cw1200_spi.c @@ -442,8 +442,8 @@ static void cw1200_spi_disconnect(struct spi_device *func)  			cw1200_core_release(self->core);  			self->core = NULL;  		} +		cw1200_spi_off(self, dev_get_platdata(&func->dev));  	} -	cw1200_spi_off(self, dev_get_platdata(&func->dev));  }  static int __maybe_unused cw1200_spi_suspend(struct device *dev) diff --git a/drivers/net/wwan/iosm/iosm_ipc_mmio.c b/drivers/net/wwan/iosm/iosm_ipc_mmio.c index 63eb08c43c05..6764c13530b9 100644 --- a/drivers/net/wwan/iosm/iosm_ipc_mmio.c +++ b/drivers/net/wwan/iosm/iosm_ipc_mmio.c @@ -104,7 +104,7 @@ struct iosm_mmio *ipc_mmio_init(void __iomem *mmio, struct device *dev)  			break;  		msleep(20); -	} while (retries-- > 0); +	} while (--retries > 0);  	if (!retries) {  		dev_err(ipc_mmio->dev, "invalid exec stage %X", stage); diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.c b/drivers/net/wwan/t7xx/t7xx_state_monitor.c index 3931c7a13f5a..cbdbb91e8381 100644 --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.c +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.c @@ -104,14 +104,21 @@ void t7xx_fsm_broadcast_state(struct t7xx_fsm_ctl *ctl, enum md_state state)  	fsm_state_notify(ctl->md, state);  } +static void fsm_release_command(struct kref *ref) +{ +	struct t7xx_fsm_command *cmd = container_of(ref, typeof(*cmd), refcnt); + +	kfree(cmd); +} +  static void fsm_finish_command(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_command *cmd, int result)  {  	if (cmd->flag & FSM_CMD_FLAG_WAIT_FOR_COMPLETION) { -		*cmd->ret = result; -		complete_all(cmd->done); +		cmd->result = result; +		complete_all(&cmd->done);  	} -	kfree(cmd); +	kref_put(&cmd->refcnt, fsm_release_command);  }  static void fsm_del_kf_event(struct t7xx_fsm_event *event) @@ -475,7 +482,6 @@ static int fsm_main_thread(void *data)  int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_id, unsigned int flag)  { -	DECLARE_COMPLETION_ONSTACK(done);  	struct t7xx_fsm_command *cmd;  	unsigned long flags;  	int ret; @@ -487,11 +493,13 @@ int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_id  	INIT_LIST_HEAD(&cmd->entry);  	cmd->cmd_id = cmd_id;  	cmd->flag = flag; +	kref_init(&cmd->refcnt);  	if (flag & FSM_CMD_FLAG_WAIT_FOR_COMPLETION) { -		cmd->done = &done; -		cmd->ret = &ret; +		init_completion(&cmd->done); +		kref_get(&cmd->refcnt);  	} +	kref_get(&cmd->refcnt);  	spin_lock_irqsave(&ctl->command_lock, flags);  	list_add_tail(&cmd->entry, &ctl->command_queue);  	spin_unlock_irqrestore(&ctl->command_lock, flags); @@ -501,11 +509,11 @@ int t7xx_fsm_append_cmd(struct t7xx_fsm_ctl *ctl, enum t7xx_fsm_cmd_state cmd_id  	if (flag & FSM_CMD_FLAG_WAIT_FOR_COMPLETION) {  		unsigned long wait_ret; -		wait_ret = wait_for_completion_timeout(&done, +		wait_ret = wait_for_completion_timeout(&cmd->done,  						       msecs_to_jiffies(FSM_CMD_TIMEOUT_MS)); -		if (!wait_ret) -			return -ETIMEDOUT; +		ret = wait_ret ? cmd->result : -ETIMEDOUT; +		kref_put(&cmd->refcnt, fsm_release_command);  		return ret;  	} diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.h b/drivers/net/wwan/t7xx/t7xx_state_monitor.h index 7b0a9baf488c..6e0601bb752e 100644 --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.h +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.h @@ -110,8 +110,9 @@ struct t7xx_fsm_command {  	struct list_head	entry;  	enum t7xx_fsm_cmd_state	cmd_id;  	unsigned int		flag; -	struct completion	*done; -	int			*ret; +	struct completion	done; +	int			result; +	struct kref		refcnt;  };  struct t7xx_fsm_notifier { diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 4265c1cd0ff7..63fe51d0e64d 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -867,7 +867,7 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev  static int xennet_close(struct net_device *dev)  {  	struct netfront_info *np = netdev_priv(dev); -	unsigned int num_queues = dev->real_num_tx_queues; +	unsigned int num_queues = np->queues ? dev->real_num_tx_queues : 0;  	unsigned int i;  	struct netfront_queue *queue;  	netif_tx_stop_all_queues(np->netdev); @@ -882,6 +882,9 @@ static void xennet_destroy_queues(struct netfront_info *info)  {  	unsigned int i; +	if (!info->queues) +		return; +  	for (i = 0; i < info->netdev->real_num_tx_queues; i++) {  		struct netfront_queue *queue = &info->queues[i]; diff --git a/drivers/nvdimm/e820.c b/drivers/nvdimm/e820.c index 0982215371ba..41c67dfa8015 100644 --- a/drivers/nvdimm/e820.c +++ b/drivers/nvdimm/e820.c @@ -59,7 +59,7 @@ err:  static struct platform_driver e820_pmem_driver = {  	.probe = e820_pmem_probe, -	.remove_new = e820_pmem_remove, +	.remove = e820_pmem_remove,  	.driver = {  		.name = "e820_pmem",  	}, diff --git a/drivers/nvdimm/of_pmem.c b/drivers/nvdimm/of_pmem.c index b4a1cf70e8b7..68bddab3fb46 100644 --- a/drivers/nvdimm/of_pmem.c +++ b/drivers/nvdimm/of_pmem.c @@ -100,7 +100,7 @@ static const struct of_device_id of_pmem_region_match[] = {  static struct platform_driver of_pmem_region_driver = {  	.probe = of_pmem_region_probe, -	.remove_new = of_pmem_region_remove, +	.remove = of_pmem_region_remove,  	.driver = {  		.name = "of_pmem",  		.of_match_table = of_pmem_region_match, diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c index 9e4f7ff024a0..37417ce5ec7b 100644 --- a/drivers/nvdimm/region_devs.c +++ b/drivers/nvdimm/region_devs.c @@ -1270,4 +1270,4 @@ int nd_region_conflict(struct nd_region *nd_region, resource_size_t start,  	return device_for_each_child(&nvdimm_bus->dev, &ctx, region_conflict);  } -MODULE_IMPORT_NS(DEVMEM); +MODULE_IMPORT_NS("DEVMEM"); diff --git a/drivers/nvme/host/apple.c b/drivers/nvme/host/apple.c index 7cd1102a8d2c..4319ab50c10d 100644 --- a/drivers/nvme/host/apple.c +++ b/drivers/nvme/host/apple.c @@ -1618,7 +1618,7 @@ static struct platform_driver apple_nvme_driver = {  		.pm = pm_sleep_ptr(&apple_nvme_pm_ops),  	},  	.probe = apple_nvme_probe, -	.remove_new = apple_nvme_remove, +	.remove = apple_nvme_remove,  	.shutdown = apple_nvme_shutdown,  };  module_platform_driver(apple_nvme_driver); diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 40e7be3b0339..a970168a3014 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -702,7 +702,7 @@ void nvme_put_ns(struct nvme_ns *ns)  {  	kref_put(&ns->kref, nvme_free_ns);  } -EXPORT_SYMBOL_NS_GPL(nvme_put_ns, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_put_ns, "NVME_TARGET_PASSTHRU");  static inline void nvme_clear_nvme_request(struct request *req)  { @@ -1123,7 +1123,7 @@ int nvme_execute_rq(struct request *rq, bool at_head)  		return nvme_req(rq)->status;  	return blk_status_to_errno(status);  } -EXPORT_SYMBOL_NS_GPL(nvme_execute_rq, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_execute_rq, "NVME_TARGET_PASSTHRU");  /*   * Returns 0 on success.  If the result is negative, it's a Linux error code; @@ -1203,7 +1203,7 @@ u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)  	return effects;  } -EXPORT_SYMBOL_NS_GPL(nvme_command_effects, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_command_effects, "NVME_TARGET_PASSTHRU");  u32 nvme_passthru_start(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)  { @@ -1223,7 +1223,7 @@ u32 nvme_passthru_start(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u8 opcode)  	}  	return effects;  } -EXPORT_SYMBOL_NS_GPL(nvme_passthru_start, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_passthru_start, "NVME_TARGET_PASSTHRU");  void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 effects,  		       struct nvme_command *cmd, int status) @@ -1268,7 +1268,7 @@ void nvme_passthru_end(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 effects,  		break;  	}  } -EXPORT_SYMBOL_NS_GPL(nvme_passthru_end, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_passthru_end, "NVME_TARGET_PASSTHRU");  /*   * Recommended frequency for KATO commands per NVMe 1.4 section 7.12.1: @@ -2034,7 +2034,7 @@ static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id,  	 * or smaller than a sector size yet, so catch this early and don't  	 * allow block I/O.  	 */ -	if (head->lba_shift > PAGE_SHIFT || head->lba_shift < SECTOR_SHIFT) { +	if (blk_validate_block_size(bs)) {  		bs = (1 << 9);  		valid = false;  	} @@ -2071,7 +2071,8 @@ static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id,  	lim->physical_block_size = min(phys_bs, atomic_bs);  	lim->io_min = phys_bs;  	lim->io_opt = io_opt; -	if (ns->ctrl->quirks & NVME_QUIRK_DEALLOCATE_ZEROES) +	if ((ns->ctrl->quirks & NVME_QUIRK_DEALLOCATE_ZEROES) && +	    (ns->ctrl->oncs & NVME_CTRL_ONCS_DSM))  		lim->max_write_zeroes_sectors = UINT_MAX;  	else  		lim->max_write_zeroes_sectors = ns->ctrl->max_zeroes_sectors; @@ -3260,8 +3261,9 @@ static int nvme_check_ctrl_fabric_info(struct nvme_ctrl *ctrl, struct nvme_id_ct  	}  	if (!ctrl->maxcmd) { -		dev_err(ctrl->device, "Maximum outstanding commands is 0\n"); -		return -EINVAL; +		dev_warn(ctrl->device, +			"Firmware bug: maximum outstanding commands is 0\n"); +		ctrl->maxcmd = ctrl->sqsize + 1;  	}  	return 0; @@ -3820,7 +3822,7 @@ struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid)  	srcu_read_unlock(&ctrl->srcu, srcu_idx);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(nvme_find_get_ns, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_find_get_ns, "NVME_TARGET_PASSTHRU");  /*   * Add the namespace to the controller list while keeping the list ordered. @@ -5030,7 +5032,7 @@ struct nvme_ctrl *nvme_ctrl_from_file(struct file *file)  		return NULL;  	return file->private_data;  } -EXPORT_SYMBOL_NS_GPL(nvme_ctrl_from_file, NVME_TARGET_PASSTHRU); +EXPORT_SYMBOL_NS_GPL(nvme_ctrl_from_file, "NVME_TARGET_PASSTHRU");  /*   * Check we didn't inadvertently grow the command structure sizes: diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 611b02c8a8b3..c4bb8dfe1a45 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -173,6 +173,11 @@ enum nvme_quirks {  	 * MSI (but not MSI-X) interrupts are broken and never fire.  	 */  	NVME_QUIRK_BROKEN_MSI			= (1 << 21), + +	/* +	 * Align dma pool segment size to 512 bytes +	 */ +	NVME_QUIRK_DMAPOOL_ALIGN_512		= (1 << 22),  };  /* diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 4c644bb7f069..e2634f437f33 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2172,6 +2172,7 @@ out:  static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)  { +	unsigned long dma_merge_boundary = dma_get_merge_boundary(dev->dev);  	u64 min_chunk = min_t(u64, preferred, PAGE_SIZE * MAX_ORDER_NR_PAGES);  	u64 hmminds = max_t(u32, dev->ctrl.hmminds * 4096, PAGE_SIZE * 2);  	u64 chunk_size; @@ -2180,7 +2181,7 @@ static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)  	 * If there is an IOMMU that can merge pages, try a virtually  	 * non-contiguous allocation for a single segment first.  	 */ -	if (!(PAGE_SIZE & dma_get_merge_boundary(dev->dev))) { +	if (dma_merge_boundary && (PAGE_SIZE & dma_merge_boundary) == 0) {  		if (!nvme_alloc_host_mem_single(dev, preferred))  			return 0;  	} @@ -2833,15 +2834,20 @@ static int nvme_disable_prepare_reset(struct nvme_dev *dev, bool shutdown)  static int nvme_setup_prp_pools(struct nvme_dev *dev)  { +	size_t small_align = 256; +  	dev->prp_page_pool = dma_pool_create("prp list page", dev->dev,  						NVME_CTRL_PAGE_SIZE,  						NVME_CTRL_PAGE_SIZE, 0);  	if (!dev->prp_page_pool)  		return -ENOMEM; +	if (dev->ctrl.quirks & NVME_QUIRK_DMAPOOL_ALIGN_512) +		small_align = 512; +  	/* Optimisation for I/Os between 4k and 128k */  	dev->prp_small_pool = dma_pool_create("prp list 256", dev->dev, -						256, 256, 0); +						256, small_align, 0);  	if (!dev->prp_small_pool) {  		dma_pool_destroy(dev->prp_page_pool);  		return -ENOMEM; @@ -3588,12 +3594,10 @@ static const struct pci_device_id nvme_id_table[] = {  				NVME_QUIRK_DEALLOCATE_ZEROES, },  	{ PCI_VDEVICE(INTEL, 0x0a54),	/* Intel P4500/P4600 */  		.driver_data = NVME_QUIRK_STRIPE_SIZE | -				NVME_QUIRK_DEALLOCATE_ZEROES |  				NVME_QUIRK_IGNORE_DEV_SUBNQN |  				NVME_QUIRK_BOGUS_NID, },  	{ PCI_VDEVICE(INTEL, 0x0a55),	/* Dell Express Flash P4600 */ -		.driver_data = NVME_QUIRK_STRIPE_SIZE | -				NVME_QUIRK_DEALLOCATE_ZEROES, }, +		.driver_data = NVME_QUIRK_STRIPE_SIZE, },  	{ PCI_VDEVICE(INTEL, 0xf1a5),	/* Intel 600P/P3100 */  		.driver_data = NVME_QUIRK_NO_DEEPEST_PS |  				NVME_QUIRK_MEDIUM_PRIO_SQ | @@ -3608,7 +3612,7 @@ static const struct pci_device_id nvme_id_table[] = {  	{ PCI_VDEVICE(REDHAT, 0x0010),	/* Qemu emulated controller */  		.driver_data = NVME_QUIRK_BOGUS_NID, },  	{ PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */ -		.driver_data = NVME_QUIRK_QDEPTH_ONE }, +		.driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, },  	{ PCI_DEVICE(0x126f, 0x2262),	/* Silicon Motion generic */  		.driver_data = NVME_QUIRK_NO_DEEPEST_PS |  				NVME_QUIRK_BOGUS_NID, }, diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c index baf7d2490152..86a2891d9bcc 100644 --- a/drivers/nvme/host/rdma.c +++ b/drivers/nvme/host/rdma.c @@ -1091,13 +1091,7 @@ destroy_io:  	}  destroy_admin:  	nvme_stop_keep_alive(&ctrl->ctrl); -	nvme_quiesce_admin_queue(&ctrl->ctrl); -	blk_sync_queue(ctrl->ctrl.admin_q); -	nvme_rdma_stop_queue(&ctrl->queues[0]); -	nvme_cancel_admin_tagset(&ctrl->ctrl); -	if (new) -		nvme_remove_admin_tag_set(&ctrl->ctrl); -	nvme_rdma_destroy_admin_queue(ctrl); +	nvme_rdma_teardown_admin_queue(ctrl, new);  	return ret;  } diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 3e416af2659f..b127d41dbbfe 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -2024,14 +2024,6 @@ static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)  	return __nvme_tcp_alloc_io_queues(ctrl);  } -static void nvme_tcp_destroy_io_queues(struct nvme_ctrl *ctrl, bool remove) -{ -	nvme_tcp_stop_io_queues(ctrl); -	if (remove) -		nvme_remove_io_tag_set(ctrl); -	nvme_tcp_free_io_queues(ctrl); -} -  static int nvme_tcp_configure_io_queues(struct nvme_ctrl *ctrl, bool new)  {  	int ret, nr_queues; @@ -2101,14 +2093,6 @@ out_free_io_queues:  	return ret;  } -static void nvme_tcp_destroy_admin_queue(struct nvme_ctrl *ctrl, bool remove) -{ -	nvme_tcp_stop_queue(ctrl, 0); -	if (remove) -		nvme_remove_admin_tag_set(ctrl); -	nvme_tcp_free_admin_queue(ctrl); -} -  static int nvme_tcp_configure_admin_queue(struct nvme_ctrl *ctrl, bool new)  {  	int error; @@ -2163,9 +2147,11 @@ static void nvme_tcp_teardown_admin_queue(struct nvme_ctrl *ctrl,  	blk_sync_queue(ctrl->admin_q);  	nvme_tcp_stop_queue(ctrl, 0);  	nvme_cancel_admin_tagset(ctrl); -	if (remove) +	if (remove) {  		nvme_unquiesce_admin_queue(ctrl); -	nvme_tcp_destroy_admin_queue(ctrl, remove); +		nvme_remove_admin_tag_set(ctrl); +	} +	nvme_tcp_free_admin_queue(ctrl);  	if (ctrl->tls_pskid) {  		dev_dbg(ctrl->device, "Wipe negotiated TLS_PSK %08x\n",  			ctrl->tls_pskid); @@ -2178,14 +2164,15 @@ static void nvme_tcp_teardown_io_queues(struct nvme_ctrl *ctrl,  {  	if (ctrl->queue_count <= 1)  		return; -	nvme_quiesce_admin_queue(ctrl);  	nvme_quiesce_io_queues(ctrl);  	nvme_sync_io_queues(ctrl);  	nvme_tcp_stop_io_queues(ctrl);  	nvme_cancel_tagset(ctrl); -	if (remove) +	if (remove) {  		nvme_unquiesce_io_queues(ctrl); -	nvme_tcp_destroy_io_queues(ctrl, remove); +		nvme_remove_io_tag_set(ctrl); +	} +	nvme_tcp_free_io_queues(ctrl);  }  static void nvme_tcp_reconnect_or_remove(struct nvme_ctrl *ctrl, @@ -2274,11 +2261,13 @@ destroy_io:  		nvme_sync_io_queues(ctrl);  		nvme_tcp_stop_io_queues(ctrl);  		nvme_cancel_tagset(ctrl); -		nvme_tcp_destroy_io_queues(ctrl, new); +		if (new) +			nvme_remove_io_tag_set(ctrl); +		nvme_tcp_free_io_queues(ctrl);  	}  destroy_admin:  	nvme_stop_keep_alive(ctrl); -	nvme_tcp_teardown_admin_queue(ctrl, false); +	nvme_tcp_teardown_admin_queue(ctrl, new);  	return ret;  } diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index 4fa8496a4d96..fa89b0549c36 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -139,7 +139,7 @@ static u16 nvmet_get_smart_log_all(struct nvmet_req *req,  	unsigned long idx;  	ctrl = req->sq->ctrl; -	xa_for_each(&ctrl->subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns) {  		/* we don't have the right data for file backed ns */  		if (!ns->bdev)  			continue; @@ -331,9 +331,10 @@ static u32 nvmet_format_ana_group(struct nvmet_req *req, u32 grpid,  	u32 count = 0;  	if (!(req->cmd->get_log_page.lsp & NVME_ANA_LOG_RGO)) { -		xa_for_each(&ctrl->subsys->namespaces, idx, ns) +		nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns) {  			if (ns->anagrpid == grpid)  				desc->nsids[count++] = cpu_to_le32(ns->nsid); +		}  	}  	desc->grpid = cpu_to_le32(grpid); @@ -772,7 +773,7 @@ static void nvmet_execute_identify_endgrp_list(struct nvmet_req *req)  		goto out;  	} -	xa_for_each(&ctrl->subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns) {  		if (ns->nsid <= min_endgid)  			continue; @@ -815,7 +816,7 @@ static void nvmet_execute_identify_nslist(struct nvmet_req *req, bool match_css)  		goto out;  	} -	xa_for_each(&ctrl->subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns) {  		if (ns->nsid <= min_nsid)  			continue;  		if (match_css && req->ns->csi != req->cmd->identify.csi) @@ -902,13 +903,18 @@ static void nvmet_execute_identify_ctrl_nvm(struct nvmet_req *req)  static void nvme_execute_identify_ns_nvm(struct nvmet_req *req)  {  	u16 status; +	struct nvme_id_ns_nvm *id;  	status = nvmet_req_find_ns(req);  	if (status)  		goto out; -	status = nvmet_copy_to_sgl(req, 0, ZERO_PAGE(0), -				   NVME_IDENTIFY_DATA_SIZE); +	id = kzalloc(sizeof(*id), GFP_KERNEL); +	if (!id) { +		status = NVME_SC_INTERNAL; +		goto out; +	} +	status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id));  out:  	nvmet_req_complete(req, status);  } diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index eeee9e9b854c..2b030f0efc38 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -810,18 +810,6 @@ static struct configfs_attribute *nvmet_ns_attrs[] = {  	NULL,  }; -bool nvmet_subsys_nsid_exists(struct nvmet_subsys *subsys, u32 nsid) -{ -	struct config_item *ns_item; -	char name[12]; - -	snprintf(name, sizeof(name), "%u", nsid); -	mutex_lock(&subsys->namespaces_group.cg_subsys->su_mutex); -	ns_item = config_group_find_item(&subsys->namespaces_group, name); -	mutex_unlock(&subsys->namespaces_group.cg_subsys->su_mutex); -	return ns_item != NULL; -} -  static void nvmet_ns_release(struct config_item *item)  {  	struct nvmet_ns *ns = to_nvmet_ns(item); @@ -2254,12 +2242,17 @@ static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item,  		const char *page, size_t count)  {  	struct list_head *entry; +	char *old_nqn, *new_nqn;  	size_t len;  	len = strcspn(page, "\n");  	if (!len || len > NVMF_NQN_FIELD_LEN - 1)  		return -EINVAL; +	new_nqn = kstrndup(page, len, GFP_KERNEL); +	if (!new_nqn) +		return -ENOMEM; +  	down_write(&nvmet_config_sem);  	list_for_each(entry, &nvmet_subsystems_group.cg_children) {  		struct config_item *item = @@ -2268,13 +2261,15 @@ static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item,  		if (!strncmp(config_item_name(item), page, len)) {  			pr_err("duplicate NQN %s\n", config_item_name(item));  			up_write(&nvmet_config_sem); +			kfree(new_nqn);  			return -EINVAL;  		}  	} -	memset(nvmet_disc_subsys->subsysnqn, 0, NVMF_NQN_FIELD_LEN); -	memcpy(nvmet_disc_subsys->subsysnqn, page, len); +	old_nqn = nvmet_disc_subsys->subsysnqn; +	nvmet_disc_subsys->subsysnqn = new_nqn;  	up_write(&nvmet_config_sem); +	kfree(old_nqn);  	return len;  } diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 1f4e9989663b..fde6c555af61 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -127,7 +127,7 @@ static u32 nvmet_max_nsid(struct nvmet_subsys *subsys)  	unsigned long idx;  	u32 nsid = 0; -	xa_for_each(&subsys->namespaces, idx, cur) +	nvmet_for_each_enabled_ns(&subsys->namespaces, idx, cur)  		nsid = cur->nsid;  	return nsid; @@ -441,11 +441,14 @@ u16 nvmet_req_find_ns(struct nvmet_req *req)  	struct nvmet_subsys *subsys = nvmet_req_subsys(req);  	req->ns = xa_load(&subsys->namespaces, nsid); -	if (unlikely(!req->ns)) { +	if (unlikely(!req->ns || !req->ns->enabled)) {  		req->error_loc = offsetof(struct nvme_common_command, nsid); -		if (nvmet_subsys_nsid_exists(subsys, nsid)) -			return NVME_SC_INTERNAL_PATH_ERROR; -		return NVME_SC_INVALID_NS | NVME_STATUS_DNR; +		if (!req->ns) /* ns doesn't exist! */ +			return NVME_SC_INVALID_NS | NVME_STATUS_DNR; + +		/* ns exists but it's disabled */ +		req->ns = NULL; +		return NVME_SC_INTERNAL_PATH_ERROR;  	}  	percpu_ref_get(&req->ns->ref); @@ -583,8 +586,6 @@ int nvmet_ns_enable(struct nvmet_ns *ns)  		goto out_unlock;  	ret = -EMFILE; -	if (subsys->nr_namespaces == NVMET_MAX_NAMESPACES) -		goto out_unlock;  	ret = nvmet_bdev_ns_enable(ns);  	if (ret == -ENOTBLK) @@ -599,38 +600,19 @@ int nvmet_ns_enable(struct nvmet_ns *ns)  	list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry)  		nvmet_p2pmem_ns_add_p2p(ctrl, ns); -	ret = percpu_ref_init(&ns->ref, nvmet_destroy_namespace, -				0, GFP_KERNEL); -	if (ret) -		goto out_dev_put; - -	if (ns->nsid > subsys->max_nsid) -		subsys->max_nsid = ns->nsid; - -	ret = xa_insert(&subsys->namespaces, ns->nsid, ns, GFP_KERNEL); -	if (ret) -		goto out_restore_subsys_maxnsid; -  	if (ns->pr.enable) {  		ret = nvmet_pr_init_ns(ns);  		if (ret) -			goto out_remove_from_subsys; +			goto out_dev_put;  	} -	subsys->nr_namespaces++; -  	nvmet_ns_changed(subsys, ns->nsid);  	ns->enabled = true; +	xa_set_mark(&subsys->namespaces, ns->nsid, NVMET_NS_ENABLED);  	ret = 0;  out_unlock:  	mutex_unlock(&subsys->lock);  	return ret; - -out_remove_from_subsys: -	xa_erase(&subsys->namespaces, ns->nsid); -out_restore_subsys_maxnsid: -	subsys->max_nsid = nvmet_max_nsid(subsys); -	percpu_ref_exit(&ns->ref);  out_dev_put:  	list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry)  		pci_dev_put(radix_tree_delete(&ctrl->p2p_ns_map, ns->nsid)); @@ -649,15 +631,37 @@ void nvmet_ns_disable(struct nvmet_ns *ns)  		goto out_unlock;  	ns->enabled = false; -	xa_erase(&ns->subsys->namespaces, ns->nsid); -	if (ns->nsid == subsys->max_nsid) -		subsys->max_nsid = nvmet_max_nsid(subsys); +	xa_clear_mark(&subsys->namespaces, ns->nsid, NVMET_NS_ENABLED);  	list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry)  		pci_dev_put(radix_tree_delete(&ctrl->p2p_ns_map, ns->nsid));  	mutex_unlock(&subsys->lock); +	if (ns->pr.enable) +		nvmet_pr_exit_ns(ns); + +	mutex_lock(&subsys->lock); +	nvmet_ns_changed(subsys, ns->nsid); +	nvmet_ns_dev_disable(ns); +out_unlock: +	mutex_unlock(&subsys->lock); +} + +void nvmet_ns_free(struct nvmet_ns *ns) +{ +	struct nvmet_subsys *subsys = ns->subsys; + +	nvmet_ns_disable(ns); + +	mutex_lock(&subsys->lock); + +	xa_erase(&subsys->namespaces, ns->nsid); +	if (ns->nsid == subsys->max_nsid) +		subsys->max_nsid = nvmet_max_nsid(subsys); + +	mutex_unlock(&subsys->lock); +  	/*  	 * Now that we removed the namespaces from the lookup list, we  	 * can kill the per_cpu ref and wait for any remaining references @@ -671,21 +675,9 @@ void nvmet_ns_disable(struct nvmet_ns *ns)  	wait_for_completion(&ns->disable_done);  	percpu_ref_exit(&ns->ref); -	if (ns->pr.enable) -		nvmet_pr_exit_ns(ns); -  	mutex_lock(&subsys->lock); -  	subsys->nr_namespaces--; -	nvmet_ns_changed(subsys, ns->nsid); -	nvmet_ns_dev_disable(ns); -out_unlock:  	mutex_unlock(&subsys->lock); -} - -void nvmet_ns_free(struct nvmet_ns *ns) -{ -	nvmet_ns_disable(ns);  	down_write(&nvmet_ana_sem);  	nvmet_ana_group_enabled[ns->anagrpid]--; @@ -699,15 +691,33 @@ struct nvmet_ns *nvmet_ns_alloc(struct nvmet_subsys *subsys, u32 nsid)  {  	struct nvmet_ns *ns; +	mutex_lock(&subsys->lock); + +	if (subsys->nr_namespaces == NVMET_MAX_NAMESPACES) +		goto out_unlock; +  	ns = kzalloc(sizeof(*ns), GFP_KERNEL);  	if (!ns) -		return NULL; +		goto out_unlock;  	init_completion(&ns->disable_done);  	ns->nsid = nsid;  	ns->subsys = subsys; +	if (percpu_ref_init(&ns->ref, nvmet_destroy_namespace, 0, GFP_KERNEL)) +		goto out_free; + +	if (ns->nsid > subsys->max_nsid) +		subsys->max_nsid = nsid; + +	if (xa_insert(&subsys->namespaces, ns->nsid, ns, GFP_KERNEL)) +		goto out_exit; + +	subsys->nr_namespaces++; + +	mutex_unlock(&subsys->lock); +  	down_write(&nvmet_ana_sem);  	ns->anagrpid = NVMET_DEFAULT_ANA_GRPID;  	nvmet_ana_group_enabled[ns->anagrpid]++; @@ -718,6 +728,14 @@ struct nvmet_ns *nvmet_ns_alloc(struct nvmet_subsys *subsys, u32 nsid)  	ns->csi = NVME_CSI_NVM;  	return ns; +out_exit: +	subsys->max_nsid = nvmet_max_nsid(subsys); +	percpu_ref_exit(&ns->ref); +out_free: +	kfree(ns); +out_unlock: +	mutex_unlock(&subsys->lock); +	return NULL;  }  static void nvmet_update_sq_head(struct nvmet_req *req) @@ -1394,7 +1412,7 @@ static void nvmet_setup_p2p_ns_map(struct nvmet_ctrl *ctrl,  	ctrl->p2p_client = get_device(req->p2p_client); -	xa_for_each(&ctrl->subsys->namespaces, idx, ns) +	nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns)  		nvmet_p2pmem_ns_add_p2p(ctrl, ns);  } diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index 0bda83d0fc3e..eaf31c823cbe 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -36,7 +36,7 @@ void nvmet_bdev_set_limits(struct block_device *bdev, struct nvme_id_ns *id)  	 */  	id->nsfeat |= 1 << 4;  	/* NPWG = Namespace Preferred Write Granularity. 0's based */ -	id->npwg = lpp0b; +	id->npwg = to0based(bdev_io_min(bdev) / bdev_logical_block_size(bdev));  	/* NPWA = Namespace Preferred Write Alignment. 0's based */  	id->npwa = id->npwg;  	/* NPDG = Namespace Preferred Deallocate Granularity. 0's based */ diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index 58328b35dc96..7233549f7c8a 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -24,6 +24,7 @@  #define NVMET_DEFAULT_VS		NVME_VS(2, 1, 0) +#define NVMET_NS_ENABLED		XA_MARK_1  #define NVMET_ASYNC_EVENTS		4  #define NVMET_ERROR_LOG_SLOTS		128  #define NVMET_NO_ERROR_LOC		((u16)-1) @@ -33,6 +34,12 @@  #define NVMET_FR_MAX_SIZE		8  #define NVMET_PR_LOG_QUEUE_SIZE		64 +#define nvmet_for_each_ns(xa, index, entry) \ +	xa_for_each(xa, index, entry) + +#define nvmet_for_each_enabled_ns(xa, index, entry) \ +	xa_for_each_marked(xa, index, entry, NVMET_NS_ENABLED) +  /*   * Supported optional AENs:   */ diff --git a/drivers/nvme/target/passthru.c b/drivers/nvme/target/passthru.c index 0f9b280c438d..30b21936b0c6 100644 --- a/drivers/nvme/target/passthru.c +++ b/drivers/nvme/target/passthru.c @@ -13,7 +13,7 @@  #include "../host/nvme.h"  #include "nvmet.h" -MODULE_IMPORT_NS(NVME_TARGET_PASSTHRU); +MODULE_IMPORT_NS("NVME_TARGET_PASSTHRU");  /*   * xarray to maintain one passthru subsystem per nvme controller. diff --git a/drivers/nvme/target/pr.c b/drivers/nvme/target/pr.c index 25a02b50d9f3..cd22d8333314 100644 --- a/drivers/nvme/target/pr.c +++ b/drivers/nvme/target/pr.c @@ -60,7 +60,7 @@ u16 nvmet_set_feat_resv_notif_mask(struct nvmet_req *req, u32 mask)  		goto success;  	} -	xa_for_each(&ctrl->subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns) {  		if (ns->pr.enable)  			WRITE_ONCE(ns->pr.notify_mask, mask);  	} @@ -828,12 +828,11 @@ static void nvmet_execute_pr_report(struct nvmet_req *req)  		goto out;  	} -	data = kmalloc(num_bytes, GFP_KERNEL); +	data = kzalloc(num_bytes, GFP_KERNEL);  	if (!data) {  		status = NVME_SC_INTERNAL;  		goto out;  	} -	memset(data, 0, num_bytes);  	data->gen = cpu_to_le32(atomic_read(&pr->generation));  	data->ptpls = 0;  	ctrl_eds = data->regctl_eds; @@ -1057,7 +1056,7 @@ int nvmet_ctrl_init_pr(struct nvmet_ctrl *ctrl)  	 * nvmet_pr_init_ns(), see more details in nvmet_ns_enable().  	 * So just check ns->pr.enable.  	 */ -	xa_for_each(&subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&subsys->namespaces, idx, ns) {  		if (ns->pr.enable) {  			ret = nvmet_pr_alloc_and_insert_pc_ref(ns, ctrl->cntlid,  							&ctrl->hostid); @@ -1068,7 +1067,7 @@ int nvmet_ctrl_init_pr(struct nvmet_ctrl *ctrl)  	return 0;  free_per_ctrl_refs: -	xa_for_each(&subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&subsys->namespaces, idx, ns) {  		if (ns->pr.enable) {  			pc_ref = xa_erase(&ns->pr_per_ctrl_refs, ctrl->cntlid);  			if (pc_ref) @@ -1088,7 +1087,7 @@ void nvmet_ctrl_destroy_pr(struct nvmet_ctrl *ctrl)  	kfifo_free(&ctrl->pr_log_mgr.log_queue);  	mutex_destroy(&ctrl->pr_log_mgr.lock); -	xa_for_each(&ctrl->subsys->namespaces, idx, ns) { +	nvmet_for_each_enabled_ns(&ctrl->subsys->namespaces, idx, ns) {  		if (ns->pr.enable) {  			pc_ref = xa_erase(&ns->pr_per_ctrl_refs, ctrl->cntlid);  			if (pc_ref) diff --git a/drivers/nvmem/lpc18xx_eeprom.c b/drivers/nvmem/lpc18xx_eeprom.c index a73acc7377d2..aa43f5f612f9 100644 --- a/drivers/nvmem/lpc18xx_eeprom.c +++ b/drivers/nvmem/lpc18xx_eeprom.c @@ -264,7 +264,7 @@ MODULE_DEVICE_TABLE(of, lpc18xx_eeprom_of_match);  static struct platform_driver lpc18xx_eeprom_driver = {  	.probe = lpc18xx_eeprom_probe, -	.remove_new = lpc18xx_eeprom_remove, +	.remove = lpc18xx_eeprom_remove,  	.driver = {  		.name = "lpc18xx-eeprom",  		.of_match_table = lpc18xx_eeprom_of_match, diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c index 9caf04667341..af953e1d9230 100644 --- a/drivers/nvmem/mtk-efuse.c +++ b/drivers/nvmem/mtk-efuse.c @@ -127,7 +127,7 @@ static void mtk_efuse_remove(struct platform_device *pdev)  static struct platform_driver mtk_efuse_driver = {  	.probe = mtk_efuse_probe, -	.remove_new = mtk_efuse_remove, +	.remove = mtk_efuse_remove,  	.driver = {  		.name = "mediatek,efuse",  		.of_match_table = mtk_efuse_of_match, diff --git a/drivers/of/address.c b/drivers/of/address.c index c5b925ac469f..8770004d9b08 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -340,6 +340,15 @@ static int of_bus_default_flags_match(struct device_node *np)  	return of_property_present(np, "#address-cells") && (of_bus_n_addr_cells(np) == 3);  } +static int of_bus_default_match(struct device_node *np) +{ +	/* +	 * Check for presence first since of_bus_n_addr_cells() will warn when +	 * walking parent nodes. +	 */ +	return of_property_present(np, "#address-cells"); +} +  /*   * Array of bus specific translators   */ @@ -384,7 +393,7 @@ static const struct of_bus of_busses[] = {  	{  		.name = "default",  		.addresses = "reg", -		.match = NULL, +		.match = of_bus_default_match,  		.count_cells = of_bus_default_count_cells,  		.map = of_bus_default_map,  		.translate = of_bus_default_translate, @@ -399,7 +408,6 @@ static const struct of_bus *of_match_bus(struct device_node *np)  	for (i = 0; i < ARRAY_SIZE(of_busses); i++)  		if (!of_busses[i].match || of_busses[i].match(np))  			return &of_busses[i]; -	BUG();  	return NULL;  } @@ -459,7 +467,8 @@ static int of_translate_one(const struct device_node *parent, const struct of_bu  	}  	if (ranges == NULL || rlen == 0) {  		offset = of_read_number(addr, na); -		memset(addr, 0, pna * 4); +		/* set address to zero, pass flags through */ +		memset(addr + pbus->flag_cells, 0, (pna - pbus->flag_cells) * 4);  		pr_debug("empty ranges; 1:1 translation\n");  		goto finish;  	} @@ -520,6 +529,8 @@ static u64 __of_translate_address(struct device_node *node,  	if (parent == NULL)  		return OF_BAD_ADDR;  	bus = of_match_bus(parent); +	if (!bus) +		return OF_BAD_ADDR;  	/* Count address cells & copy address locally */  	bus->count_cells(dev, &na, &ns); @@ -563,6 +574,8 @@ static u64 __of_translate_address(struct device_node *node,  		/* Get new parent bus and counts */  		pbus = of_match_bus(parent); +		if (!pbus) +			return OF_BAD_ADDR;  		pbus->count_cells(dev, &pna, &pns);  		if (!OF_CHECK_COUNTS(pna, pns)) {  			pr_err("Bad cell count for %pOF\n", dev); @@ -619,7 +632,7 @@ struct device_node *__of_get_dma_parent(const struct device_node *np)  	if (ret < 0)  		return of_get_parent(np); -	return of_node_get(args.np); +	return args.np;  }  #endif @@ -702,7 +715,7 @@ const __be32 *__of_get_address(struct device_node *dev, int index, int bar_no,  	/* match the parent's bus type */  	bus = of_match_bus(parent); -	if (strcmp(bus->name, "pci") && (bar_no >= 0)) +	if (!bus || (strcmp(bus->name, "pci") && (bar_no >= 0)))  		return NULL;  	/* Get "reg" or "assigned-addresses" property */ diff --git a/drivers/of/base.c b/drivers/of/base.c index 7dc394255a0a..6f5abea2462a 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -88,7 +88,8 @@ static bool __of_node_is_type(const struct device_node *np, const char *type)  }  #define EXCLUDED_DEFAULT_CELLS_PLATFORMS ( \ -	IS_ENABLED(CONFIG_SPARC) \ +	IS_ENABLED(CONFIG_SPARC) || \ +	of_find_compatible_node(NULL, NULL, "coreboot") \  )  int of_bus_n_addr_cells(struct device_node *np) @@ -1507,8 +1508,10 @@ int of_parse_phandle_with_args_map(const struct device_node *np,  			map_len--;  			/* Check if not found */ -			if (!new) +			if (!new) { +				ret = -EINVAL;  				goto put; +			}  			if (!of_device_is_available(new))  				match = 0; @@ -1518,17 +1521,20 @@ int of_parse_phandle_with_args_map(const struct device_node *np,  				goto put;  			/* Check for malformed properties */ -			if (WARN_ON(new_size > MAX_PHANDLE_ARGS)) -				goto put; -			if (map_len < new_size) +			if (WARN_ON(new_size > MAX_PHANDLE_ARGS) || +			    map_len < new_size) { +				ret = -EINVAL;  				goto put; +			}  			/* Move forward by new node's #<list>-cells amount */  			map += new_size;  			map_len -= new_size;  		} -		if (!match) +		if (!match) { +			ret = -ENOENT;  			goto put; +		}  		/* Get the <list>-map-pass-thru property (optional) */  		pass = of_get_property(cur, pass_name, NULL); diff --git a/drivers/of/empty_root.dts b/drivers/of/empty_root.dts index cf9e97a60f48..cbe169ba3db5 100644 --- a/drivers/of/empty_root.dts +++ b/drivers/of/empty_root.dts @@ -2,5 +2,12 @@  /dts-v1/;  / { - +	/* +	 * #address-cells/#size-cells are required properties at root node. +	 * Use 2 cells for both address cells and size cells in order to fully +	 * support 64-bit addresses and sizes on systems using this empty root +	 * node. +	 */ +	#address-cells = <0x02>; +	#size-cells = <0x02>;  }; diff --git a/drivers/of/irq.c b/drivers/of/irq.c index 67fc0ceaa5f5..98b1cf78ecac 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c @@ -111,6 +111,7 @@ const __be32 *of_irq_parse_imap_parent(const __be32 *imap, int len, struct of_ph  	else  		np = of_find_node_by_phandle(be32_to_cpup(imap));  	imap++; +	len--;  	/* Check if not found */  	if (!np) { @@ -354,6 +355,7 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar  		return of_irq_parse_oldworld(device, index, out_irq);  	/* Get the reg property (if any) */ +	addr_len = 0;  	addr = of_get_property(device, "reg", &addr_len);  	/* Prevent out-of-bounds read in case of longer interrupt parent address size */ diff --git a/drivers/of/property.c b/drivers/of/property.c index 519bf9229e61..cfc8aea002e4 100644 --- a/drivers/of/property.c +++ b/drivers/of/property.c @@ -1286,7 +1286,6 @@ DEFINE_SIMPLE_PROP(iommus, "iommus", "#iommu-cells")  DEFINE_SIMPLE_PROP(mboxes, "mboxes", "#mbox-cells")  DEFINE_SIMPLE_PROP(io_channels, "io-channels", "#io-channel-cells")  DEFINE_SIMPLE_PROP(io_backends, "io-backends", "#io-backend-cells") -DEFINE_SIMPLE_PROP(interrupt_parent, "interrupt-parent", NULL)  DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-cells")  DEFINE_SIMPLE_PROP(power_domains, "power-domains", "#power-domain-cells")  DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "#hwlock-cells") @@ -1432,7 +1431,6 @@ static const struct supplier_bindings of_supplier_bindings[] = {  	{ .parse_prop = parse_mboxes, },  	{ .parse_prop = parse_io_channels, },  	{ .parse_prop = parse_io_backends, }, -	{ .parse_prop = parse_interrupt_parent, },  	{ .parse_prop = parse_dmas, .optional = true, },  	{ .parse_prop = parse_power_domains, },  	{ .parse_prop = parse_hwlocks, }, diff --git a/drivers/of/unittest-data/tests-address.dtsi b/drivers/of/unittest-data/tests-address.dtsi index 3344f15c3755..f02a181bb125 100644 --- a/drivers/of/unittest-data/tests-address.dtsi +++ b/drivers/of/unittest-data/tests-address.dtsi @@ -114,6 +114,7 @@  				device_type = "pci";  				ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x7f00000>,  					 <0x81000000 0 0x00000000 0 0xefff0000 0 0x0010000>; +				dma-ranges = <0x43000000 0x10 0x00 0x00 0x00 0x00 0x10000000>;  				reg = <0x00000000 0xd1070000 0x20000>;  				pci@0,0 { @@ -142,6 +143,7 @@  							#size-cells = <0x01>;  							ranges = <0xa0000000 0 0 0 0x2000000>,  								 <0xb0000000 1 0 0 0x1000000>; +							dma-ranges = <0xc0000000 0x43000000 0x10 0x00 0x10000000>;  							dev@e0000000 {  								reg = <0xa0001000 0x1000>, diff --git a/drivers/of/unittest-data/tests-platform.dtsi b/drivers/of/unittest-data/tests-platform.dtsi index fa39611071b3..cd310b26b50c 100644 --- a/drivers/of/unittest-data/tests-platform.dtsi +++ b/drivers/of/unittest-data/tests-platform.dtsi @@ -34,5 +34,18 @@  				};  			};  		}; + +		platform-tests-2 { +			// No #address-cells or #size-cells +			node { +				#address-cells = <1>; +				#size-cells = <1>; + +				test-device@100 { +					compatible = "test-sub-device"; +					reg = <0x100 1>; +				}; +			}; +		};  	};  }; diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index daf9a2dddd7e..0fa0c0fd9a6a 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -1213,6 +1213,44 @@ static void __init of_unittest_pci_dma_ranges(void)  	of_node_put(np);  } +static void __init of_unittest_pci_empty_dma_ranges(void) +{ +	struct device_node *np; +	struct of_pci_range range; +	struct of_pci_range_parser parser; + +	if (!IS_ENABLED(CONFIG_PCI)) +		return; + +	np = of_find_node_by_path("/testcase-data/address-tests2/pcie@d1070000/pci@0,0/dev@0,0/local-bus@0"); +	if (!np) { +		pr_err("missing testcase data\n"); +		return; +	} + +	if (of_pci_dma_range_parser_init(&parser, np)) { +		pr_err("missing dma-ranges property\n"); +		return; +	} + +	/* +	 * Get the dma-ranges from the device tree +	 */ +	for_each_of_pci_range(&parser, &range) { +		unittest(range.size == 0x10000000, +			 "for_each_of_pci_range wrong size on node %pOF size=%llx\n", +			 np, range.size); +		unittest(range.cpu_addr == 0x00000000, +			 "for_each_of_pci_range wrong CPU addr (%llx) on node %pOF", +			 range.cpu_addr, np); +		unittest(range.pci_addr == 0xc0000000, +			 "for_each_of_pci_range wrong DMA addr (%llx) on node %pOF", +			 range.pci_addr, np); +	} + +	of_node_put(np); +} +  static void __init of_unittest_bus_ranges(void)  {  	struct device_node *np; @@ -1342,6 +1380,7 @@ static void __init of_unittest_bus_3cell_ranges(void)  static void __init of_unittest_reg(void)  {  	struct device_node *np; +	struct resource res;  	int ret;  	u64 addr, size; @@ -1358,6 +1397,19 @@ static void __init of_unittest_reg(void)  		np, addr);  	of_node_put(np); + +	np = of_find_node_by_path("/testcase-data/platform-tests-2/node/test-device@100"); +	if (!np) { +		pr_err("missing testcase data\n"); +		return; +	} + +	ret = of_address_to_resource(np, 0, &res); +	unittest(ret == -EINVAL, "of_address_to_resource(%pOF) expected error on untranslatable address\n", +		 np); + +	of_node_put(np); +  }  struct of_unittest_expected_res { @@ -1970,7 +2022,7 @@ static const struct of_device_id unittest_match[] = {  static struct platform_driver unittest_driver = {  	.probe			= unittest_probe, -	.remove_new		= unittest_remove, +	.remove			= unittest_remove,  	.driver = {  		.name		= "unittest",  		.of_match_table	= unittest_match, @@ -2071,7 +2123,7 @@ static const struct of_device_id unittest_gpio_id[] = {  static struct platform_driver unittest_gpio_driver = {  	.probe	= unittest_gpio_probe, -	.remove_new = unittest_gpio_remove, +	.remove = unittest_gpio_remove,  	.driver	= {  		.name		= "unittest-gpio",  		.of_match_table	= unittest_gpio_id, @@ -2891,7 +2943,7 @@ static const struct of_device_id unittest_i2c_bus_match[] = {  static struct platform_driver unittest_i2c_bus_driver = {  	.probe			= unittest_i2c_bus_probe, -	.remove_new		= unittest_i2c_bus_remove, +	.remove			= unittest_i2c_bus_remove,  	.driver = {  		.name		= "unittest-i2c-bus",  		.of_match_table	= unittest_i2c_bus_match, @@ -4272,6 +4324,7 @@ static int __init of_unittest(void)  	of_unittest_dma_get_max_cpu_address();  	of_unittest_parse_dma_ranges();  	of_unittest_pci_dma_ranges(); +	of_unittest_pci_empty_dma_ranges();  	of_unittest_bus_ranges();  	of_unittest_bus_3cell_ranges();  	of_unittest_reg(); diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index b49cb010a4d8..e71674753711 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -369,7 +369,7 @@ MODULE_ALIAS("platform:platform-leds");  static struct platform_driver hppa_mainboard_led_driver = {  	.probe		= platform_led_probe, -	.remove_new	= platform_led_remove, +	.remove		= platform_led_remove,  	.driver		= {  		.name	= "platform-leds",  	}, diff --git a/drivers/parport/parport_amiga.c b/drivers/parport/parport_amiga.c index e06c7b2aac5c..6a819bd00866 100644 --- a/drivers/parport/parport_amiga.c +++ b/drivers/parport/parport_amiga.c @@ -236,7 +236,7 @@ static void __exit amiga_parallel_remove(struct platform_device *pdev)   * triggering a section mismatch warning.   */  static struct platform_driver amiga_parallel_driver __refdata = { -	.remove_new = __exit_p(amiga_parallel_remove), +	.remove = __exit_p(amiga_parallel_remove),  	.driver   = {  		.name	= "amiga-parallel",  	}, diff --git a/drivers/parport/parport_sunbpp.c b/drivers/parport/parport_sunbpp.c index 949236a7a27c..d6495f2f90a7 100644 --- a/drivers/parport/parport_sunbpp.c +++ b/drivers/parport/parport_sunbpp.c @@ -368,7 +368,7 @@ static struct platform_driver bpp_sbus_driver = {  		.of_match_table = bpp_match,  	},  	.probe		= bpp_probe, -	.remove_new	= bpp_remove, +	.remove		= bpp_remove,  };  module_platform_driver(bpp_sbus_driver); diff --git a/drivers/pci/msi/irqdomain.c b/drivers/pci/msi/irqdomain.c index 569125726b3e..d7ba8795d60f 100644 --- a/drivers/pci/msi/irqdomain.c +++ b/drivers/pci/msi/irqdomain.c @@ -350,8 +350,11 @@ bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,  	domain = dev_get_msi_domain(&pdev->dev); -	if (!domain || !irq_domain_is_hierarchy(domain)) -		return mode == ALLOW_LEGACY; +	if (!domain || !irq_domain_is_hierarchy(domain)) { +		if (IS_ENABLED(CONFIG_PCI_MSI_ARCH_FALLBACKS)) +			return mode == ALLOW_LEGACY; +		return false; +	}  	if (!irq_domain_is_msi_parent(domain)) {  		/* diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c index 3a45879d85db..2f647cac4cae 100644 --- a/drivers/pci/msi/msi.c +++ b/drivers/pci/msi/msi.c @@ -433,6 +433,10 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,  	if (WARN_ON_ONCE(dev->msi_enabled))  		return -EINVAL; +	/* Test for the availability of MSI support */ +	if (!pci_msi_domain_supports(dev, 0, ALLOW_LEGACY)) +		return -ENOTSUPP; +  	nvec = pci_msi_vec_count(dev);  	if (nvec < 0)  		return nvec; diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 0b29ec6e8e5e..661f98c6c63a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -6232,12 +6232,14 @@ u8 pcie_get_supported_speeds(struct pci_dev *dev)  	pcie_capability_read_dword(dev, PCI_EXP_LNKCAP2, &lnkcap2);  	speeds = lnkcap2 & PCI_EXP_LNKCAP2_SLS; +	/* Ignore speeds higher than Max Link Speed */ +	pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &lnkcap); +	speeds &= GENMASK(lnkcap & PCI_EXP_LNKCAP_SLS, 0); +  	/* PCIe r3.0-compliant */  	if (speeds)  		return speeds; -	pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &lnkcap); -  	/* Synthesize from the Max Link Speed field */  	if ((lnkcap & PCI_EXP_LNKCAP_SLS) == PCI_EXP_LNKCAP_SLS_5_0GB)  		speeds = PCI_EXP_LNKCAP2_SLS_5_0GB | PCI_EXP_LNKCAP2_SLS_2_5GB; diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index 80c5ba8d8296..34ce9f834d0c 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c @@ -231,7 +231,7 @@ int pcie_aer_is_native(struct pci_dev *dev)  	return pcie_ports_native || host->native_aer;  } -EXPORT_SYMBOL_NS_GPL(pcie_aer_is_native, CXL); +EXPORT_SYMBOL_NS_GPL(pcie_aer_is_native, "CXL");  static int pci_enable_pcie_error_reporting(struct pci_dev *dev)  { @@ -802,7 +802,7 @@ void pci_print_aer(struct pci_dev *dev, int aer_severity,  	trace_aer_event(dev_name(&dev->dev), (status & ~mask),  			aer_severity, tlp_header_valid, &aer->header_log);  } -EXPORT_SYMBOL_NS_GPL(pci_print_aer, CXL); +EXPORT_SYMBOL_NS_GPL(pci_print_aer, "CXL");  /**   * add_error_device - list device to be handled diff --git a/drivers/pci/pcie/bwctrl.c b/drivers/pci/pcie/bwctrl.c index b59cacc740fa..0a5e7efbce2c 100644 --- a/drivers/pci/pcie/bwctrl.c +++ b/drivers/pci/pcie/bwctrl.c @@ -303,14 +303,17 @@ static int pcie_bwnotif_probe(struct pcie_device *srv)  	if (ret)  		return ret; -	ret = devm_request_irq(&srv->device, srv->irq, pcie_bwnotif_irq, -			       IRQF_SHARED, "PCIe bwctrl", srv); -	if (ret) -		return ret; -  	scoped_guard(rwsem_write, &pcie_bwctrl_setspeed_rwsem) {  		scoped_guard(rwsem_write, &pcie_bwctrl_lbms_rwsem) { -			port->link_bwctrl = no_free_ptr(data); +			port->link_bwctrl = data; + +			ret = request_irq(srv->irq, pcie_bwnotif_irq, +					  IRQF_SHARED, "PCIe bwctrl", srv); +			if (ret) { +				port->link_bwctrl = NULL; +				return ret; +			} +  			pcie_bwnotif_enable(srv);  		}  	} @@ -331,11 +334,15 @@ static void pcie_bwnotif_remove(struct pcie_device *srv)  	pcie_cooling_device_unregister(data->cdev); -	pcie_bwnotif_disable(srv->port); +	scoped_guard(rwsem_write, &pcie_bwctrl_setspeed_rwsem) { +		scoped_guard(rwsem_write, &pcie_bwctrl_lbms_rwsem) { +			pcie_bwnotif_disable(srv->port); + +			free_irq(srv->irq, srv); -	scoped_guard(rwsem_write, &pcie_bwctrl_setspeed_rwsem) -		scoped_guard(rwsem_write, &pcie_bwctrl_lbms_rwsem)  			srv->port->link_bwctrl = NULL; +		} +	}  }  static int pcie_bwnotif_suspend(struct pcie_device *srv) diff --git a/drivers/pci/pcie/portdrv.c b/drivers/pci/pcie/portdrv.c index 5e10306b6308..02e73099bad0 100644 --- a/drivers/pci/pcie/portdrv.c +++ b/drivers/pci/pcie/portdrv.c @@ -265,12 +265,14 @@ static int get_port_device_capability(struct pci_dev *dev)  	    (pcie_ports_dpc_native || (services & PCIE_PORT_SERVICE_AER)))  		services |= PCIE_PORT_SERVICE_DPC; +	/* Enable bandwidth control if more than one speed is supported. */  	if (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM ||  	    pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) {  		u32 linkcap;  		pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &linkcap); -		if (linkcap & PCI_EXP_LNKCAP_LBNC) +		if (linkcap & PCI_EXP_LNKCAP_LBNC && +		    hweight8(dev->supported_speeds) > 1)  			services |= PCIE_PORT_SERVICE_BWCTRL;  	} diff --git a/drivers/pcmcia/bcm63xx_pcmcia.c b/drivers/pcmcia/bcm63xx_pcmcia.c index 5bda3e6d43d8..85874b7a9f36 100644 --- a/drivers/pcmcia/bcm63xx_pcmcia.c +++ b/drivers/pcmcia/bcm63xx_pcmcia.c @@ -453,7 +453,7 @@ static void bcm63xx_drv_pcmcia_remove(struct platform_device *pdev)  struct platform_driver bcm63xx_pcmcia_driver = {  	.probe	= bcm63xx_drv_pcmcia_probe, -	.remove_new = bcm63xx_drv_pcmcia_remove, +	.remove = bcm63xx_drv_pcmcia_remove,  	.driver	= {  		.name	= "bcm63xx_pcmcia",  	}, diff --git a/drivers/pcmcia/db1xxx_ss.c b/drivers/pcmcia/db1xxx_ss.c index 509713b9a502..85d2616061dd 100644 --- a/drivers/pcmcia/db1xxx_ss.c +++ b/drivers/pcmcia/db1xxx_ss.c @@ -592,7 +592,7 @@ static struct platform_driver db1x_pcmcia_socket_driver = {  		.name	= "db1xxx_pcmcia",  	},  	.probe		= db1x_pcmcia_socket_probe, -	.remove_new	= db1x_pcmcia_socket_remove, +	.remove		= db1x_pcmcia_socket_remove,  };  module_platform_driver(db1x_pcmcia_socket_driver); diff --git a/drivers/pcmcia/electra_cf.c b/drivers/pcmcia/electra_cf.c index 5ae826e54811..3bdd939dd2f4 100644 --- a/drivers/pcmcia/electra_cf.c +++ b/drivers/pcmcia/electra_cf.c @@ -342,7 +342,7 @@ static struct platform_driver electra_cf_driver = {  		.of_match_table = electra_cf_match,  	},  	.probe	  = electra_cf_probe, -	.remove_new = electra_cf_remove, +	.remove   = electra_cf_remove,  };  module_platform_driver(electra_cf_driver); diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index 80137c7afe0d..f0ccf479f36e 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c @@ -306,7 +306,7 @@ static struct platform_driver omap_cf_driver = {  	.driver = {  		.name	= driver_name,  	}, -	.remove_new	= __exit_p(omap_cf_remove), +	.remove		= __exit_p(omap_cf_remove),  };  static int __init omap_cf_init(void) diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c index 457fb81b497a..370a8e16dc81 100644 --- a/drivers/pcmcia/pxa2xx_base.c +++ b/drivers/pcmcia/pxa2xx_base.c @@ -336,7 +336,7 @@ static const struct dev_pm_ops pxa2xx_drv_pcmcia_pm_ops = {  static struct platform_driver pxa2xx_pcmcia_driver = {  	.probe		= pxa2xx_drv_pcmcia_probe, -	.remove_new	= pxa2xx_drv_pcmcia_remove, +	.remove		= pxa2xx_drv_pcmcia_remove,  	.driver		= {  		.name	= "pxa2xx-pcmcia",  		.pm	= &pxa2xx_drv_pcmcia_pm_ops, diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index ccb219c38761..7b5ac8fe811d 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c @@ -177,7 +177,7 @@ static struct platform_driver sa11x0_pcmcia_driver = {  		.name		= "sa11x0-pcmcia",  	},  	.probe		= sa11x0_drv_pcmcia_probe, -	.remove_new	= sa11x0_drv_pcmcia_remove, +	.remove		= sa11x0_drv_pcmcia_remove,  };  /* sa11x0_pcmcia_init() diff --git a/drivers/pcmcia/xxs1500_ss.c b/drivers/pcmcia/xxs1500_ss.c index 2a93fbbd128d..f84dd5914a6b 100644 --- a/drivers/pcmcia/xxs1500_ss.c +++ b/drivers/pcmcia/xxs1500_ss.c @@ -316,7 +316,7 @@ static struct platform_driver xxs1500_pcmcia_socket_driver = {  		.name	= "xxs1500_pcmcia",  	},  	.probe		= xxs1500_pcmcia_probe, -	.remove_new	= xxs1500_pcmcia_remove, +	.remove		= xxs1500_pcmcia_remove,  };  module_platform_driver(xxs1500_pcmcia_socket_driver); diff --git a/drivers/peci/controller/peci-aspeed.c b/drivers/peci/controller/peci-aspeed.c index b93eb6f43b98..ad3a7d71ed4c 100644 --- a/drivers/peci/controller/peci-aspeed.c +++ b/drivers/peci/controller/peci-aspeed.c @@ -597,4 +597,4 @@ MODULE_AUTHOR("Ryan Chen <ryan_chen@aspeedtech.com>");  MODULE_AUTHOR("Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>");  MODULE_DESCRIPTION("ASPEED PECI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PECI); +MODULE_IMPORT_NS("PECI"); diff --git a/drivers/peci/controller/peci-npcm.c b/drivers/peci/controller/peci-npcm.c index fa91be58f6f3..c77591ca583d 100644 --- a/drivers/peci/controller/peci-npcm.c +++ b/drivers/peci/controller/peci-npcm.c @@ -295,4 +295,4 @@ module_platform_driver(npcm_peci_driver);  MODULE_AUTHOR("Tomer Maimon <tomer.maimon@nuvoton.com>");  MODULE_DESCRIPTION("NPCM PECI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PECI); +MODULE_IMPORT_NS("PECI"); diff --git a/drivers/peci/core.c b/drivers/peci/core.c index 25e46579dd9c..936c1fadefe5 100644 --- a/drivers/peci/core.c +++ b/drivers/peci/core.c @@ -158,7 +158,7 @@ err_put:  	return ERR_PTR(ret);  } -EXPORT_SYMBOL_NS_GPL(devm_peci_controller_add, PECI); +EXPORT_SYMBOL_NS_GPL(devm_peci_controller_add, "PECI");  static const struct peci_device_id *  peci_bus_match_device_id(const struct peci_device_id *id, struct peci_device *device) diff --git a/drivers/peci/cpu.c b/drivers/peci/cpu.c index 152bbd8e717a..2dac8ba82787 100644 --- a/drivers/peci/cpu.c +++ b/drivers/peci/cpu.c @@ -32,7 +32,7 @@ int peci_temp_read(struct peci_device *device, s16 *temp_raw)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(peci_temp_read, PECI_CPU); +EXPORT_SYMBOL_NS_GPL(peci_temp_read, "PECI_CPU");  /**   * peci_pcs_read() - read PCS register @@ -64,7 +64,7 @@ out_req_free:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(peci_pcs_read, PECI_CPU); +EXPORT_SYMBOL_NS_GPL(peci_pcs_read, "PECI_CPU");  /**   * peci_pci_local_read() - read 32-bit memory location using raw address @@ -99,7 +99,7 @@ out_req_free:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(peci_pci_local_read, PECI_CPU); +EXPORT_SYMBOL_NS_GPL(peci_pci_local_read, "PECI_CPU");  /**   * peci_ep_pci_local_read() - read 32-bit memory location using raw address @@ -135,7 +135,7 @@ out_req_free:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(peci_ep_pci_local_read, PECI_CPU); +EXPORT_SYMBOL_NS_GPL(peci_ep_pci_local_read, "PECI_CPU");  /**   * peci_mmio_read() - read 32-bit memory location using 64-bit bar offset address @@ -172,7 +172,7 @@ out_req_free:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(peci_mmio_read, PECI_CPU); +EXPORT_SYMBOL_NS_GPL(peci_mmio_read, "PECI_CPU");  static const char * const peci_adev_types[] = {  	"cputemp", @@ -337,4 +337,4 @@ module_peci_driver(peci_cpu_driver);  MODULE_AUTHOR("Iwona Winiarska <iwona.winiarska@intel.com>");  MODULE_DESCRIPTION("PECI CPU driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(PECI); +MODULE_IMPORT_NS("PECI"); diff --git a/drivers/peci/device.c b/drivers/peci/device.c index 37ca7dd61807..416635029f55 100644 --- a/drivers/peci/device.c +++ b/drivers/peci/device.c @@ -230,13 +230,13 @@ int __peci_driver_register(struct peci_driver *driver, struct module *owner,  	return driver_register(&driver->driver);  } -EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI); +EXPORT_SYMBOL_NS_GPL(__peci_driver_register, "PECI");  void peci_driver_unregister(struct peci_driver *driver)  {  	driver_unregister(&driver->driver);  } -EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI); +EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, "PECI");  static void peci_device_release(struct device *dev)  { diff --git a/drivers/peci/request.c b/drivers/peci/request.c index 87eefe66743f..e6327af45fc7 100644 --- a/drivers/peci/request.c +++ b/drivers/peci/request.c @@ -128,7 +128,7 @@ int peci_request_status(struct peci_request *req)  	return -EIO;  } -EXPORT_SYMBOL_NS_GPL(peci_request_status, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_status, "PECI");  static int peci_request_xfer(struct peci_request *req)  { @@ -213,7 +213,7 @@ struct peci_request *peci_request_alloc(struct peci_device *device, u8 tx_len, u  	return req;  } -EXPORT_SYMBOL_NS_GPL(peci_request_alloc, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_alloc, "PECI");  /**   * peci_request_free() - free peci_request @@ -223,7 +223,7 @@ void peci_request_free(struct peci_request *req)  {  	kfree(req);  } -EXPORT_SYMBOL_NS_GPL(peci_request_free, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_free, "PECI");  struct peci_request *peci_xfer_get_dib(struct peci_device *device)  { @@ -244,7 +244,7 @@ struct peci_request *peci_xfer_get_dib(struct peci_device *device)  	return req;  } -EXPORT_SYMBOL_NS_GPL(peci_xfer_get_dib, PECI); +EXPORT_SYMBOL_NS_GPL(peci_xfer_get_dib, "PECI");  struct peci_request *peci_xfer_get_temp(struct peci_device *device)  { @@ -265,7 +265,7 @@ struct peci_request *peci_xfer_get_temp(struct peci_device *device)  	return req;  } -EXPORT_SYMBOL_NS_GPL(peci_xfer_get_temp, PECI); +EXPORT_SYMBOL_NS_GPL(peci_xfer_get_temp, "PECI");  static struct peci_request *  __pkg_cfg_read(struct peci_device *device, u8 index, u16 param, u8 len) @@ -397,44 +397,44 @@ u8 peci_request_data_readb(struct peci_request *req)  {  	return req->rx.buf[1];  } -EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_data_readb, "PECI");  u16 peci_request_data_readw(struct peci_request *req)  {  	return get_unaligned_le16(&req->rx.buf[1]);  } -EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_data_readw, "PECI");  u32 peci_request_data_readl(struct peci_request *req)  {  	return get_unaligned_le32(&req->rx.buf[1]);  } -EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_data_readl, "PECI");  u64 peci_request_data_readq(struct peci_request *req)  {  	return get_unaligned_le64(&req->rx.buf[1]);  } -EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_data_readq, "PECI");  u64 peci_request_dib_read(struct peci_request *req)  {  	return get_unaligned_le64(&req->rx.buf[0]);  } -EXPORT_SYMBOL_NS_GPL(peci_request_dib_read, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_dib_read, "PECI");  s16 peci_request_temp_read(struct peci_request *req)  {  	return get_unaligned_le16(&req->rx.buf[0]);  } -EXPORT_SYMBOL_NS_GPL(peci_request_temp_read, PECI); +EXPORT_SYMBOL_NS_GPL(peci_request_temp_read, "PECI");  #define __read_pkg_config(x, type) \  struct peci_request *peci_xfer_pkg_cfg_##x(struct peci_device *device, u8 index, u16 param) \  { \  	return __pkg_cfg_read(device, index, param, sizeof(type)); \  } \ -EXPORT_SYMBOL_NS_GPL(peci_xfer_pkg_cfg_##x, PECI) +EXPORT_SYMBOL_NS_GPL(peci_xfer_pkg_cfg_##x, "PECI")  __read_pkg_config(readb, u8);  __read_pkg_config(readw, u16); @@ -447,7 +447,7 @@ peci_xfer_pci_cfg_local_##x(struct peci_device *device, u8 bus, u8 dev, u8 func,  { \  	return __pci_cfg_local_read(device, bus, dev, func, reg, sizeof(type)); \  } \ -EXPORT_SYMBOL_NS_GPL(peci_xfer_pci_cfg_local_##x, PECI) +EXPORT_SYMBOL_NS_GPL(peci_xfer_pci_cfg_local_##x, "PECI")  __read_pci_config_local(readb, u8);  __read_pci_config_local(readw, u16); @@ -459,7 +459,7 @@ peci_xfer_ep_pci_cfg_##x(struct peci_device *device, u8 seg, u8 bus, u8 dev, u8  { \  	return __ep_pci_cfg_read(device, msg_type, seg, bus, dev, func, reg, sizeof(type)); \  } \ -EXPORT_SYMBOL_NS_GPL(peci_xfer_ep_pci_cfg_##x, PECI) +EXPORT_SYMBOL_NS_GPL(peci_xfer_ep_pci_cfg_##x, "PECI")  __read_ep_pci_config(local_readb, PECI_ENDPTCFG_TYPE_LOCAL_PCI, u8);  __read_ep_pci_config(local_readw, PECI_ENDPTCFG_TYPE_LOCAL_PCI, u16); @@ -476,7 +476,7 @@ struct peci_request *peci_xfer_ep_mmio##y##_##x(struct peci_device *device, u8 b  			      offset, PECI_RDENDPTCFG_MMIO_WR_LEN_BASE + sizeof(type1), \  			      sizeof(type2)); \  } \ -EXPORT_SYMBOL_NS_GPL(peci_xfer_ep_mmio##y##_##x, PECI) +EXPORT_SYMBOL_NS_GPL(peci_xfer_ep_mmio##y##_##x, "PECI")  __read_ep_mmio(readl, 32, PECI_ENDPTCFG_ADDR_TYPE_MMIO_D, u32, u32);  __read_ep_mmio(readl, 64, PECI_ENDPTCFG_ADDR_TYPE_MMIO_Q, u64, u32); diff --git a/drivers/perf/cxl_pmu.c b/drivers/perf/cxl_pmu.c index bee4b5b52ec6..d6693519eaee 100644 --- a/drivers/perf/cxl_pmu.c +++ b/drivers/perf/cxl_pmu.c @@ -977,7 +977,7 @@ static __exit void cxl_pmu_exit(void)  MODULE_DESCRIPTION("CXL Performance Monitor Driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(CXL); +MODULE_IMPORT_NS("CXL");  module_init(cxl_pmu_init);  module_exit(cxl_pmu_exit);  MODULE_ALIAS_CXL(CXL_DEVICE_PMU); diff --git a/drivers/perf/riscv_pmu_sbi.c b/drivers/perf/riscv_pmu_sbi.c index 1aa303f76cc7..194c153e5d71 100644 --- a/drivers/perf/riscv_pmu_sbi.c +++ b/drivers/perf/riscv_pmu_sbi.c @@ -507,8 +507,7 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)  {  	u32 type = event->attr.type;  	u64 config = event->attr.config; -	u64 raw_config_val; -	int ret; +	int ret = -ENOENT;  	/*  	 * Ensure we are finished checking standard hardware events for @@ -528,21 +527,23 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)  	case PERF_TYPE_RAW:  		/*  		 * As per SBI specification, the upper 16 bits must be unused -		 * for a raw event. +		 * for a hardware raw event.  		 * Bits 63:62 are used to distinguish between raw events  		 * 00 - Hardware raw event  		 * 10 - SBI firmware events  		 * 11 - Risc-V platform specific firmware event  		 */ -		raw_config_val = config & RISCV_PMU_RAW_EVENT_MASK; +  		switch (config >> 62) {  		case 0: -			ret = RISCV_PMU_RAW_EVENT_IDX; -			*econfig = raw_config_val; +			/* Return error any bits [48-63] is set  as it is not allowed by the spec */ +			if (!(config & ~RISCV_PMU_RAW_EVENT_MASK)) { +				*econfig = config & RISCV_PMU_RAW_EVENT_MASK; +				ret = RISCV_PMU_RAW_EVENT_IDX; +			}  			break;  		case 2: -			ret = (raw_config_val & 0xFFFF) | -				(SBI_PMU_EVENT_TYPE_FW << 16); +			ret = (config & 0xFFFF) | (SBI_PMU_EVENT_TYPE_FW << 16);  			break;  		case 3:  			/* @@ -551,12 +552,13 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)  			 * Event data - raw event encoding  			 */  			ret = SBI_PMU_EVENT_TYPE_FW << 16 | RISCV_PLAT_FW_EVENT; -			*econfig = raw_config_val; +			*econfig = config & RISCV_PMU_PLAT_FW_EVENT_MASK; +			break; +		default:  			break;  		}  		break;  	default: -		ret = -ENOENT;  		break;  	} diff --git a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c index 950b7ae1d1a8..dc452610934a 100644 --- a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c +++ b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c @@ -325,6 +325,12 @@ static void usb_init_common_7216(struct brcm_usb_init_params *params)  	void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];  	USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN); + +	/* +	 * The PHY might be in a bad state if it is already powered +	 * up. Toggle the power just in case. +	 */ +	USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);  	USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);  	/* 1 millisecond - for USB clocks to settle down */ diff --git a/drivers/phy/freescale/phy-fsl-samsung-hdmi.c b/drivers/phy/freescale/phy-fsl-samsung-hdmi.c index 2c8038864357..d3ccf547ba1c 100644 --- a/drivers/phy/freescale/phy-fsl-samsung-hdmi.c +++ b/drivers/phy/freescale/phy-fsl-samsung-hdmi.c @@ -424,8 +424,7 @@ static unsigned long fsl_samsung_hdmi_phy_find_pms(unsigned long fout, u8 *p, u1  			 * Fvco = (M * f_ref) / P,  			 * where f_ref is 24MHz.  			 */ -			tmp = (u64)_m * 24 * MHZ; -			do_div(tmp, _p); +			tmp = div64_ul((u64)_m * 24 * MHZ, _p);  			if (tmp < 750 * MHZ ||  			    tmp > 3000 * MHZ)  				continue; diff --git a/drivers/phy/mediatek/Kconfig b/drivers/phy/mediatek/Kconfig index 60e00057e8bc..ba6461350951 100644 --- a/drivers/phy/mediatek/Kconfig +++ b/drivers/phy/mediatek/Kconfig @@ -65,6 +65,7 @@ config PHY_MTK_HDMI  	depends on ARCH_MEDIATEK || COMPILE_TEST  	depends on COMMON_CLK  	depends on OF +	depends on REGULATOR  	select GENERIC_PHY  	help  	  Support HDMI PHY for Mediatek SoCs. diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index f053b525ccff..413f76e2d174 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c @@ -145,8 +145,10 @@ static struct phy_provider *of_phy_provider_lookup(struct device_node *node)  			return phy_provider;  		for_each_child_of_node(phy_provider->children, child) -			if (child == node) +			if (child == node) { +				of_node_put(child);  				return phy_provider; +			}  	}  	return ERR_PTR(-EPROBE_DEFER); @@ -629,8 +631,10 @@ static struct phy *_of_phy_get(struct device_node *np, int index)  		return ERR_PTR(-ENODEV);  	/* This phy type handled by the usb-phy subsystem for now */ -	if (of_device_is_compatible(args.np, "usb-nop-xceiv")) -		return ERR_PTR(-ENODEV); +	if (of_device_is_compatible(args.np, "usb-nop-xceiv")) { +		phy = ERR_PTR(-ENODEV); +		goto out_put_node; +	}  	mutex_lock(&phy_provider_mutex);  	phy_provider = of_phy_provider_lookup(args.np); @@ -652,6 +656,7 @@ out_put_module:  out_unlock:  	mutex_unlock(&phy_provider_mutex); +out_put_node:  	of_node_put(args.np);  	return phy; @@ -737,7 +742,7 @@ void devm_phy_put(struct device *dev, struct phy *phy)  	if (!phy)  		return; -	r = devres_destroy(dev, devm_phy_release, devm_phy_match, phy); +	r = devres_release(dev, devm_phy_release, devm_phy_match, phy);  	dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");  }  EXPORT_SYMBOL_GPL(devm_phy_put); @@ -1121,7 +1126,7 @@ void devm_phy_destroy(struct device *dev, struct phy *phy)  {  	int r; -	r = devres_destroy(dev, devm_phy_consume, devm_phy_match, phy); +	r = devres_release(dev, devm_phy_consume, devm_phy_match, phy);  	dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");  }  EXPORT_SYMBOL_GPL(devm_phy_destroy); @@ -1259,12 +1264,12 @@ EXPORT_SYMBOL_GPL(of_phy_provider_unregister);   * of_phy_provider_unregister to unregister the phy provider.   */  void devm_of_phy_provider_unregister(struct device *dev, -	struct phy_provider *phy_provider) +				     struct phy_provider *phy_provider)  {  	int r; -	r = devres_destroy(dev, devm_phy_provider_release, devm_phy_match, -		phy_provider); +	r = devres_release(dev, devm_phy_provider_release, devm_phy_match, +			   phy_provider);  	dev_WARN_ONCE(dev, r, "couldn't find PHY provider device resource\n");  }  EXPORT_SYMBOL_GPL(devm_of_phy_provider_unregister); diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c index acd6075bf6d9..c9c337840715 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c @@ -1052,7 +1052,7 @@ static const struct qmp_phy_init_tbl sc8280xp_usb3_uniphy_rx_tbl[] = {  	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),  	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),  	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), -	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x0a), +	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),  	QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),  	QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),  	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c index 0a9989e41237..2eb3329ca23f 100644 --- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c +++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c @@ -309,7 +309,7 @@ static int rockchip_combphy_parse_dt(struct device *dev, struct rockchip_combphy  	priv->ext_refclk = device_property_present(dev, "rockchip,ext-refclk"); -	priv->phy_rst = devm_reset_control_array_get_exclusive(dev); +	priv->phy_rst = devm_reset_control_get(dev, "phy");  	if (IS_ERR(priv->phy_rst))  		return dev_err_probe(dev, PTR_ERR(priv->phy_rst), "failed to get phy reset\n"); diff --git a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c index ceab9c71d3b5..0965b9d4f9cf 100644 --- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c @@ -1101,6 +1101,8 @@ static int rk_hdptx_phy_probe(struct platform_device *pdev)  		return dev_err_probe(dev, PTR_ERR(hdptx->grf),  				     "Could not get GRF syscon\n"); +	platform_set_drvdata(pdev, hdptx); +  	ret = devm_pm_runtime_enable(dev);  	if (ret)  		return dev_err_probe(dev, ret, "Failed to enable runtime PM\n"); @@ -1110,7 +1112,6 @@ static int rk_hdptx_phy_probe(struct platform_device *pdev)  		return dev_err_probe(dev, PTR_ERR(hdptx->phy),  				     "Failed to create HDMI PHY\n"); -	platform_set_drvdata(pdev, hdptx);  	phy_set_drvdata(hdptx->phy, hdptx);  	phy_set_bus_width(hdptx->phy, 8); diff --git a/drivers/phy/st/phy-stm32-combophy.c b/drivers/phy/st/phy-stm32-combophy.c index 765bb34fe358..49e9fa90a681 100644 --- a/drivers/phy/st/phy-stm32-combophy.c +++ b/drivers/phy/st/phy-stm32-combophy.c @@ -122,6 +122,7 @@ static int stm32_impedance_tune(struct stm32_combophy *combophy)  	u32 max_vswing = imp_lookup[imp_size - 1].vswing[vswing_size - 1];  	u32 min_vswing = imp_lookup[0].vswing[0];  	u32 val; +	u32 regval;  	if (!of_property_read_u32(combophy->dev->of_node, "st,output-micro-ohms", &val)) {  		if (val < min_imp || val > max_imp) { @@ -129,16 +130,20 @@ static int stm32_impedance_tune(struct stm32_combophy *combophy)  			return -EINVAL;  		} -		for (imp_of = 0; imp_of < ARRAY_SIZE(imp_lookup); imp_of++) -			if (imp_lookup[imp_of].microohm <= val) +		regval = 0; +		for (imp_of = 0; imp_of < ARRAY_SIZE(imp_lookup); imp_of++) { +			if (imp_lookup[imp_of].microohm <= val) { +				regval = FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_OHM, imp_of);  				break; +			} +		}  		dev_dbg(combophy->dev, "Set %u micro-ohms output impedance\n",  			imp_lookup[imp_of].microohm);  		regmap_update_bits(combophy->regmap, SYSCFG_PCIEPRGCR,  				   STM32MP25_PCIEPRG_IMPCTRL_OHM, -				   FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_OHM, imp_of)); +				   regval);  	} else {  		regmap_read(combophy->regmap, SYSCFG_PCIEPRGCR, &val);  		imp_of = FIELD_GET(STM32MP25_PCIEPRG_IMPCTRL_OHM, val); @@ -150,16 +155,20 @@ static int stm32_impedance_tune(struct stm32_combophy *combophy)  			return -EINVAL;  		} -		for (vswing_of = 0; vswing_of < ARRAY_SIZE(imp_lookup[imp_of].vswing); vswing_of++) -			if (imp_lookup[imp_of].vswing[vswing_of] >= val) +		regval = 0; +		for (vswing_of = 0; vswing_of < ARRAY_SIZE(imp_lookup[imp_of].vswing); vswing_of++) { +			if (imp_lookup[imp_of].vswing[vswing_of] >= val) { +				regval = FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_VSWING, vswing_of);  				break; +			} +		}  		dev_dbg(combophy->dev, "Set %u microvolt swing\n",  			 imp_lookup[imp_of].vswing[vswing_of]);  		regmap_update_bits(combophy->regmap, SYSCFG_PCIEPRGCR,  				   STM32MP25_PCIEPRG_IMPCTRL_VSWING, -				   FIELD_PREP(STM32MP25_PCIEPRG_IMPCTRL_VSWING, vswing_of)); +				   regval);  	}  	return 0; diff --git a/drivers/pinctrl/intel/pinctrl-alderlake.c b/drivers/pinctrl/intel/pinctrl-alderlake.c index 7d9948e5f422..108eac205aa9 100644 --- a/drivers/pinctrl/intel/pinctrl-alderlake.c +++ b/drivers/pinctrl/intel/pinctrl-alderlake.c @@ -747,4 +747,4 @@ module_platform_driver(adl_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Alder Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c index 4533c4d0a9e7..7340dc20349c 100644 --- a/drivers/pinctrl/intel/pinctrl-baytrail.c +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c @@ -1723,4 +1723,4 @@ static int __init byt_gpio_init(void)  }  subsys_initcall(byt_gpio_init); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-broxton.c b/drivers/pinctrl/intel/pinctrl-broxton.c index d99541676630..140b29956340 100644 --- a/drivers/pinctrl/intel/pinctrl-broxton.c +++ b/drivers/pinctrl/intel/pinctrl-broxton.c @@ -1026,4 +1026,4 @@ module_exit(bxt_pinctrl_exit);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Broxton SoC pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-cannonlake.c b/drivers/pinctrl/intel/pinctrl-cannonlake.c index 1aa09f950be1..14a5d339385d 100644 --- a/drivers/pinctrl/intel/pinctrl-cannonlake.c +++ b/drivers/pinctrl/intel/pinctrl-cannonlake.c @@ -838,4 +838,4 @@ module_platform_driver(cnl_pinctrl_driver);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Cannon Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-cedarfork.c b/drivers/pinctrl/intel/pinctrl-cedarfork.c index 48af8930dd1f..2ce97abeb0e4 100644 --- a/drivers/pinctrl/intel/pinctrl-cedarfork.c +++ b/drivers/pinctrl/intel/pinctrl-cedarfork.c @@ -350,4 +350,4 @@ module_exit(cdf_pinctrl_exit);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Cedar Fork PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c index 9f938718927b..c673e262e1db 100644 --- a/drivers/pinctrl/intel/pinctrl-cherryview.c +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c @@ -1815,4 +1815,4 @@ module_exit(chv_pinctrl_exit);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Cherryview/Braswell pinctrl driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-denverton.c b/drivers/pinctrl/intel/pinctrl-denverton.c index 666507f54f27..fef44c663be6 100644 --- a/drivers/pinctrl/intel/pinctrl-denverton.c +++ b/drivers/pinctrl/intel/pinctrl-denverton.c @@ -287,4 +287,4 @@ module_exit(dnv_pinctrl_exit);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Denverton SoC pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-elkhartlake.c b/drivers/pinctrl/intel/pinctrl-elkhartlake.c index 3e45d7fb003a..ab414e07555a 100644 --- a/drivers/pinctrl/intel/pinctrl-elkhartlake.c +++ b/drivers/pinctrl/intel/pinctrl-elkhartlake.c @@ -537,4 +537,4 @@ module_platform_driver(ehl_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Elkhart Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-emmitsburg.c b/drivers/pinctrl/intel/pinctrl-emmitsburg.c index e4798d32492c..9d8a32aca177 100644 --- a/drivers/pinctrl/intel/pinctrl-emmitsburg.c +++ b/drivers/pinctrl/intel/pinctrl-emmitsburg.c @@ -372,4 +372,4 @@ module_platform_driver(ebg_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Emmitsburg PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-geminilake.c b/drivers/pinctrl/intel/pinctrl-geminilake.c index 6dcf0ac2059f..8dcac4fe8493 100644 --- a/drivers/pinctrl/intel/pinctrl-geminilake.c +++ b/drivers/pinctrl/intel/pinctrl-geminilake.c @@ -472,4 +472,4 @@ module_exit(glk_pinctrl_exit);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Gemini Lake SoC pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-icelake.c b/drivers/pinctrl/intel/pinctrl-icelake.c index fe3042de891a..7e028c61ed0f 100644 --- a/drivers/pinctrl/intel/pinctrl-icelake.c +++ b/drivers/pinctrl/intel/pinctrl-icelake.c @@ -690,4 +690,4 @@ MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Ice Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-intel-platform.c b/drivers/pinctrl/intel/pinctrl-intel-platform.c index 016a9f62eecc..dd5dbede0f59 100644 --- a/drivers/pinctrl/intel/pinctrl-intel-platform.c +++ b/drivers/pinctrl/intel/pinctrl-intel-platform.c @@ -221,4 +221,4 @@ module_platform_driver(intel_platform_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c index 04b438f63ccb..527e4b87ae52 100644 --- a/drivers/pinctrl/intel/pinctrl-intel.c +++ b/drivers/pinctrl/intel/pinctrl-intel.c @@ -158,7 +158,7 @@ const struct intel_community *intel_get_community(const struct intel_pinctrl *pc  	dev_warn(pctrl->dev, "failed to find community for pin %u\n", pin);  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(intel_get_community, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_community, "PINCTRL_INTEL");  static const struct intel_padgroup *  intel_community_get_padgroup(const struct intel_community *community, @@ -315,7 +315,7 @@ int intel_get_groups_count(struct pinctrl_dev *pctldev)  	return pctrl->soc->ngroups;  } -EXPORT_SYMBOL_NS_GPL(intel_get_groups_count, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_groups_count, "PINCTRL_INTEL");  const char *intel_get_group_name(struct pinctrl_dev *pctldev, unsigned int group)  { @@ -323,7 +323,7 @@ const char *intel_get_group_name(struct pinctrl_dev *pctldev, unsigned int group  	return pctrl->soc->groups[group].grp.name;  } -EXPORT_SYMBOL_NS_GPL(intel_get_group_name, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_group_name, "PINCTRL_INTEL");  int intel_get_group_pins(struct pinctrl_dev *pctldev, unsigned int group,  			 const unsigned int **pins, unsigned int *npins) @@ -334,7 +334,7 @@ int intel_get_group_pins(struct pinctrl_dev *pctldev, unsigned int group,  	*npins = pctrl->soc->groups[group].grp.npins;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(intel_get_group_pins, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_group_pins, "PINCTRL_INTEL");  static void intel_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,  			       unsigned int pin) @@ -400,7 +400,7 @@ int intel_get_functions_count(struct pinctrl_dev *pctldev)  	return pctrl->soc->nfunctions;  } -EXPORT_SYMBOL_NS_GPL(intel_get_functions_count, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_functions_count, "PINCTRL_INTEL");  const char *intel_get_function_name(struct pinctrl_dev *pctldev, unsigned int function)  { @@ -408,7 +408,7 @@ const char *intel_get_function_name(struct pinctrl_dev *pctldev, unsigned int fu  	return pctrl->soc->functions[function].func.name;  } -EXPORT_SYMBOL_NS_GPL(intel_get_function_name, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_function_name, "PINCTRL_INTEL");  int intel_get_function_groups(struct pinctrl_dev *pctldev, unsigned int function,  			      const char * const **groups, unsigned int * const ngroups) @@ -419,7 +419,7 @@ int intel_get_function_groups(struct pinctrl_dev *pctldev, unsigned int function  	*ngroups = pctrl->soc->functions[function].func.ngroups;  	return 0;  } -EXPORT_SYMBOL_NS_GPL(intel_get_function_groups, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_get_function_groups, "PINCTRL_INTEL");  static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,  				unsigned int function, unsigned int group) @@ -1676,7 +1676,7 @@ int intel_pinctrl_probe(struct platform_device *pdev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe, "PINCTRL_INTEL");  int intel_pinctrl_probe_by_hid(struct platform_device *pdev)  { @@ -1688,7 +1688,7 @@ int intel_pinctrl_probe_by_hid(struct platform_device *pdev)  	return intel_pinctrl_probe(pdev, data);  } -EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe_by_hid, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe_by_hid, "PINCTRL_INTEL");  int intel_pinctrl_probe_by_uid(struct platform_device *pdev)  { @@ -1700,7 +1700,7 @@ int intel_pinctrl_probe_by_uid(struct platform_device *pdev)  	return intel_pinctrl_probe(pdev, data);  } -EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe_by_uid, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe_by_uid, "PINCTRL_INTEL");  const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_device *pdev)  { @@ -1731,7 +1731,7 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_  	return data ?: ERR_PTR(-ENODATA);  } -EXPORT_SYMBOL_NS_GPL(intel_pinctrl_get_soc_data, PINCTRL_INTEL); +EXPORT_SYMBOL_NS_GPL(intel_pinctrl_get_soc_data, "PINCTRL_INTEL");  static bool __intel_gpio_is_direct_irq(u32 value)  { diff --git a/drivers/pinctrl/intel/pinctrl-jasperlake.c b/drivers/pinctrl/intel/pinctrl-jasperlake.c index 3525480428ea..aef0e7f92154 100644 --- a/drivers/pinctrl/intel/pinctrl-jasperlake.c +++ b/drivers/pinctrl/intel/pinctrl-jasperlake.c @@ -340,4 +340,4 @@ module_platform_driver(jsl_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Jasper Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-lakefield.c b/drivers/pinctrl/intel/pinctrl-lakefield.c index adef85db82ca..60281f421608 100644 --- a/drivers/pinctrl/intel/pinctrl-lakefield.c +++ b/drivers/pinctrl/intel/pinctrl-lakefield.c @@ -361,4 +361,4 @@ module_platform_driver(lkf_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Lakefield PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-lewisburg.c b/drivers/pinctrl/intel/pinctrl-lewisburg.c index a304d30ea9ed..9fe651370f32 100644 --- a/drivers/pinctrl/intel/pinctrl-lewisburg.c +++ b/drivers/pinctrl/intel/pinctrl-lewisburg.c @@ -321,4 +321,4 @@ module_platform_driver(lbg_pinctrl_driver);  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Lewisburg pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-lynxpoint.c b/drivers/pinctrl/intel/pinctrl-lynxpoint.c index bcce97f3b897..cc5ede17c383 100644 --- a/drivers/pinctrl/intel/pinctrl-lynxpoint.c +++ b/drivers/pinctrl/intel/pinctrl-lynxpoint.c @@ -859,4 +859,4 @@ MODULE_AUTHOR("Andy Shevchenko (Intel)");  MODULE_DESCRIPTION("Intel Lynxpoint pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("platform:lp_gpio"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-merrifield.c b/drivers/pinctrl/intel/pinctrl-merrifield.c index 1a556f5822b6..2f4d73dda41d 100644 --- a/drivers/pinctrl/intel/pinctrl-merrifield.c +++ b/drivers/pinctrl/intel/pinctrl-merrifield.c @@ -380,4 +380,4 @@ MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Merrifield SoC pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("platform:pinctrl-merrifield"); -MODULE_IMPORT_NS(PINCTRL_TANGIER); +MODULE_IMPORT_NS("PINCTRL_TANGIER"); diff --git a/drivers/pinctrl/intel/pinctrl-meteorlake.c b/drivers/pinctrl/intel/pinctrl-meteorlake.c index 885fa3b0d6d9..f564376ce437 100644 --- a/drivers/pinctrl/intel/pinctrl-meteorlake.c +++ b/drivers/pinctrl/intel/pinctrl-meteorlake.c @@ -604,4 +604,4 @@ module_platform_driver(mtl_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Meteor Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-meteorpoint.c b/drivers/pinctrl/intel/pinctrl-meteorpoint.c index 77e97775a60b..ab46ac5f3b15 100644 --- a/drivers/pinctrl/intel/pinctrl-meteorpoint.c +++ b/drivers/pinctrl/intel/pinctrl-meteorpoint.c @@ -462,4 +462,4 @@ module_platform_driver(mtp_pinctrl_driver);  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Meteor Point PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-moorefield.c b/drivers/pinctrl/intel/pinctrl-moorefield.c index 7b995fbf5c84..6a79207e6b2a 100644 --- a/drivers/pinctrl/intel/pinctrl-moorefield.c +++ b/drivers/pinctrl/intel/pinctrl-moorefield.c @@ -341,4 +341,4 @@ MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_DESCRIPTION("Intel Moorefield SoC pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("platform:pinctrl-moorefield"); -MODULE_IMPORT_NS(PINCTRL_TANGIER); +MODULE_IMPORT_NS("PINCTRL_TANGIER"); diff --git a/drivers/pinctrl/intel/pinctrl-sunrisepoint.c b/drivers/pinctrl/intel/pinctrl-sunrisepoint.c index 55df9d2cfb1b..a7a5fa65fd9d 100644 --- a/drivers/pinctrl/intel/pinctrl-sunrisepoint.c +++ b/drivers/pinctrl/intel/pinctrl-sunrisepoint.c @@ -605,4 +605,4 @@ MODULE_AUTHOR("Mathias Nyman <mathias.nyman@linux.intel.com>");  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Sunrisepoint PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/intel/pinctrl-tangier.c b/drivers/pinctrl/intel/pinctrl-tangier.c index 2cb0b4758269..d3baf0f4eea0 100644 --- a/drivers/pinctrl/intel/pinctrl-tangier.c +++ b/drivers/pinctrl/intel/pinctrl-tangier.c @@ -579,7 +579,7 @@ int devm_tng_pinctrl_probe(struct platform_device *pdev)  	return tng_pinctrl_probe(pdev, data);  } -EXPORT_SYMBOL_NS_GPL(devm_tng_pinctrl_probe, PINCTRL_TANGIER); +EXPORT_SYMBOL_NS_GPL(devm_tng_pinctrl_probe, "PINCTRL_TANGIER");  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_AUTHOR("Raag Jadav <raag.jadav@intel.com>"); diff --git a/drivers/pinctrl/intel/pinctrl-tigerlake.c b/drivers/pinctrl/intel/pinctrl-tigerlake.c index 80cd7a06fe5a..c43576e10273 100644 --- a/drivers/pinctrl/intel/pinctrl-tigerlake.c +++ b/drivers/pinctrl/intel/pinctrl-tigerlake.c @@ -758,4 +758,4 @@ MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");  MODULE_DESCRIPTION("Intel Tiger Lake PCH pinctrl/GPIO driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PINCTRL_INTEL); +MODULE_IMPORT_NS("PINCTRL_INTEL"); diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index d66c3a3e8429..b96e6368a956 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -86,6 +86,7 @@ const struct regmap_config mcp23x08_regmap = {  	.num_reg_defaults = ARRAY_SIZE(mcp23x08_defaults),  	.cache_type = REGCACHE_FLAT,  	.max_register = MCP_OLAT, +	.disable_locking = true, /* mcp->lock protects the regmap */  };  EXPORT_SYMBOL_GPL(mcp23x08_regmap); @@ -132,6 +133,7 @@ const struct regmap_config mcp23x17_regmap = {  	.num_reg_defaults = ARRAY_SIZE(mcp23x17_defaults),  	.cache_type = REGCACHE_FLAT,  	.val_format_endian = REGMAP_ENDIAN_LITTLE, +	.disable_locking = true, /* mcp->lock protects the regmap */  };  EXPORT_SYMBOL_GPL(mcp23x17_regmap); @@ -228,7 +230,9 @@ static int mcp_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,  	switch (param) {  	case PIN_CONFIG_BIAS_PULL_UP: +		mutex_lock(&mcp->lock);  		ret = mcp_read(mcp, MCP_GPPU, &data); +		mutex_unlock(&mcp->lock);  		if (ret < 0)  			return ret;  		status = (data & BIT(pin)) ? 1 : 0; @@ -257,7 +261,9 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,  		switch (param) {  		case PIN_CONFIG_BIAS_PULL_UP: +			mutex_lock(&mcp->lock);  			ret = mcp_set_bit(mcp, MCP_GPPU, pin, arg); +			mutex_unlock(&mcp->lock);  			break;  		default:  			dev_dbg(mcp->dev, "Invalid config param %04x\n", param); diff --git a/drivers/platform/chrome/chromeos_of_hw_prober.c b/drivers/platform/chrome/chromeos_of_hw_prober.c index 297d4704b75f..c6992f5cdc76 100644 --- a/drivers/platform/chrome/chromeos_of_hw_prober.c +++ b/drivers/platform/chrome/chromeos_of_hw_prober.c @@ -151,4 +151,4 @@ module_exit(chromeos_of_hw_prober_driver_exit);  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("ChromeOS device tree hardware prober"); -MODULE_IMPORT_NS(I2C_OF_PROBER); +MODULE_IMPORT_NS("I2C_OF_PROBER"); diff --git a/drivers/platform/chrome/cros_ec_lpc.c b/drivers/platform/chrome/cros_ec_lpc.c index 924bf4d3cc77..8470b7f2b135 100644 --- a/drivers/platform/chrome/cros_ec_lpc.c +++ b/drivers/platform/chrome/cros_ec_lpc.c @@ -707,7 +707,7 @@ static const struct dmi_system_id cros_ec_lpc_dmi_table[] __initconst = {  		/* Framework Laptop (12th Gen Intel Core) */  		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "Framework"), -			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "12th Gen Intel Core"), +			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Laptop (12th Gen Intel Core)"),  		},  		.driver_data = (void *)&framework_laptop_mec_lpc_driver_data,  	}, @@ -715,7 +715,7 @@ static const struct dmi_system_id cros_ec_lpc_dmi_table[] __initconst = {  		/* Framework Laptop (13th Gen Intel Core) */  		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "Framework"), -			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "13th Gen Intel Core"), +			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Laptop (13th Gen Intel Core)"),  		},  		.driver_data = (void *)&framework_laptop_mec_lpc_driver_data,  	}, diff --git a/drivers/platform/goldfish/goldfish_pipe.c b/drivers/platform/goldfish/goldfish_pipe.c index ca78e5833136..abc31971fe6a 100644 --- a/drivers/platform/goldfish/goldfish_pipe.c +++ b/drivers/platform/goldfish/goldfish_pipe.c @@ -935,7 +935,7 @@ MODULE_DEVICE_TABLE(of, goldfish_pipe_of_match);  static struct platform_driver goldfish_pipe_driver = {  	.probe = goldfish_pipe_probe, -	.remove_new = goldfish_pipe_remove, +	.remove = goldfish_pipe_remove,  	.driver = {  		.name = "goldfish_pipe",  		.of_match_table = goldfish_pipe_of_match, diff --git a/drivers/platform/loongarch/Kconfig b/drivers/platform/loongarch/Kconfig index 5633e4d73991..447528797d07 100644 --- a/drivers/platform/loongarch/Kconfig +++ b/drivers/platform/loongarch/Kconfig @@ -18,7 +18,7 @@ if LOONGARCH_PLATFORM_DEVICES  config LOONGSON_LAPTOP  	tristate "Generic Loongson-3 Laptop Driver" -	depends on ACPI +	depends on ACPI_EC  	depends on BACKLIGHT_CLASS_DEVICE  	depends on INPUT  	depends on MACH_LOONGSON64 diff --git a/drivers/platform/mellanox/mlxbf-bootctl.c b/drivers/platform/mellanox/mlxbf-bootctl.c index dd5f370c3168..c5b36837e694 100644 --- a/drivers/platform/mellanox/mlxbf-bootctl.c +++ b/drivers/platform/mellanox/mlxbf-bootctl.c @@ -1049,7 +1049,7 @@ static void mlxbf_bootctl_remove(struct platform_device *pdev)  static struct platform_driver mlxbf_bootctl_driver = {  	.probe = mlxbf_bootctl_probe, -	.remove_new = mlxbf_bootctl_remove, +	.remove = mlxbf_bootctl_remove,  	.driver = {  		.name = "mlxbf-bootctl",  		.dev_groups = mlxbf_bootctl_groups, diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c index 6c834e39352d..300cdaa75a17 100644 --- a/drivers/platform/mellanox/mlxbf-tmfifo.c +++ b/drivers/platform/mellanox/mlxbf-tmfifo.c @@ -1446,7 +1446,7 @@ MODULE_DEVICE_TABLE(acpi, mlxbf_tmfifo_acpi_match);  static struct platform_driver mlxbf_tmfifo_driver = {  	.probe = mlxbf_tmfifo_probe, -	.remove_new = mlxbf_tmfifo_remove, +	.remove = mlxbf_tmfifo_remove,  	.driver = {  		.name = "bf-tmfifo",  		.acpi_match_table = mlxbf_tmfifo_acpi_match, diff --git a/drivers/platform/mellanox/mlxreg-hotplug.c b/drivers/platform/mellanox/mlxreg-hotplug.c index 0ce9fff1f7d4..6aa2a4650367 100644 --- a/drivers/platform/mellanox/mlxreg-hotplug.c +++ b/drivers/platform/mellanox/mlxreg-hotplug.c @@ -786,7 +786,7 @@ static struct platform_driver mlxreg_hotplug_driver = {  		.name = "mlxreg-hotplug",  	},  	.probe = mlxreg_hotplug_probe, -	.remove_new = mlxreg_hotplug_remove, +	.remove = mlxreg_hotplug_remove,  };  module_platform_driver(mlxreg_hotplug_driver); diff --git a/drivers/platform/mellanox/mlxreg-io.c b/drivers/platform/mellanox/mlxreg-io.c index ee7bd623ba44..595276206baf 100644 --- a/drivers/platform/mellanox/mlxreg-io.c +++ b/drivers/platform/mellanox/mlxreg-io.c @@ -275,7 +275,7 @@ static struct platform_driver mlxreg_io_driver = {  	    .name = "mlxreg-io",  	},  	.probe = mlxreg_io_probe, -	.remove_new = mlxreg_io_remove, +	.remove = mlxreg_io_remove,  };  module_platform_driver(mlxreg_io_driver); diff --git a/drivers/platform/mellanox/mlxreg-lc.c b/drivers/platform/mellanox/mlxreg-lc.c index 43d119e3a473..aee395bb48ae 100644 --- a/drivers/platform/mellanox/mlxreg-lc.c +++ b/drivers/platform/mellanox/mlxreg-lc.c @@ -944,7 +944,7 @@ static void mlxreg_lc_remove(struct platform_device *pdev)  static struct platform_driver mlxreg_lc_driver = {  	.probe = mlxreg_lc_probe, -	.remove_new = mlxreg_lc_remove, +	.remove = mlxreg_lc_remove,  	.driver = {  		.name = "mlxreg-lc",  	}, diff --git a/drivers/platform/mellanox/nvsw-sn2201.c b/drivers/platform/mellanox/nvsw-sn2201.c index abe7be602f84..0c047aa2345b 100644 --- a/drivers/platform/mellanox/nvsw-sn2201.c +++ b/drivers/platform/mellanox/nvsw-sn2201.c @@ -1253,7 +1253,7 @@ MODULE_DEVICE_TABLE(acpi, nvsw_sn2201_acpi_ids);  static struct platform_driver nvsw_sn2201_driver = {  	.probe = nvsw_sn2201_probe, -	.remove_new = nvsw_sn2201_remove, +	.remove = nvsw_sn2201_remove,  	.driver = {  		.name = "nvsw-sn2201",  	.acpi_match_table = nvsw_sn2201_acpi_ids, diff --git a/drivers/platform/surface/surface3-wmi.c b/drivers/platform/surface/surface3-wmi.c index c15ed7a12784..6c8fb7a4dde4 100644 --- a/drivers/platform/surface/surface3-wmi.c +++ b/drivers/platform/surface/surface3-wmi.c @@ -247,7 +247,7 @@ static struct platform_driver s3_wmi_driver = {  		.name = "surface3-wmi",  		.pm = &s3_wmi_pm,  	}, -	.remove_new = s3_wmi_remove, +	.remove = s3_wmi_remove,  };  static int __init s3_wmi_init(void) diff --git a/drivers/platform/surface/surface_acpi_notify.c b/drivers/platform/surface/surface_acpi_notify.c index 14a9d8a267cb..3b30cfe3466b 100644 --- a/drivers/platform/surface/surface_acpi_notify.c +++ b/drivers/platform/surface/surface_acpi_notify.c @@ -850,7 +850,7 @@ MODULE_DEVICE_TABLE(acpi, san_match);  static struct platform_driver surface_acpi_notify = {  	.probe = san_probe, -	.remove_new = san_remove, +	.remove = san_remove,  	.driver = {  		.name = "surface_acpi_notify",  		.acpi_match_table = san_match, diff --git a/drivers/platform/surface/surface_aggregator_cdev.c b/drivers/platform/surface/surface_aggregator_cdev.c index 165b1416230d..bfaa09d1648b 100644 --- a/drivers/platform/surface/surface_aggregator_cdev.c +++ b/drivers/platform/surface/surface_aggregator_cdev.c @@ -762,7 +762,7 @@ static struct platform_device *ssam_cdev_device;  static struct platform_driver ssam_cdev_driver = {  	.probe = ssam_dbg_device_probe, -	.remove_new = ssam_dbg_device_remove, +	.remove = ssam_dbg_device_remove,  	.driver = {  		.name = SSAM_CDEV_DEVICE_NAME,  		.probe_type = PROBE_PREFER_ASYNCHRONOUS, diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c index 06e45f0b9817..d4f32ad66530 100644 --- a/drivers/platform/surface/surface_aggregator_registry.c +++ b/drivers/platform/surface/surface_aggregator_registry.c @@ -554,7 +554,7 @@ static void ssam_platform_hub_remove(struct platform_device *pdev)  static struct platform_driver ssam_platform_hub_driver = {  	.probe = ssam_platform_hub_probe, -	.remove_new = ssam_platform_hub_remove, +	.remove = ssam_platform_hub_remove,  	.driver = {  		.name = "surface_aggregator_platform_hub",  		.acpi_match_table = ssam_platform_hub_acpi_match, diff --git a/drivers/platform/surface/surface_dtx.c b/drivers/platform/surface/surface_dtx.c index 89ca6b50e812..97ae010069e4 100644 --- a/drivers/platform/surface/surface_dtx.c +++ b/drivers/platform/surface/surface_dtx.c @@ -1180,7 +1180,7 @@ MODULE_DEVICE_TABLE(acpi, surface_dtx_acpi_match);  static struct platform_driver surface_dtx_platform_driver = {  	.probe = surface_dtx_platform_probe, -	.remove_new = surface_dtx_platform_remove, +	.remove = surface_dtx_platform_remove,  	.driver = {  		.name = "surface_dtx_pltf",  		.acpi_match_table = surface_dtx_acpi_match, diff --git a/drivers/platform/surface/surface_gpe.c b/drivers/platform/surface/surface_gpe.c index 62fd4004db31..b359413903b1 100644 --- a/drivers/platform/surface/surface_gpe.c +++ b/drivers/platform/surface/surface_gpe.c @@ -278,7 +278,7 @@ static void surface_gpe_remove(struct platform_device *pdev)  static struct platform_driver surface_gpe_driver = {  	.probe = surface_gpe_probe, -	.remove_new = surface_gpe_remove, +	.remove = surface_gpe_remove,  	.driver = {  		.name = "surface_gpe",  		.pm = &surface_gpe_pm, diff --git a/drivers/platform/surface/surface_hotplug.c b/drivers/platform/surface/surface_hotplug.c index a404f26cfae8..c0d83ed5a208 100644 --- a/drivers/platform/surface/surface_hotplug.c +++ b/drivers/platform/surface/surface_hotplug.c @@ -259,7 +259,7 @@ MODULE_DEVICE_TABLE(acpi, surface_hotplug_acpi_match);  static struct platform_driver surface_hotplug_driver = {  	.probe = surface_hotplug_probe, -	.remove_new = surface_hotplug_remove, +	.remove = surface_hotplug_remove,  	.driver = {  		.name = "surface_hotplug",  		.acpi_match_table = surface_hotplug_acpi_match, diff --git a/drivers/platform/x86/amd/hsmp/acpi.c b/drivers/platform/x86/amd/hsmp/acpi.c index dd5b5773328a..e981d45e1c12 100644 --- a/drivers/platform/x86/amd/hsmp/acpi.c +++ b/drivers/platform/x86/amd/hsmp/acpi.c @@ -372,7 +372,7 @@ static struct platform_driver amd_hsmp_driver = {  module_platform_driver(amd_hsmp_driver); -MODULE_IMPORT_NS(AMD_HSMP); +MODULE_IMPORT_NS("AMD_HSMP");  MODULE_DESCRIPTION("AMD HSMP Platform Interface Driver");  MODULE_VERSION(DRIVER_VERSION);  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/amd/hsmp/hsmp.c b/drivers/platform/x86/amd/hsmp/hsmp.c index f29dd93fbf0b..227b4ad4a51a 100644 --- a/drivers/platform/x86/amd/hsmp/hsmp.c +++ b/drivers/platform/x86/amd/hsmp/hsmp.c @@ -206,7 +206,7 @@ int hsmp_send_message(struct hsmp_message *msg)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(hsmp_send_message, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_send_message, "AMD_HSMP");  int hsmp_test(u16 sock_ind, u32 value)  { @@ -237,7 +237,7 @@ int hsmp_test(u16 sock_ind, u32 value)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(hsmp_test, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_test, "AMD_HSMP");  long hsmp_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)  { @@ -319,7 +319,7 @@ ssize_t hsmp_metric_tbl_read(struct hsmp_socket *sock, char *buf, size_t size)  	return size;  } -EXPORT_SYMBOL_NS_GPL(hsmp_metric_tbl_read, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_metric_tbl_read, "AMD_HSMP");  int hsmp_get_tbl_dram_base(u16 sock_ind)  { @@ -353,7 +353,7 @@ int hsmp_get_tbl_dram_base(u16 sock_ind)  	}  	return 0;  } -EXPORT_SYMBOL_NS_GPL(hsmp_get_tbl_dram_base, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_get_tbl_dram_base, "AMD_HSMP");  int hsmp_cache_proto_ver(u16 sock_ind)  { @@ -370,7 +370,7 @@ int hsmp_cache_proto_ver(u16 sock_ind)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(hsmp_cache_proto_ver, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_cache_proto_ver, "AMD_HSMP");  static const struct file_operations hsmp_fops = {  	.owner		= THIS_MODULE, @@ -389,19 +389,19 @@ int hsmp_misc_register(struct device *dev)  	return misc_register(&hsmp_pdev.mdev);  } -EXPORT_SYMBOL_NS_GPL(hsmp_misc_register, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_misc_register, "AMD_HSMP");  void hsmp_misc_deregister(void)  {  	misc_deregister(&hsmp_pdev.mdev);  } -EXPORT_SYMBOL_NS_GPL(hsmp_misc_deregister, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(hsmp_misc_deregister, "AMD_HSMP");  struct hsmp_plat_device *get_hsmp_pdev(void)  {  	return &hsmp_pdev;  } -EXPORT_SYMBOL_NS_GPL(get_hsmp_pdev, AMD_HSMP); +EXPORT_SYMBOL_NS_GPL(get_hsmp_pdev, "AMD_HSMP");  MODULE_DESCRIPTION("AMD HSMP Common driver");  MODULE_VERSION(DRIVER_VERSION); diff --git a/drivers/platform/x86/amd/hsmp/plat.c b/drivers/platform/x86/amd/hsmp/plat.c index 748bbc356484..a61f815c9f80 100644 --- a/drivers/platform/x86/amd/hsmp/plat.c +++ b/drivers/platform/x86/amd/hsmp/plat.c @@ -332,7 +332,7 @@ static void __exit hsmp_plt_exit(void)  device_initcall(hsmp_plt_init);  module_exit(hsmp_plt_exit); -MODULE_IMPORT_NS(AMD_HSMP); +MODULE_IMPORT_NS("AMD_HSMP");  MODULE_DESCRIPTION("AMD HSMP Platform Interface Driver");  MODULE_VERSION(DRIVER_VERSION);  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/amd/pmc/pmc.c b/drivers/platform/x86/amd/pmc/pmc.c index 26b878ee5191..a254debb9256 100644 --- a/drivers/platform/x86/amd/pmc/pmc.c +++ b/drivers/platform/x86/amd/pmc/pmc.c @@ -947,6 +947,10 @@ static int amd_pmc_suspend_handler(struct device *dev)  {  	struct amd_pmc_dev *pdev = dev_get_drvdata(dev); +	/* +	 * Must be called only from the same set of dev_pm_ops handlers +	 * as i8042_pm_suspend() is called: currently just from .suspend. +	 */  	if (pdev->disable_8042_wakeup && !disable_workarounds) {  		int rc = amd_pmc_wa_irq1(pdev); @@ -959,7 +963,9 @@ static int amd_pmc_suspend_handler(struct device *dev)  	return 0;  } -static DEFINE_SIMPLE_DEV_PM_OPS(amd_pmc_pm, amd_pmc_suspend_handler, NULL); +static const struct dev_pm_ops amd_pmc_pm = { +	.suspend = amd_pmc_suspend_handler, +};  static const struct pci_device_id pmc_pci_ids[] = {  	{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_PS) }, diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c index ef04d396f61c..a5933980ade3 100644 --- a/drivers/platform/x86/asus-nb-wmi.c +++ b/drivers/platform/x86/asus-nb-wmi.c @@ -623,6 +623,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = {  	{ KE_KEY, 0xC4, { KEY_KBDILLUMUP } },  	{ KE_KEY, 0xC5, { KEY_KBDILLUMDOWN } },  	{ KE_IGNORE, 0xC6, },  /* Ambient Light Sensor notification */ +	{ KE_IGNORE, 0xCF, },	/* AC mode */  	{ KE_KEY, 0xFA, { KEY_PROG2 } },           /* Lid flip action */  	{ KE_KEY, 0xBD, { KEY_PROG2 } },           /* Lid flip action on ROG xflow laptops */  	{ KE_END, 0}, diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index ba8b6d028f9f..8bd187e8b47f 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -3696,7 +3696,6 @@ static int asus_wmi_custom_fan_curve_init(struct asus_wmi *asus)  /* Throttle thermal policy ****************************************************/  static int throttle_thermal_policy_write(struct asus_wmi *asus)  { -	u32 retval;  	u8 value;  	int err; @@ -3718,8 +3717,8 @@ static int throttle_thermal_policy_write(struct asus_wmi *asus)  		value = asus->throttle_thermal_policy_mode;  	} -	err = asus_wmi_set_devstate(asus->throttle_thermal_policy_dev, -				    value, &retval); +	/* Some machines do not return an error code as a result, so we ignore it */ +	err = asus_wmi_set_devstate(asus->throttle_thermal_policy_dev, value, NULL);  	sysfs_notify(&asus->platform_device->dev.kobj, NULL,  			"throttle_thermal_policy"); @@ -3729,12 +3728,6 @@ static int throttle_thermal_policy_write(struct asus_wmi *asus)  		return err;  	} -	if (retval != 1) { -		pr_warn("Failed to set throttle thermal policy (retval): 0x%x\n", -			retval); -		return -EIO; -	} -  	/* Must set to disabled if mode is toggled */  	if (asus->cpu_fan_curve_available)  		asus->custom_fan_curves[FAN_CURVE_DEV_CPU].enabled = false; diff --git a/drivers/platform/x86/dell/alienware-wmi.c b/drivers/platform/x86/dell/alienware-wmi.c index 77465ed9b449..341d01d3e3e4 100644 --- a/drivers/platform/x86/dell/alienware-wmi.c +++ b/drivers/platform/x86/dell/alienware-wmi.c @@ -190,7 +190,7 @@ static struct quirk_entry quirk_asm201 = {  };  static struct quirk_entry quirk_g_series = { -	.num_zones = 2, +	.num_zones = 0,  	.hdmi_mux = 0,  	.amplifier = 0,  	.deepslp = 0, @@ -199,7 +199,7 @@ static struct quirk_entry quirk_g_series = {  };  static struct quirk_entry quirk_x_series = { -	.num_zones = 2, +	.num_zones = 0,  	.hdmi_mux = 0,  	.amplifier = 0,  	.deepslp = 0, @@ -243,6 +243,15 @@ static const struct dmi_system_id alienware_quirks[] __initconst = {  	},  	{  		.callback = dmi_matched, +		.ident = "Alienware m16 R1 AMD", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), +			DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m16 R1 AMD"), +		}, +		.driver_data = &quirk_x_series, +	}, +	{ +		.callback = dmi_matched,  		.ident = "Alienware m17 R5",  		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), @@ -687,6 +696,9 @@ static void alienware_zone_exit(struct platform_device *dev)  {  	u8 zone; +	if (!quirks->num_zones) +		return; +  	sysfs_remove_group(&dev->dev.kobj, &zone_attribute_group);  	led_classdev_unregister(&global_led);  	if (zone_dev_attrs) { @@ -1229,9 +1241,11 @@ static int __init alienware_wmi_init(void)  			goto fail_prep_thermal_profile;  	} -	ret = alienware_zone_init(platform_device); -	if (ret) -		goto fail_prep_zones; +	if (quirks->num_zones > 0) { +		ret = alienware_zone_init(platform_device); +		if (ret) +			goto fail_prep_zones; +	}  	return 0; diff --git a/drivers/platform/x86/dell/dell-uart-backlight.c b/drivers/platform/x86/dell/dell-uart-backlight.c index 6e5dc7e3674f..bcc5c0f3bb4d 100644 --- a/drivers/platform/x86/dell/dell-uart-backlight.c +++ b/drivers/platform/x86/dell/dell-uart-backlight.c @@ -283,6 +283,9 @@ static int dell_uart_bl_serdev_probe(struct serdev_device *serdev)  	init_waitqueue_head(&dell_bl->wait_queue);  	dell_bl->dev = dev; +	serdev_device_set_drvdata(serdev, dell_bl); +	serdev_device_set_client_ops(serdev, &dell_uart_bl_serdev_ops); +  	ret = devm_serdev_device_open(dev, serdev);  	if (ret)  		return dev_err_probe(dev, ret, "opening UART device\n"); @@ -290,8 +293,6 @@ static int dell_uart_bl_serdev_probe(struct serdev_device *serdev)  	/* 9600 bps, no flow control, these are the default but set them to be sure */  	serdev_device_set_baudrate(serdev, 9600);  	serdev_device_set_flow_control(serdev, false); -	serdev_device_set_drvdata(serdev, dell_bl); -	serdev_device_set_client_ops(serdev, &dell_uart_bl_serdev_ops);  	get_version[0] = DELL_SOF(GET_CMD_LEN);  	get_version[1] = CMD_GET_VERSION; diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c index 81ccc96ffe40..20c55bab3b8c 100644 --- a/drivers/platform/x86/hp/hp-wmi.c +++ b/drivers/platform/x86/hp/hp-wmi.c @@ -64,7 +64,7 @@ static const char * const omen_thermal_profile_boards[] = {  	"874A", "8603", "8604", "8748", "886B", "886C", "878A", "878B", "878C",  	"88C8", "88CB", "8786", "8787", "8788", "88D1", "88D2", "88F4", "88FD",  	"88F5", "88F6", "88F7", "88FE", "88FF", "8900", "8901", "8902", "8912", -	"8917", "8918", "8949", "894A", "89EB", "8BAD", "8A42" +	"8917", "8918", "8949", "894A", "89EB", "8BAD", "8A42", "8A15"  };  /* DMI Board names of Omen laptops that are specifically set to be thermal @@ -80,7 +80,7 @@ static const char * const omen_thermal_profile_force_v0_boards[] = {   * "balanced" when reaching zero.   */  static const char * const omen_timed_thermal_profile_boards[] = { -	"8BAD", "8A42" +	"8BAD", "8A42", "8A15"  };  /* DMI Board names of Victus laptops */ diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index 5d2c1f0d1e9f..e980dd18e5f6 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c @@ -1826,19 +1826,19 @@ int ideapad_laptop_register_notifier(struct notifier_block *nb)  {  	return blocking_notifier_chain_register(&ideapad_laptop_chain_head, nb);  } -EXPORT_SYMBOL_NS_GPL(ideapad_laptop_register_notifier, IDEAPAD_LAPTOP); +EXPORT_SYMBOL_NS_GPL(ideapad_laptop_register_notifier, "IDEAPAD_LAPTOP");  int ideapad_laptop_unregister_notifier(struct notifier_block *nb)  {  	return blocking_notifier_chain_unregister(&ideapad_laptop_chain_head, nb);  } -EXPORT_SYMBOL_NS_GPL(ideapad_laptop_unregister_notifier, IDEAPAD_LAPTOP); +EXPORT_SYMBOL_NS_GPL(ideapad_laptop_unregister_notifier, "IDEAPAD_LAPTOP");  void ideapad_laptop_call_notifier(unsigned long action, void *data)  {  	blocking_notifier_call_chain(&ideapad_laptop_chain_head, action, data);  } -EXPORT_SYMBOL_NS_GPL(ideapad_laptop_call_notifier, IDEAPAD_LAPTOP); +EXPORT_SYMBOL_NS_GPL(ideapad_laptop_call_notifier, "IDEAPAD_LAPTOP");  static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data)  { diff --git a/drivers/platform/x86/intel/ifs/core.c b/drivers/platform/x86/intel/ifs/core.c index bc252b883210..1ae50702bdb7 100644 --- a/drivers/platform/x86/intel/ifs/core.c +++ b/drivers/platform/x86/intel/ifs/core.c @@ -20,6 +20,7 @@ static const struct x86_cpu_id ifs_cpu_ids[] __initconst = {  	X86_MATCH(INTEL_GRANITERAPIDS_X, ARRAY_GEN0),  	X86_MATCH(INTEL_GRANITERAPIDS_D, ARRAY_GEN0),  	X86_MATCH(INTEL_ATOM_CRESTMONT_X, ARRAY_GEN1), +	X86_MATCH(INTEL_ATOM_DARKMONT_X, ARRAY_GEN1),  	{}  };  MODULE_DEVICE_TABLE(x86cpu, ifs_cpu_ids); diff --git a/drivers/platform/x86/intel/plr_tpmi.c b/drivers/platform/x86/intel/plr_tpmi.c index 69ace6a629bc..691d43c3592c 100644 --- a/drivers/platform/x86/intel/plr_tpmi.c +++ b/drivers/platform/x86/intel/plr_tpmi.c @@ -348,7 +348,7 @@ static struct auxiliary_driver intel_plr_aux_driver = {  };  module_auxiliary_driver(intel_plr_aux_driver); -MODULE_IMPORT_NS(INTEL_TPMI); -MODULE_IMPORT_NS(INTEL_TPMI_POWER_DOMAIN); +MODULE_IMPORT_NS("INTEL_TPMI"); +MODULE_IMPORT_NS("INTEL_TPMI_POWER_DOMAIN");  MODULE_DESCRIPTION("Intel TPMI PLR Driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/intel/pmc/core_ssram.c b/drivers/platform/x86/intel/pmc/core_ssram.c index 8504154b649f..739569803017 100644 --- a/drivers/platform/x86/intel/pmc/core_ssram.c +++ b/drivers/platform/x86/intel/pmc/core_ssram.c @@ -269,8 +269,12 @@ pmc_core_ssram_get_pmc(struct pmc_dev *pmcdev, int pmc_idx, u32 offset)  		/*  		 * The secondary PMC BARS (which are behind hidden PCI devices)  		 * are read from fixed offsets in MMIO of the primary PMC BAR. +		 * If a device is not present, the value will be 0.  		 */  		ssram_base = get_base(tmp_ssram, offset); +		if (!ssram_base) +			return 0; +  		ssram = ioremap(ssram_base, SSRAM_HDR_SIZE);  		if (!ssram)  			return -ENOMEM; @@ -324,5 +328,5 @@ release_dev:  	return ret;  } -MODULE_IMPORT_NS(INTEL_VSEC); -MODULE_IMPORT_NS(INTEL_PMT_TELEMETRY); +MODULE_IMPORT_NS("INTEL_VSEC"); +MODULE_IMPORT_NS("INTEL_PMT_TELEMETRY"); diff --git a/drivers/platform/x86/intel/pmt/class.c b/drivers/platform/x86/intel/pmt/class.c index 3c53cab03327..8ed54b7a3333 100644 --- a/drivers/platform/x86/intel/pmt/class.c +++ b/drivers/platform/x86/intel/pmt/class.c @@ -33,7 +33,7 @@ bool intel_pmt_is_early_client_hw(struct device *dev)  	 */  	return !!(ivdev->quirks & VSEC_QUIRK_EARLY_HW);  } -EXPORT_SYMBOL_NS_GPL(intel_pmt_is_early_client_hw, INTEL_PMT); +EXPORT_SYMBOL_NS_GPL(intel_pmt_is_early_client_hw, "INTEL_PMT");  static inline int  pmt_memcpy64_fromio(void *to, const u64 __iomem *from, size_t count) @@ -74,7 +74,7 @@ int pmt_telem_read_mmio(struct pci_dev *pdev, struct pmt_callbacks *cb, u32 guid  	return count;  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_read_mmio, INTEL_PMT); +EXPORT_SYMBOL_NS_GPL(pmt_telem_read_mmio, "INTEL_PMT");  /*   * sysfs @@ -359,7 +359,7 @@ int intel_pmt_dev_create(struct intel_pmt_entry *entry, struct intel_pmt_namespa  	return intel_pmt_dev_register(entry, ns, dev);  } -EXPORT_SYMBOL_NS_GPL(intel_pmt_dev_create, INTEL_PMT); +EXPORT_SYMBOL_NS_GPL(intel_pmt_dev_create, "INTEL_PMT");  void intel_pmt_dev_destroy(struct intel_pmt_entry *entry,  			   struct intel_pmt_namespace *ns) @@ -375,7 +375,7 @@ void intel_pmt_dev_destroy(struct intel_pmt_entry *entry,  	device_unregister(dev);  	xa_erase(ns->xa, entry->devid);  } -EXPORT_SYMBOL_NS_GPL(intel_pmt_dev_destroy, INTEL_PMT); +EXPORT_SYMBOL_NS_GPL(intel_pmt_dev_destroy, "INTEL_PMT");  static int __init pmt_class_init(void)  { diff --git a/drivers/platform/x86/intel/pmt/crashlog.c b/drivers/platform/x86/intel/pmt/crashlog.c index 9079d5dffc03..6a9eb3c4b313 100644 --- a/drivers/platform/x86/intel/pmt/crashlog.c +++ b/drivers/platform/x86/intel/pmt/crashlog.c @@ -328,4 +328,4 @@ module_exit(pmt_crashlog_exit);  MODULE_AUTHOR("Alexander Duyck <alexander.h.duyck@linux.intel.com>");  MODULE_DESCRIPTION("Intel PMT Crashlog driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(INTEL_PMT); +MODULE_IMPORT_NS("INTEL_PMT"); diff --git a/drivers/platform/x86/intel/pmt/telemetry.c b/drivers/platform/x86/intel/pmt/telemetry.c index 0cea617c6c2e..ac3a9bdf5601 100644 --- a/drivers/platform/x86/intel/pmt/telemetry.c +++ b/drivers/platform/x86/intel/pmt/telemetry.c @@ -153,7 +153,7 @@ unsigned long pmt_telem_get_next_endpoint(unsigned long start)  	return found_idx == start ? 0 : found_idx;  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_get_next_endpoint, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_get_next_endpoint, "INTEL_PMT_TELEMETRY");  struct telem_endpoint *pmt_telem_register_endpoint(int devid)  { @@ -172,13 +172,13 @@ struct telem_endpoint *pmt_telem_register_endpoint(int devid)  	return entry->ep;  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_register_endpoint, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_register_endpoint, "INTEL_PMT_TELEMETRY");  void pmt_telem_unregister_endpoint(struct telem_endpoint *ep)  {  	kref_put(&ep->kref, pmt_telem_ep_release);  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_unregister_endpoint, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_unregister_endpoint, "INTEL_PMT_TELEMETRY");  int pmt_telem_get_endpoint_info(int devid, struct telem_endpoint_info *info)  { @@ -204,7 +204,7 @@ unlock:  	return err;  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_get_endpoint_info, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_get_endpoint_info, "INTEL_PMT_TELEMETRY");  int pmt_telem_read(struct telem_endpoint *ep, u32 id, u64 *data, u32 count)  { @@ -224,7 +224,7 @@ int pmt_telem_read(struct telem_endpoint *ep, u32 id, u64 *data, u32 count)  	return ep->present ? 0 : -EPIPE;  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_read, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_read, "INTEL_PMT_TELEMETRY");  int pmt_telem_read32(struct telem_endpoint *ep, u32 id, u32 *data, u32 count)  { @@ -243,7 +243,7 @@ int pmt_telem_read32(struct telem_endpoint *ep, u32 id, u32 *data, u32 count)  	return ep->present ? 0 : -EPIPE;  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_read32, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_read32, "INTEL_PMT_TELEMETRY");  struct telem_endpoint *  pmt_telem_find_and_register_endpoint(struct pci_dev *pcidev, u32 guid, u16 pos) @@ -268,7 +268,7 @@ pmt_telem_find_and_register_endpoint(struct pci_dev *pcidev, u32 guid, u16 pos)  	return ERR_PTR(-ENXIO);  } -EXPORT_SYMBOL_NS_GPL(pmt_telem_find_and_register_endpoint, INTEL_PMT_TELEMETRY); +EXPORT_SYMBOL_NS_GPL(pmt_telem_find_and_register_endpoint, "INTEL_PMT_TELEMETRY");  static void pmt_telem_remove(struct auxiliary_device *auxdev)  { @@ -347,4 +347,4 @@ module_exit(pmt_telem_exit);  MODULE_AUTHOR("David E. Box <david.e.box@linux.intel.com>");  MODULE_DESCRIPTION("Intel PMT Telemetry driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(INTEL_PMT); +MODULE_IMPORT_NS("INTEL_PMT"); diff --git a/drivers/platform/x86/intel/speed_select_if/isst_if_common.c b/drivers/platform/x86/intel/speed_select_if/isst_if_common.c index 1e46e30dae96..dbcd3087aaa4 100644 --- a/drivers/platform/x86/intel/speed_select_if/isst_if_common.c +++ b/drivers/platform/x86/intel/speed_select_if/isst_if_common.c @@ -804,6 +804,7 @@ EXPORT_SYMBOL_GPL(isst_if_cdev_unregister);  static const struct x86_cpu_id isst_cpu_ids[] = {  	X86_MATCH_VFM(INTEL_ATOM_CRESTMONT,	SST_HPM_SUPPORTED),  	X86_MATCH_VFM(INTEL_ATOM_CRESTMONT_X,	SST_HPM_SUPPORTED), +	X86_MATCH_VFM(INTEL_ATOM_DARKMONT_X,	SST_HPM_SUPPORTED),  	X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X,	0),  	X86_MATCH_VFM(INTEL_GRANITERAPIDS_D,	SST_HPM_SUPPORTED),  	X86_MATCH_VFM(INTEL_GRANITERAPIDS_X,	SST_HPM_SUPPORTED), diff --git a/drivers/platform/x86/intel/speed_select_if/isst_tpmi.c b/drivers/platform/x86/intel/speed_select_if/isst_tpmi.c index 17972191538a..bcf0a5cbc68d 100644 --- a/drivers/platform/x86/intel/speed_select_if/isst_tpmi.c +++ b/drivers/platform/x86/intel/speed_select_if/isst_tpmi.c @@ -67,6 +67,6 @@ static struct auxiliary_driver intel_sst_aux_driver = {  module_auxiliary_driver(intel_sst_aux_driver); -MODULE_IMPORT_NS(INTEL_TPMI_SST); +MODULE_IMPORT_NS("INTEL_TPMI_SST");  MODULE_DESCRIPTION("Intel TPMI SST Driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c b/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c index 404582307109..9978cdd19851 100644 --- a/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c +++ b/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c @@ -1593,7 +1593,7 @@ unlock_exit:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_add, INTEL_TPMI_SST); +EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_add, "INTEL_TPMI_SST");  void tpmi_sst_dev_remove(struct auxiliary_device *auxdev)  { @@ -1614,7 +1614,7 @@ void tpmi_sst_dev_remove(struct auxiliary_device *auxdev)  	}  	mutex_unlock(&isst_tpmi_dev_lock);  } -EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_remove, INTEL_TPMI_SST); +EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_remove, "INTEL_TPMI_SST");  void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev)  { @@ -1642,7 +1642,7 @@ void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev)  						    power_domain_info->sst_header.pp_offset +  						    SST_PP_CONTROL_OFFSET);  } -EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_suspend, INTEL_TPMI_SST); +EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_suspend, "INTEL_TPMI_SST");  void tpmi_sst_dev_resume(struct auxiliary_device *auxdev)  { @@ -1669,7 +1669,7 @@ void tpmi_sst_dev_resume(struct auxiliary_device *auxdev)  	writeq(power_domain_info->saved_pp_control, power_domain_info->sst_base +  				power_domain_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET);  } -EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_resume, INTEL_TPMI_SST); +EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_resume, "INTEL_TPMI_SST");  #define ISST_TPMI_API_VERSION	0x03 @@ -1709,7 +1709,7 @@ init_done:  	mutex_unlock(&isst_tpmi_dev_lock);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(tpmi_sst_init, INTEL_TPMI_SST); +EXPORT_SYMBOL_NS_GPL(tpmi_sst_init, "INTEL_TPMI_SST");  void tpmi_sst_exit(void)  { @@ -1723,10 +1723,10 @@ void tpmi_sst_exit(void)  	}  	mutex_unlock(&isst_tpmi_dev_lock);  } -EXPORT_SYMBOL_NS_GPL(tpmi_sst_exit, INTEL_TPMI_SST); +EXPORT_SYMBOL_NS_GPL(tpmi_sst_exit, "INTEL_TPMI_SST"); -MODULE_IMPORT_NS(INTEL_TPMI); -MODULE_IMPORT_NS(INTEL_TPMI_POWER_DOMAIN); +MODULE_IMPORT_NS("INTEL_TPMI"); +MODULE_IMPORT_NS("INTEL_TPMI_POWER_DOMAIN");  MODULE_DESCRIPTION("ISST TPMI interface module");  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/intel/tpmi_power_domains.c b/drivers/platform/x86/intel/tpmi_power_domains.c index 0609a8320f7e..2f01cd22a6ee 100644 --- a/drivers/platform/x86/intel/tpmi_power_domains.c +++ b/drivers/platform/x86/intel/tpmi_power_domains.c @@ -81,6 +81,7 @@ static const struct x86_cpu_id tpmi_cpu_ids[] = {  	X86_MATCH_VFM(INTEL_GRANITERAPIDS_X,	NULL),  	X86_MATCH_VFM(INTEL_ATOM_CRESTMONT_X,	NULL),  	X86_MATCH_VFM(INTEL_ATOM_CRESTMONT,	NULL), +	X86_MATCH_VFM(INTEL_ATOM_DARKMONT_X,	NULL),  	X86_MATCH_VFM(INTEL_GRANITERAPIDS_D,	NULL),  	X86_MATCH_VFM(INTEL_PANTHERCOVE_X,	NULL),  	{} @@ -110,7 +111,7 @@ int tpmi_get_linux_cpu_number(int package_id, int domain_id, int punit_core_id)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_linux_cpu_number, INTEL_TPMI_POWER_DOMAIN); +EXPORT_SYMBOL_NS_GPL(tpmi_get_linux_cpu_number, "INTEL_TPMI_POWER_DOMAIN");  int tpmi_get_punit_core_number(int cpu_no)  { @@ -119,7 +120,7 @@ int tpmi_get_punit_core_number(int cpu_no)  	return per_cpu(tpmi_cpu_info, cpu_no).punit_core_id;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_punit_core_number, INTEL_TPMI_POWER_DOMAIN); +EXPORT_SYMBOL_NS_GPL(tpmi_get_punit_core_number, "INTEL_TPMI_POWER_DOMAIN");  int tpmi_get_power_domain_id(int cpu_no)  { @@ -128,7 +129,7 @@ int tpmi_get_power_domain_id(int cpu_no)  	return per_cpu(tpmi_cpu_info, cpu_no).punit_domain_id;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_power_domain_id, INTEL_TPMI_POWER_DOMAIN); +EXPORT_SYMBOL_NS_GPL(tpmi_get_power_domain_id, "INTEL_TPMI_POWER_DOMAIN");  cpumask_t *tpmi_get_power_domain_mask(int cpu_no)  { @@ -149,7 +150,7 @@ cpumask_t *tpmi_get_power_domain_mask(int cpu_no)  	return mask;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_power_domain_mask, INTEL_TPMI_POWER_DOMAIN); +EXPORT_SYMBOL_NS_GPL(tpmi_get_power_domain_mask, "INTEL_TPMI_POWER_DOMAIN");  static int tpmi_get_logical_id(unsigned int cpu, struct tpmi_cpu_info *info)  { diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c index e22b683a7a43..4e2c6a2d7e6e 100644 --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-common.c @@ -257,7 +257,7 @@ uncore_unlock:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(uncore_freq_add_entry, INTEL_UNCORE_FREQUENCY); +EXPORT_SYMBOL_NS_GPL(uncore_freq_add_entry, "INTEL_UNCORE_FREQUENCY");  void uncore_freq_remove_die_entry(struct uncore_data *data)  { @@ -270,7 +270,7 @@ void uncore_freq_remove_die_entry(struct uncore_data *data)  	mutex_unlock(&uncore_lock);  } -EXPORT_SYMBOL_NS_GPL(uncore_freq_remove_die_entry, INTEL_UNCORE_FREQUENCY); +EXPORT_SYMBOL_NS_GPL(uncore_freq_remove_die_entry, "INTEL_UNCORE_FREQUENCY");  int uncore_freq_common_init(int (*read)(struct uncore_data *data, unsigned int *value,  					enum uncore_index index), @@ -297,7 +297,7 @@ int uncore_freq_common_init(int (*read)(struct uncore_data *data, unsigned int *  	return uncore_root_kobj ? 0 : -ENOMEM;  } -EXPORT_SYMBOL_NS_GPL(uncore_freq_common_init, INTEL_UNCORE_FREQUENCY); +EXPORT_SYMBOL_NS_GPL(uncore_freq_common_init, "INTEL_UNCORE_FREQUENCY");  void uncore_freq_common_exit(void)  { @@ -309,7 +309,7 @@ void uncore_freq_common_exit(void)  	}  	mutex_unlock(&uncore_lock);  } -EXPORT_SYMBOL_NS_GPL(uncore_freq_common_exit, INTEL_UNCORE_FREQUENCY); +EXPORT_SYMBOL_NS_GPL(uncore_freq_common_exit, "INTEL_UNCORE_FREQUENCY");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c index 0591053813a2..4aa6c227ec82 100644 --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c @@ -629,7 +629,7 @@ static struct auxiliary_driver intel_uncore_aux_driver = {  module_auxiliary_driver(intel_uncore_aux_driver); -MODULE_IMPORT_NS(INTEL_TPMI); -MODULE_IMPORT_NS(INTEL_UNCORE_FREQUENCY); +MODULE_IMPORT_NS("INTEL_TPMI"); +MODULE_IMPORT_NS("INTEL_UNCORE_FREQUENCY");  MODULE_DESCRIPTION("Intel TPMI UFS Driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c index a450b8a6bcec..40bbf8e45fa4 100644 --- a/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c +++ b/drivers/platform/x86/intel/uncore-frequency/uncore-frequency.c @@ -316,6 +316,6 @@ static void __exit intel_uncore_exit(void)  }  module_exit(intel_uncore_exit) -MODULE_IMPORT_NS(INTEL_UNCORE_FREQUENCY); +MODULE_IMPORT_NS("INTEL_UNCORE_FREQUENCY");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("Intel Uncore Frequency Limits Driver"); diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c index 9e0f8e38178c..8272f1dd0fbc 100644 --- a/drivers/platform/x86/intel/vsec.c +++ b/drivers/platform/x86/intel/vsec.c @@ -137,7 +137,7 @@ int intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent,  	return devm_add_action_or_reset(parent, intel_vsec_remove_aux,  				       auxdev);  } -EXPORT_SYMBOL_NS_GPL(intel_vsec_add_aux, INTEL_VSEC); +EXPORT_SYMBOL_NS_GPL(intel_vsec_add_aux, "INTEL_VSEC");  static int intel_vsec_add_dev(struct pci_dev *pdev, struct intel_vsec_header *header,  			      struct intel_vsec_platform_info *info) @@ -340,7 +340,7 @@ void intel_vsec_register(struct pci_dev *pdev,  	intel_vsec_walk_header(pdev, info);  } -EXPORT_SYMBOL_NS_GPL(intel_vsec_register, INTEL_VSEC); +EXPORT_SYMBOL_NS_GPL(intel_vsec_register, "INTEL_VSEC");  static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  { @@ -423,6 +423,7 @@ static const struct intel_vsec_platform_info lnl_info = {  #define PCI_DEVICE_ID_INTEL_VSEC_RPL		0xa77d  #define PCI_DEVICE_ID_INTEL_VSEC_TGL		0x9a0d  #define PCI_DEVICE_ID_INTEL_VSEC_LNL_M		0x647d +#define PCI_DEVICE_ID_INTEL_VSEC_PTL		0xb07d  static const struct pci_device_id intel_vsec_pci_ids[] = {  	{ PCI_DEVICE_DATA(INTEL, VSEC_ADL, &tgl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_DG1, &dg1_info) }, @@ -432,6 +433,7 @@ static const struct pci_device_id intel_vsec_pci_ids[] = {  	{ PCI_DEVICE_DATA(INTEL, VSEC_RPL, &tgl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_TGL, &tgl_info) },  	{ PCI_DEVICE_DATA(INTEL, VSEC_LNL_M, &lnl_info) }, +	{ PCI_DEVICE_DATA(INTEL, VSEC_PTL, &mtl_info) },  	{ }  };  MODULE_DEVICE_TABLE(pci, intel_vsec_pci_ids); diff --git a/drivers/platform/x86/intel/vsec_tpmi.c b/drivers/platform/x86/intel/vsec_tpmi.c index c637e32048a3..5c383a27bbe8 100644 --- a/drivers/platform/x86/intel/vsec_tpmi.c +++ b/drivers/platform/x86/intel/vsec_tpmi.c @@ -193,7 +193,7 @@ struct intel_tpmi_plat_info *tpmi_get_platform_data(struct auxiliary_device *aux  	return vsec_dev->priv_data;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_platform_data, INTEL_TPMI); +EXPORT_SYMBOL_NS_GPL(tpmi_get_platform_data, "INTEL_TPMI");  int tpmi_get_resource_count(struct auxiliary_device *auxdev)  { @@ -204,7 +204,7 @@ int tpmi_get_resource_count(struct auxiliary_device *auxdev)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_resource_count, INTEL_TPMI); +EXPORT_SYMBOL_NS_GPL(tpmi_get_resource_count, "INTEL_TPMI");  struct resource *tpmi_get_resource_at_index(struct auxiliary_device *auxdev, int index)  { @@ -215,7 +215,7 @@ struct resource *tpmi_get_resource_at_index(struct auxiliary_device *auxdev, int  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_resource_at_index, INTEL_TPMI); +EXPORT_SYMBOL_NS_GPL(tpmi_get_resource_at_index, "INTEL_TPMI");  /* TPMI Control Interface */ @@ -354,7 +354,7 @@ int tpmi_get_feature_status(struct auxiliary_device *auxdev,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_feature_status, INTEL_TPMI); +EXPORT_SYMBOL_NS_GPL(tpmi_get_feature_status, "INTEL_TPMI");  struct dentry *tpmi_get_debugfs_dir(struct auxiliary_device *auxdev)  { @@ -363,7 +363,7 @@ struct dentry *tpmi_get_debugfs_dir(struct auxiliary_device *auxdev)  	return tpmi_info->dbgfs_dir;  } -EXPORT_SYMBOL_NS_GPL(tpmi_get_debugfs_dir, INTEL_TPMI); +EXPORT_SYMBOL_NS_GPL(tpmi_get_debugfs_dir, "INTEL_TPMI");  static int tpmi_pfs_dbg_show(struct seq_file *s, void *unused)  { @@ -852,6 +852,6 @@ static struct auxiliary_driver tpmi_aux_driver = {  module_auxiliary_driver(tpmi_aux_driver); -MODULE_IMPORT_NS(INTEL_VSEC); +MODULE_IMPORT_NS("INTEL_VSEC");  MODULE_DESCRIPTION("Intel TPMI enumeration module");  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/lenovo-ymc.c b/drivers/platform/x86/lenovo-ymc.c index bd9f95404c7c..470d53e3c9d2 100644 --- a/drivers/platform/x86/lenovo-ymc.c +++ b/drivers/platform/x86/lenovo-ymc.c @@ -162,4 +162,4 @@ module_wmi_driver(lenovo_ymc_driver);  MODULE_AUTHOR("Gergo Koteles <soyer@irl.hu>");  MODULE_DESCRIPTION("Lenovo Yoga Mode Control driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IDEAPAD_LAPTOP); +MODULE_IMPORT_NS("IDEAPAD_LAPTOP"); diff --git a/drivers/platform/x86/lenovo-yoga-tab2-pro-1380-fastcharger.c b/drivers/platform/x86/lenovo-yoga-tab2-pro-1380-fastcharger.c index d2699ca24f34..a96b215cd2c5 100644 --- a/drivers/platform/x86/lenovo-yoga-tab2-pro-1380-fastcharger.c +++ b/drivers/platform/x86/lenovo-yoga-tab2-pro-1380-fastcharger.c @@ -199,14 +199,15 @@ static int yt2_1380_fc_serdev_probe(struct serdev_device *serdev)  	if (ret)  		return ret; +	serdev_device_set_drvdata(serdev, fc); +	serdev_device_set_client_ops(serdev, &yt2_1380_fc_serdev_ops); +  	ret = devm_serdev_device_open(dev, serdev);  	if (ret)  		return dev_err_probe(dev, ret, "opening UART device\n");  	serdev_device_set_baudrate(serdev, 600);  	serdev_device_set_flow_control(serdev, false); -	serdev_device_set_drvdata(serdev, fc); -	serdev_device_set_client_ops(serdev, &yt2_1380_fc_serdev_ops);  	ret = devm_extcon_register_notifier_all(dev, fc->extcon, &fc->nb);  	if (ret) diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c index 671021cd1f59..9c7f30a47f1f 100644 --- a/drivers/platform/x86/mlx-platform.c +++ b/drivers/platform/x86/mlx-platform.c @@ -6237,6 +6237,7 @@ fail_pci_set_dma_mask:  fail_pci_request_regions:  	pci_disable_device(pci_dev);  fail_pci_enable_device: +	pci_dev_put(pci_dev);  	return err;  } @@ -6247,6 +6248,7 @@ mlxplat_pci_fpga_device_exit(struct pci_dev *pci_bridge,  	iounmap(pci_bridge_addr);  	pci_release_regions(pci_bridge);  	pci_disable_device(pci_bridge); +	pci_dev_put(pci_bridge);  }  static int diff --git a/drivers/platform/x86/p2sb.c b/drivers/platform/x86/p2sb.c index d51eb0db0626..cbbb0f809704 100644 --- a/drivers/platform/x86/p2sb.c +++ b/drivers/platform/x86/p2sb.c @@ -43,6 +43,7 @@ struct p2sb_res_cache {  };  static struct p2sb_res_cache p2sb_resources[NR_P2SB_RES_CACHE]; +static bool p2sb_hidden_by_bios;  static void p2sb_get_devfn(unsigned int *devfn)  { @@ -97,6 +98,12 @@ static void p2sb_scan_and_cache_devfn(struct pci_bus *bus, unsigned int devfn)  static int p2sb_scan_and_cache(struct pci_bus *bus, unsigned int devfn)  { +	/* +	 * The BIOS prevents the P2SB device from being enumerated by the PCI +	 * subsystem, so we need to unhide and hide it back to lookup the BAR. +	 */ +	pci_bus_write_config_dword(bus, devfn, P2SBC, 0); +  	/* Scan the P2SB device and cache its BAR0 */  	p2sb_scan_and_cache_devfn(bus, devfn); @@ -104,6 +111,8 @@ static int p2sb_scan_and_cache(struct pci_bus *bus, unsigned int devfn)  	if (devfn == P2SB_DEVFN_GOLDMONT)  		p2sb_scan_and_cache_devfn(bus, SPI_DEVFN_GOLDMONT); +	pci_bus_write_config_dword(bus, devfn, P2SBC, P2SBC_HIDE); +  	if (!p2sb_valid_resource(&p2sb_resources[PCI_FUNC(devfn)].res))  		return -ENOENT; @@ -129,7 +138,7 @@ static int p2sb_cache_resources(void)  	u32 value = P2SBC_HIDE;  	struct pci_bus *bus;  	u16 class; -	int ret; +	int ret = 0;  	/* Get devfn for P2SB device itself */  	p2sb_get_devfn(&devfn_p2sb); @@ -152,22 +161,53 @@ static int p2sb_cache_resources(void)  	 */  	pci_lock_rescan_remove(); +	pci_bus_read_config_dword(bus, devfn_p2sb, P2SBC, &value); +	p2sb_hidden_by_bios = value & P2SBC_HIDE; +  	/* -	 * The BIOS prevents the P2SB device from being enumerated by the PCI -	 * subsystem, so we need to unhide and hide it back to lookup the BAR. -	 * Unhide the P2SB device here, if needed. +	 * If the BIOS does not hide the P2SB device then its resources +	 * are accesilble. Cache them only if the P2SB device is hidden.  	 */ -	pci_bus_read_config_dword(bus, devfn_p2sb, P2SBC, &value); -	if (value & P2SBC_HIDE) -		pci_bus_write_config_dword(bus, devfn_p2sb, P2SBC, 0); +	if (p2sb_hidden_by_bios) +		ret = p2sb_scan_and_cache(bus, devfn_p2sb); -	ret = p2sb_scan_and_cache(bus, devfn_p2sb); +	pci_unlock_rescan_remove(); -	/* Hide the P2SB device, if it was hidden */ -	if (value & P2SBC_HIDE) -		pci_bus_write_config_dword(bus, devfn_p2sb, P2SBC, P2SBC_HIDE); +	return ret; +} -	pci_unlock_rescan_remove(); +static int p2sb_read_from_cache(struct pci_bus *bus, unsigned int devfn, +				struct resource *mem) +{ +	struct p2sb_res_cache *cache = &p2sb_resources[PCI_FUNC(devfn)]; + +	if (cache->bus_dev_id != bus->dev.id) +		return -ENODEV; + +	if (!p2sb_valid_resource(&cache->res)) +		return -ENOENT; + +	memcpy(mem, &cache->res, sizeof(*mem)); + +	return 0; +} + +static int p2sb_read_from_dev(struct pci_bus *bus, unsigned int devfn, +			      struct resource *mem) +{ +	struct pci_dev *pdev; +	int ret = 0; + +	pdev = pci_get_slot(bus, devfn); +	if (!pdev) +		return -ENODEV; + +	if (p2sb_valid_resource(pci_resource_n(pdev, 0))) +		p2sb_read_bar0(pdev, mem); +	else +		ret = -ENOENT; + +	pci_dev_put(pdev);  	return ret;  } @@ -188,8 +228,6 @@ static int p2sb_cache_resources(void)   */  int p2sb_bar(struct pci_bus *bus, unsigned int devfn, struct resource *mem)  { -	struct p2sb_res_cache *cache; -  	bus = p2sb_get_bus(bus);  	if (!bus)  		return -ENODEV; @@ -197,15 +235,10 @@ int p2sb_bar(struct pci_bus *bus, unsigned int devfn, struct resource *mem)  	if (!devfn)  		p2sb_get_devfn(&devfn); -	cache = &p2sb_resources[PCI_FUNC(devfn)]; -	if (cache->bus_dev_id != bus->dev.id) -		return -ENODEV; +	if (p2sb_hidden_by_bios) +		return p2sb_read_from_cache(bus, devfn, mem); -	if (!p2sb_valid_resource(&cache->res)) -		return -ENOENT; - -	memcpy(mem, &cache->res, sizeof(*mem)); -	return 0; +	return p2sb_read_from_dev(bus, devfn, mem);  }  EXPORT_SYMBOL_GPL(p2sb_bar); diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index 0d3e3ca20b1b..decde4c9a3d9 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c @@ -1653,5 +1653,5 @@ module_init(samsung_init);  module_exit(samsung_exit);  MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@suse.de>"); -MODULE_DESCRIPTION("Samsung Backlight driver"); +MODULE_DESCRIPTION("Samsung Laptop driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 6371a9f765c1..2cfb2ac3f465 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -184,7 +184,8 @@ enum tpacpi_hkey_event_t {  						   */  	TP_HKEY_EV_AMT_TOGGLE		= 0x131a, /* Toggle AMT on/off */  	TP_HKEY_EV_DOUBLETAP_TOGGLE	= 0x131c, /* Toggle trackpoint doubletap on/off */ -	TP_HKEY_EV_PROFILE_TOGGLE	= 0x131f, /* Toggle platform profile */ +	TP_HKEY_EV_PROFILE_TOGGLE	= 0x131f, /* Toggle platform profile in 2024 systems */ +	TP_HKEY_EV_PROFILE_TOGGLE2	= 0x1401, /* Toggle platform profile in 2025 + systems */  	/* Reasons for waking up from S3/S4 */  	TP_HKEY_EV_WKUP_S3_UNDOCK	= 0x2304, /* undock requested, S3 */ @@ -11200,6 +11201,7 @@ static bool tpacpi_driver_event(const unsigned int hkey_event)  		tp_features.trackpoint_doubletap = !tp_features.trackpoint_doubletap;  		return true;  	case TP_HKEY_EV_PROFILE_TOGGLE: +	case TP_HKEY_EV_PROFILE_TOGGLE2:  		platform_profile_cycle();  		return true;  	} diff --git a/drivers/platform/x86/touchscreen_dmi.c b/drivers/platform/x86/touchscreen_dmi.c index 0a39f68c641d..bdc19cd8d3ed 100644 --- a/drivers/platform/x86/touchscreen_dmi.c +++ b/drivers/platform/x86/touchscreen_dmi.c @@ -855,6 +855,23 @@ static const struct ts_dmi_data rwc_nanote_next_data = {  	.properties = rwc_nanote_next_props,  }; +static const struct property_entry sary_tab_3_props[] = { +	PROPERTY_ENTRY_U32("touchscreen-size-x", 1730), +	PROPERTY_ENTRY_U32("touchscreen-size-y", 1151), +	PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), +	PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), +	PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), +	PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-sary-tab-3.fw"), +	PROPERTY_ENTRY_U32("silead,max-fingers", 10), +	PROPERTY_ENTRY_BOOL("silead,home-button"), +	{ } +}; + +static const struct ts_dmi_data sary_tab_3_data = { +	.acpi_name	= "MSSL1680:00", +	.properties	= sary_tab_3_props, +}; +  static const struct property_entry schneider_sct101ctm_props[] = {  	PROPERTY_ENTRY_U32("touchscreen-size-x", 1715),  	PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), @@ -1616,6 +1633,15 @@ const struct dmi_system_id touchscreen_dmi_table[] = {  		},  	},  	{ +		/* SARY Tab 3 */ +		.driver_data = (void *)&sary_tab_3_data, +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "SARY"), +			DMI_MATCH(DMI_PRODUCT_NAME, "C210C"), +			DMI_MATCH(DMI_PRODUCT_SKU, "TAB3"), +		}, +	}, +	{  		/* Schneider SCT101CTM */  		.driver_data = (void *)&schneider_sct101ctm_data,  		.matches = { diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c index a6c8b85dd024..20a9efebbcb7 100644 --- a/drivers/pmdomain/core.c +++ b/drivers/pmdomain/core.c @@ -2142,6 +2142,11 @@ static int genpd_set_default_power_state(struct generic_pm_domain *genpd)  	return 0;  } +static void genpd_provider_release(struct device *dev) +{ +	/* nothing to be done here */ +} +  static int genpd_alloc_data(struct generic_pm_domain *genpd)  {  	struct genpd_governor_data *gd = NULL; @@ -2172,8 +2177,25 @@ static int genpd_alloc_data(struct generic_pm_domain *genpd)  	}  	genpd->gd = gd; -	return 0; +	device_initialize(&genpd->dev); +	genpd->dev.release = genpd_provider_release; + +	if (!genpd_is_dev_name_fw(genpd)) { +		dev_set_name(&genpd->dev, "%s", genpd->name); +	} else { +		ret = ida_alloc(&genpd_ida, GFP_KERNEL); +		if (ret < 0) +			goto put; + +		genpd->device_id = ret; +		dev_set_name(&genpd->dev, "%s_%u", genpd->name, genpd->device_id); +	} +	return 0; +put: +	put_device(&genpd->dev); +	if (genpd->free_states == genpd_free_default_power_state) +		kfree(genpd->states);  free:  	if (genpd_is_cpu_domain(genpd))  		free_cpumask_var(genpd->cpus); @@ -2183,6 +2205,9 @@ free:  static void genpd_free_data(struct generic_pm_domain *genpd)  { +	put_device(&genpd->dev); +	if (genpd->device_id != -ENXIO) +		ida_free(&genpd_ida, genpd->device_id);  	if (genpd_is_cpu_domain(genpd))  		free_cpumask_var(genpd->cpus);  	if (genpd->free_states) @@ -2271,20 +2296,6 @@ int pm_genpd_init(struct generic_pm_domain *genpd,  	if (ret)  		return ret; -	device_initialize(&genpd->dev); - -	if (!genpd_is_dev_name_fw(genpd)) { -		dev_set_name(&genpd->dev, "%s", genpd->name); -	} else { -		ret = ida_alloc(&genpd_ida, GFP_KERNEL); -		if (ret < 0) { -			put_device(&genpd->dev); -			return ret; -		} -		genpd->device_id = ret; -		dev_set_name(&genpd->dev, "%s_%u", genpd->name, genpd->device_id); -	} -  	mutex_lock(&gpd_list_lock);  	list_add(&genpd->gpd_list_node, &gpd_list);  	mutex_unlock(&gpd_list_lock); @@ -2325,8 +2336,6 @@ static int genpd_remove(struct generic_pm_domain *genpd)  	genpd_unlock(genpd);  	genpd_debug_remove(genpd);  	cancel_work_sync(&genpd->power_off_work); -	if (genpd->device_id != -ENXIO) -		ida_free(&genpd_ida, genpd->device_id);  	genpd_free_data(genpd);  	pr_debug("%s: removed %s\n", __func__, dev_name(&genpd->dev)); diff --git a/drivers/pmdomain/imx/gpc.c b/drivers/pmdomain/imx/gpc.c index fbb4c90b72c4..f18c7e6e75dd 100644 --- a/drivers/pmdomain/imx/gpc.c +++ b/drivers/pmdomain/imx/gpc.c @@ -233,7 +233,7 @@ static struct platform_driver imx_pgc_power_domain_driver = {  		.name = "imx-pgc-pd",  	},  	.probe = imx_pgc_power_domain_probe, -	.remove_new = imx_pgc_power_domain_remove, +	.remove = imx_pgc_power_domain_remove,  	.id_table = imx_pgc_power_domain_id,  };  builtin_platform_driver(imx_pgc_power_domain_driver) @@ -545,6 +545,6 @@ static struct platform_driver imx_gpc_driver = {  		.of_match_table = imx_gpc_dt_ids,  	},  	.probe = imx_gpc_probe, -	.remove_new = imx_gpc_remove, +	.remove = imx_gpc_remove,  };  builtin_platform_driver(imx_gpc_driver) diff --git a/drivers/pmdomain/imx/gpcv2.c b/drivers/pmdomain/imx/gpcv2.c index 6e6ecbf2e152..9bdb80fd7210 100644 --- a/drivers/pmdomain/imx/gpcv2.c +++ b/drivers/pmdomain/imx/gpcv2.c @@ -403,7 +403,7 @@ static int imx_pgc_power_up(struct generic_pm_domain *genpd)  		 * already reaches target before udelay()  		 */  		regmap_read_bypassed(domain->regmap, domain->regs->hsk, ®_val); -		udelay(5); +		udelay(10);  	}  	/* Disable reset clocks for all devices in the domain */ @@ -1439,7 +1439,7 @@ static struct platform_driver imx_pgc_domain_driver = {  		.pm = &imx_pgc_domain_pm_ops,  	},  	.probe    = imx_pgc_domain_probe, -	.remove_new = imx_pgc_domain_remove, +	.remove = imx_pgc_domain_remove,  	.id_table = imx_pgc_domain_id,  };  builtin_platform_driver(imx_pgc_domain_driver) @@ -1458,12 +1458,12 @@ static int imx_gpcv2_probe(struct platform_device *pdev)  		.max_register   = SZ_4K,  	};  	struct device *dev = &pdev->dev; -	struct device_node *pgc_np; +	struct device_node *pgc_np __free(device_node) = +		of_get_child_by_name(dev->of_node, "pgc");  	struct regmap *regmap;  	void __iomem *base;  	int ret; -	pgc_np = of_get_child_by_name(dev->of_node, "pgc");  	if (!pgc_np) {  		dev_err(dev, "No power domains specified in DT\n");  		return -EINVAL; diff --git a/drivers/pmdomain/imx/imx8m-blk-ctrl.c b/drivers/pmdomain/imx/imx8m-blk-ctrl.c index ca942d7929c2..23db85b7aa9e 100644 --- a/drivers/pmdomain/imx/imx8m-blk-ctrl.c +++ b/drivers/pmdomain/imx/imx8m-blk-ctrl.c @@ -889,7 +889,7 @@ MODULE_DEVICE_TABLE(of, imx8m_blk_ctrl_of_match);  static struct platform_driver imx8m_blk_ctrl_driver = {  	.probe = imx8m_blk_ctrl_probe, -	.remove_new = imx8m_blk_ctrl_remove, +	.remove = imx8m_blk_ctrl_remove,  	.driver = {  		.name = "imx8m-blk-ctrl",  		.pm = &imx8m_blk_ctrl_pm_ops, diff --git a/drivers/pmdomain/imx/imx8mp-blk-ctrl.c b/drivers/pmdomain/imx/imx8mp-blk-ctrl.c index 77e889165eed..3668fe66b22c 100644 --- a/drivers/pmdomain/imx/imx8mp-blk-ctrl.c +++ b/drivers/pmdomain/imx/imx8mp-blk-ctrl.c @@ -770,7 +770,7 @@ static void imx8mp_blk_ctrl_remove(struct platform_device *pdev)  	of_genpd_del_provider(pdev->dev.of_node); -	for (i = 0; bc->onecell_data.num_domains; i++) { +	for (i = 0; i < bc->onecell_data.num_domains; i++) {  		struct imx8mp_blk_ctrl_domain *domain = &bc->domains[i];  		pm_genpd_remove(&domain->genpd); @@ -857,7 +857,7 @@ MODULE_DEVICE_TABLE(of, imx8mp_blk_ctrl_of_match);  static struct platform_driver imx8mp_blk_ctrl_driver = {  	.probe = imx8mp_blk_ctrl_probe, -	.remove_new = imx8mp_blk_ctrl_remove, +	.remove = imx8mp_blk_ctrl_remove,  	.driver = {  		.name = "imx8mp-blk-ctrl",  		.pm = &imx8mp_blk_ctrl_pm_ops, diff --git a/drivers/pmdomain/imx/imx93-blk-ctrl.c b/drivers/pmdomain/imx/imx93-blk-ctrl.c index b10348ac10f0..0e2ba8ec55d7 100644 --- a/drivers/pmdomain/imx/imx93-blk-ctrl.c +++ b/drivers/pmdomain/imx/imx93-blk-ctrl.c @@ -438,7 +438,7 @@ MODULE_DEVICE_TABLE(of, imx93_blk_ctrl_of_match);  static struct platform_driver imx93_blk_ctrl_driver = {  	.probe = imx93_blk_ctrl_probe, -	.remove_new = imx93_blk_ctrl_remove, +	.remove = imx93_blk_ctrl_remove,  	.driver = {  		.name = "imx93-blk-ctrl",  		.of_match_table = imx93_blk_ctrl_of_match, diff --git a/drivers/pmdomain/imx/imx93-pd.c b/drivers/pmdomain/imx/imx93-pd.c index 25ab592945bd..d68273330687 100644 --- a/drivers/pmdomain/imx/imx93-pd.c +++ b/drivers/pmdomain/imx/imx93-pd.c @@ -162,7 +162,7 @@ static struct platform_driver imx93_power_domain_driver = {  		.of_match_table = imx93_pd_ids,  	},  	.probe = imx93_pd_probe, -	.remove_new = imx93_pd_remove, +	.remove = imx93_pd_remove,  };  module_platform_driver(imx93_power_domain_driver); diff --git a/drivers/pmdomain/qcom/cpr.c b/drivers/pmdomain/qcom/cpr.c index 26a60a101e42..3ee8184e4be3 100644 --- a/drivers/pmdomain/qcom/cpr.c +++ b/drivers/pmdomain/qcom/cpr.c @@ -1717,7 +1717,7 @@ MODULE_DEVICE_TABLE(of, cpr_match_table);  static struct platform_driver cpr_driver = {  	.probe		= cpr_probe, -	.remove_new	= cpr_remove, +	.remove		= cpr_remove,  	.driver		= {  		.name	= "qcom-cpr",  		.of_match_table = cpr_match_table, diff --git a/drivers/pmdomain/xilinx/zynqmp-pm-domains.c b/drivers/pmdomain/xilinx/zynqmp-pm-domains.c index 0b5831e5ba1b..d579220a4500 100644 --- a/drivers/pmdomain/xilinx/zynqmp-pm-domains.c +++ b/drivers/pmdomain/xilinx/zynqmp-pm-domains.c @@ -313,7 +313,7 @@ static struct platform_driver zynqmp_power_domain_driver = {  		.sync_state = zynqmp_gpd_sync_state,  	},  	.probe = zynqmp_gpd_probe, -	.remove_new = zynqmp_gpd_remove, +	.remove = zynqmp_gpd_remove,  };  module_platform_driver(zynqmp_power_domain_driver); diff --git a/drivers/power/supply/bq24190_charger.c b/drivers/power/supply/bq24190_charger.c index 2b393eb5c282..c47f32f152e6 100644 --- a/drivers/power/supply/bq24190_charger.c +++ b/drivers/power/supply/bq24190_charger.c @@ -567,6 +567,7 @@ static int bq24190_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)  static int bq24296_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)  { +	union power_supply_propval val = { .intval = bdi->charge_type };  	int ret;  	ret = pm_runtime_resume_and_get(bdi->dev); @@ -587,13 +588,18 @@ static int bq24296_set_otg_vbus(struct bq24190_dev_info *bdi, bool enable)  		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,  					 BQ24296_REG_POC_OTG_CONFIG_MASK, -					 BQ24296_REG_POC_CHG_CONFIG_SHIFT, +					 BQ24296_REG_POC_OTG_CONFIG_SHIFT,  					 BQ24296_REG_POC_OTG_CONFIG_OTG); -	} else +	} else {  		ret = bq24190_write_mask(bdi, BQ24190_REG_POC,  					 BQ24296_REG_POC_OTG_CONFIG_MASK, -					 BQ24296_REG_POC_CHG_CONFIG_SHIFT, +					 BQ24296_REG_POC_OTG_CONFIG_SHIFT,  					 BQ24296_REG_POC_OTG_CONFIG_DISABLE); +		if (ret < 0) +			goto out; + +		ret = bq24190_charger_set_charge_type(bdi, &val); +	}  out:  	pm_runtime_mark_last_busy(bdi->dev); diff --git a/drivers/power/supply/cros_charge-control.c b/drivers/power/supply/cros_charge-control.c index 17c53591ce19..9b0a7500296b 100644 --- a/drivers/power/supply/cros_charge-control.c +++ b/drivers/power/supply/cros_charge-control.c @@ -7,8 +7,10 @@  #include <acpi/battery.h>  #include <linux/container_of.h>  #include <linux/dmi.h> +#include <linux/lockdep.h>  #include <linux/mod_devicetable.h>  #include <linux/module.h> +#include <linux/mutex.h>  #include <linux/platform_data/cros_ec_commands.h>  #include <linux/platform_data/cros_ec_proto.h>  #include <linux/platform_device.h> @@ -49,6 +51,7 @@ struct cros_chctl_priv {  	struct attribute *attributes[_CROS_CHCTL_ATTR_COUNT];  	struct attribute_group group; +	struct mutex lock; /* protects fields below and cros_ec */  	enum power_supply_charge_behaviour current_behaviour;  	u8 current_start_threshold, current_end_threshold;  }; @@ -85,6 +88,8 @@ static int cros_chctl_configure_ec(struct cros_chctl_priv *priv)  {  	struct ec_params_charge_control req = {}; +	lockdep_assert_held(&priv->lock); +  	req.cmd = EC_CHARGE_CONTROL_CMD_SET;  	switch (priv->current_behaviour) { @@ -134,11 +139,15 @@ static ssize_t cros_chctl_store_threshold(struct device *dev, struct cros_chctl_  		return -EINVAL;  	if (is_end_threshold) { -		if (val <= priv->current_start_threshold) +		/* Start threshold is not exposed, use fixed value */ +		if (priv->cmd_version == 2) +			priv->current_start_threshold = val == 100 ? 0 : val; + +		if (val < priv->current_start_threshold)  			return -EINVAL;  		priv->current_end_threshold = val;  	} else { -		if (val >= priv->current_end_threshold) +		if (val > priv->current_end_threshold)  			return -EINVAL;  		priv->current_start_threshold = val;  	} @@ -159,6 +168,7 @@ static ssize_t charge_control_start_threshold_show(struct device *dev,  	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(&attr->attr,  							       CROS_CHCTL_ATTR_START_THRESHOLD); +	guard(mutex)(&priv->lock);  	return sysfs_emit(buf, "%u\n", (unsigned int)priv->current_start_threshold);  } @@ -169,6 +179,7 @@ static ssize_t charge_control_start_threshold_store(struct device *dev,  	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(&attr->attr,  							       CROS_CHCTL_ATTR_START_THRESHOLD); +	guard(mutex)(&priv->lock);  	return cros_chctl_store_threshold(dev, priv, 0, buf, count);  } @@ -178,6 +189,7 @@ static ssize_t charge_control_end_threshold_show(struct device *dev, struct devi  	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(&attr->attr,  							       CROS_CHCTL_ATTR_END_THRESHOLD); +	guard(mutex)(&priv->lock);  	return sysfs_emit(buf, "%u\n", (unsigned int)priv->current_end_threshold);  } @@ -187,6 +199,7 @@ static ssize_t charge_control_end_threshold_store(struct device *dev, struct dev  	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(&attr->attr,  							       CROS_CHCTL_ATTR_END_THRESHOLD); +	guard(mutex)(&priv->lock);  	return cros_chctl_store_threshold(dev, priv, 1, buf, count);  } @@ -195,6 +208,7 @@ static ssize_t charge_behaviour_show(struct device *dev, struct device_attribute  	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(&attr->attr,  							       CROS_CHCTL_ATTR_CHARGE_BEHAVIOUR); +	guard(mutex)(&priv->lock);  	return power_supply_charge_behaviour_show(dev, EC_CHARGE_CONTROL_BEHAVIOURS,  						  priv->current_behaviour, buf);  } @@ -210,6 +224,7 @@ static ssize_t charge_behaviour_store(struct device *dev, struct device_attribut  	if (ret < 0)  		return ret; +	guard(mutex)(&priv->lock);  	priv->current_behaviour = ret;  	ret = cros_chctl_configure_ec(priv); @@ -223,12 +238,10 @@ static umode_t cros_chtl_attr_is_visible(struct kobject *kobj, struct attribute  {  	struct cros_chctl_priv *priv = cros_chctl_attr_to_priv(attr, n); -	if (priv->cmd_version < 2) { -		if (n == CROS_CHCTL_ATTR_START_THRESHOLD) -			return 0; -		if (n == CROS_CHCTL_ATTR_END_THRESHOLD) -			return 0; -	} +	if (n == CROS_CHCTL_ATTR_START_THRESHOLD && priv->cmd_version < 3) +		return 0; +	else if (n == CROS_CHCTL_ATTR_END_THRESHOLD && priv->cmd_version < 2) +		return 0;  	return attr->mode;  } @@ -290,6 +303,10 @@ static int cros_chctl_probe(struct platform_device *pdev)  	if (!priv)  		return -ENOMEM; +	ret = devm_mutex_init(dev, &priv->lock); +	if (ret) +		return ret; +  	ret = cros_ec_get_cmd_versions(cros_ec, EC_CMD_CHARGE_CONTROL);  	if (ret < 0)  		return ret; @@ -327,7 +344,8 @@ static int cros_chctl_probe(struct platform_device *pdev)  	priv->current_end_threshold = 100;  	/* Bring EC into well-known state */ -	ret = cros_chctl_configure_ec(priv); +	scoped_guard(mutex, &priv->lock) +		ret = cros_chctl_configure_ec(priv);  	if (ret < 0)  		return ret; diff --git a/drivers/power/supply/gpio-charger.c b/drivers/power/supply/gpio-charger.c index 68212b39785b..6139f736ecbe 100644 --- a/drivers/power/supply/gpio-charger.c +++ b/drivers/power/supply/gpio-charger.c @@ -67,6 +67,14 @@ static int set_charge_current_limit(struct gpio_charger *gpio_charger, int val)  		if (gpio_charger->current_limit_map[i].limit_ua <= val)  			break;  	} + +	/* +	 * If a valid charge current limit isn't found, default to smallest +	 * current limitation for safety reasons. +	 */ +	if (i >= gpio_charger->current_limit_map_size) +		i = gpio_charger->current_limit_map_size - 1; +  	mapping = gpio_charger->current_limit_map[i];  	for (i = 0; i < ndescs; i++) { diff --git a/drivers/powercap/idle_inject.c b/drivers/powercap/idle_inject.c index bafc59904ed3..04c212953ded 100644 --- a/drivers/powercap/idle_inject.c +++ b/drivers/powercap/idle_inject.c @@ -179,7 +179,7 @@ void idle_inject_set_duration(struct idle_inject_device *ii_dev,  	if (!run_duration_us)  		pr_debug("CPU is forced to 100 percent idle\n");  } -EXPORT_SYMBOL_NS_GPL(idle_inject_set_duration, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_set_duration, "IDLE_INJECT");  /**   * idle_inject_get_duration - idle and run duration retrieval helper @@ -194,7 +194,7 @@ void idle_inject_get_duration(struct idle_inject_device *ii_dev,  	*run_duration_us = READ_ONCE(ii_dev->run_duration_us);  	*idle_duration_us = READ_ONCE(ii_dev->idle_duration_us);  } -EXPORT_SYMBOL_NS_GPL(idle_inject_get_duration, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_get_duration, "IDLE_INJECT");  /**   * idle_inject_set_latency - set the maximum latency allowed @@ -206,7 +206,7 @@ void idle_inject_set_latency(struct idle_inject_device *ii_dev,  {  	WRITE_ONCE(ii_dev->latency_us, latency_us);  } -EXPORT_SYMBOL_NS_GPL(idle_inject_set_latency, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_set_latency, "IDLE_INJECT");  /**   * idle_inject_start - start idle injections @@ -238,7 +238,7 @@ int idle_inject_start(struct idle_inject_device *ii_dev)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(idle_inject_start, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_start, "IDLE_INJECT");  /**   * idle_inject_stop - stops idle injections @@ -285,7 +285,7 @@ void idle_inject_stop(struct idle_inject_device *ii_dev)  	cpu_hotplug_enable();  } -EXPORT_SYMBOL_NS_GPL(idle_inject_stop, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_stop, "IDLE_INJECT");  /**   * idle_inject_setup - prepare the current task for idle injection @@ -367,7 +367,7 @@ out_rollback:  	return NULL;  } -EXPORT_SYMBOL_NS_GPL(idle_inject_register_full, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_register_full, "IDLE_INJECT");  /**   * idle_inject_register - initialize idle injection on a set of CPUs @@ -384,7 +384,7 @@ struct idle_inject_device *idle_inject_register(struct cpumask *cpumask)  {  	return idle_inject_register_full(cpumask, NULL);  } -EXPORT_SYMBOL_NS_GPL(idle_inject_register, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_register, "IDLE_INJECT");  /**   * idle_inject_unregister - unregister idle injection control device @@ -405,7 +405,7 @@ void idle_inject_unregister(struct idle_inject_device *ii_dev)  	kfree(ii_dev);  } -EXPORT_SYMBOL_NS_GPL(idle_inject_unregister, IDLE_INJECT); +EXPORT_SYMBOL_NS_GPL(idle_inject_unregister, "IDLE_INJECT");  static struct smp_hotplug_thread idle_inject_threads = {  	.store = &idle_inject_thread.tsk, diff --git a/drivers/powercap/intel_rapl_msr.c b/drivers/powercap/intel_rapl_msr.c index cbe07450de93..2b81aabdb0db 100644 --- a/drivers/powercap/intel_rapl_msr.c +++ b/drivers/powercap/intel_rapl_msr.c @@ -213,7 +213,7 @@ MODULE_DEVICE_TABLE(platform, rapl_msr_ids);  static struct platform_driver intel_rapl_msr_driver = {  	.probe = rapl_msr_probe, -	.remove_new = rapl_msr_remove, +	.remove = rapl_msr_remove,  	.id_table = rapl_msr_ids,  	.driver = {  		.name = "intel_rapl_msr", diff --git a/drivers/powercap/intel_rapl_tpmi.c b/drivers/powercap/intel_rapl_tpmi.c index 645fd1dc51a9..af2368f4db10 100644 --- a/drivers/powercap/intel_rapl_tpmi.c +++ b/drivers/powercap/intel_rapl_tpmi.c @@ -347,7 +347,7 @@ static struct auxiliary_driver intel_rapl_tpmi_driver = {  module_auxiliary_driver(intel_rapl_tpmi_driver) -MODULE_IMPORT_NS(INTEL_TPMI); +MODULE_IMPORT_NS("INTEL_TPMI");  MODULE_DESCRIPTION("Intel RAPL TPMI Driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/pps/clients/pps-gpio.c b/drivers/pps/clients/pps-gpio.c index 791fdc9326dd..634c3b2f8c26 100644 --- a/drivers/pps/clients/pps-gpio.c +++ b/drivers/pps/clients/pps-gpio.c @@ -239,7 +239,7 @@ MODULE_DEVICE_TABLE(of, pps_gpio_dt_ids);  static struct platform_driver pps_gpio_driver = {  	.probe		= pps_gpio_probe, -	.remove_new	= pps_gpio_remove, +	.remove		= pps_gpio_remove,  	.driver		= {  		.name	= PPS_GPIO_NAME,  		.of_match_table	= pps_gpio_dt_ids, diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c index c56cd0f63909..77a36e7bddd5 100644 --- a/drivers/ptp/ptp_clock.c +++ b/drivers/ptp/ptp_clock.c @@ -150,7 +150,8 @@ static int ptp_clock_adjtime(struct posix_clock *pc, struct __kernel_timex *tx)  		if (ppb > ops->max_adj || ppb < -ops->max_adj)  			return -ERANGE;  		err = ops->adjfine(ops, tx->freq); -		ptp->dialed_frequency = tx->freq; +		if (!err) +			ptp->dialed_frequency = tx->freq;  	} else if (tx->modes & ADJ_OFFSET) {  		if (ops->adjphase) {  			s32 max_phase_adj = ops->getmaxphase(ops); diff --git a/drivers/ptp/ptp_clockmatrix.c b/drivers/ptp/ptp_clockmatrix.c index b6f1941308b1..fbb3fa8fc60b 100644 --- a/drivers/ptp/ptp_clockmatrix.c +++ b/drivers/ptp/ptp_clockmatrix.c @@ -2471,7 +2471,7 @@ static struct platform_driver idtcm_driver = {  		.name = "8a3400x-phc",  	},  	.probe = idtcm_probe, -	.remove_new = idtcm_remove, +	.remove = idtcm_remove,  };  module_platform_driver(idtcm_driver); diff --git a/drivers/ptp/ptp_dte.c b/drivers/ptp/ptp_dte.c index 449ff90927be..847276c69008 100644 --- a/drivers/ptp/ptp_dte.c +++ b/drivers/ptp/ptp_dte.c @@ -327,7 +327,7 @@ static struct platform_driver ptp_dte_driver = {  		.of_match_table = ptp_dte_of_match,  	},  	.probe    = ptp_dte_probe, -	.remove_new = ptp_dte_remove, +	.remove   = ptp_dte_remove,  };  module_platform_driver(ptp_dte_driver); diff --git a/drivers/ptp/ptp_fc3.c b/drivers/ptp/ptp_fc3.c index 879b82f03535..cfced36c70bc 100644 --- a/drivers/ptp/ptp_fc3.c +++ b/drivers/ptp/ptp_fc3.c @@ -1003,7 +1003,7 @@ static struct platform_driver idtfc3_driver = {  		.name = "rc38xxx-phc",  	},  	.probe = idtfc3_probe, -	.remove_new = idtfc3_remove, +	.remove = idtfc3_remove,  };  module_platform_driver(idtfc3_driver); diff --git a/drivers/ptp/ptp_idt82p33.c b/drivers/ptp/ptp_idt82p33.c index d5732490ed9d..b2fd94d4f863 100644 --- a/drivers/ptp/ptp_idt82p33.c +++ b/drivers/ptp/ptp_idt82p33.c @@ -1461,7 +1461,7 @@ static struct platform_driver idt82p33_driver = {  		.name = "82p33x1x-phc",  	},  	.probe = idt82p33_probe, -	.remove_new = idt82p33_remove, +	.remove = idt82p33_remove,  };  module_platform_driver(idt82p33_driver); diff --git a/drivers/ptp/ptp_ines.c b/drivers/ptp/ptp_ines.c index 14a23d3a27f2..68f1f7fdaa9d 100644 --- a/drivers/ptp/ptp_ines.c +++ b/drivers/ptp/ptp_ines.c @@ -782,7 +782,7 @@ MODULE_DEVICE_TABLE(of, ines_ptp_ctrl_of_match);  static struct platform_driver ines_ptp_ctrl_driver = {  	.probe  = ines_ptp_ctrl_probe, -	.remove_new = ines_ptp_ctrl_remove, +	.remove = ines_ptp_ctrl_remove,  	.driver = {  		.name = "ines_ptp_ctrl",  		.of_match_table = ines_ptp_ctrl_of_match, diff --git a/drivers/ptp/ptp_kvm_x86.c b/drivers/ptp/ptp_kvm_x86.c index 617c8d6706d3..6cea4fe39bcf 100644 --- a/drivers/ptp/ptp_kvm_x86.c +++ b/drivers/ptp/ptp_kvm_x86.c @@ -26,7 +26,7 @@ int kvm_arch_ptp_init(void)  	long ret;  	if (!kvm_para_available()) -		return -ENODEV; +		return -EOPNOTSUPP;  	if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) {  		p = alloc_page(GFP_KERNEL | __GFP_ZERO); @@ -46,14 +46,14 @@ int kvm_arch_ptp_init(void)  	clock_pair_gpa = slow_virt_to_phys(clock_pair);  	if (!pvclock_get_pvti_cpu0_va()) { -		ret = -ENODEV; +		ret = -EOPNOTSUPP;  		goto err;  	}  	ret = kvm_hypercall2(KVM_HC_CLOCK_PAIRING, clock_pair_gpa,  			     KVM_CLOCK_PAIRING_WALLCLOCK);  	if (ret == -KVM_ENOSYS) { -		ret = -ENODEV; +		ret = -EOPNOTSUPP;  		goto err;  	} diff --git a/drivers/ptp/ptp_qoriq.c b/drivers/ptp/ptp_qoriq.c index 879cfc1537ac..4d488c1f1941 100644 --- a/drivers/ptp/ptp_qoriq.c +++ b/drivers/ptp/ptp_qoriq.c @@ -670,7 +670,7 @@ static struct platform_driver ptp_qoriq_driver = {  		.of_match_table	= match_table,  	},  	.probe       = ptp_qoriq_probe, -	.remove_new  = ptp_qoriq_remove, +	.remove      = ptp_qoriq_remove,  };  module_platform_driver(ptp_qoriq_driver); diff --git a/drivers/ptp/ptp_vmclock.c b/drivers/ptp/ptp_vmclock.c index cdca8a3ad1aa..0a2cfc8ad3c5 100644 --- a/drivers/ptp/ptp_vmclock.c +++ b/drivers/ptp/ptp_vmclock.c @@ -601,7 +601,7 @@ MODULE_DEVICE_TABLE(acpi, vmclock_acpi_ids);  static struct platform_driver vmclock_platform_driver = {  	.probe		= vmclock_probe, -	.remove_new	= vmclock_remove, +	.remove		= vmclock_remove,  	.driver	= {  		.name	= "vmclock",  		.acpi_match_table = vmclock_acpi_ids, diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 9c733877e98e..675b252d9c8c 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c @@ -6,7 +6,7 @@   * Copyright (C) 2011-2012 Avionic Design GmbH   */ -#define DEFAULT_SYMBOL_NAMESPACE PWM +#define DEFAULT_SYMBOL_NAMESPACE "PWM"  #include <linux/acpi.h>  #include <linux/module.h> diff --git a/drivers/pwm/pwm-dwc-core.c b/drivers/pwm/pwm-dwc-core.c index c8425493b95d..6dabec93a3c6 100644 --- a/drivers/pwm/pwm-dwc-core.c +++ b/drivers/pwm/pwm-dwc-core.c @@ -9,7 +9,7 @@   * Author: Raymond Tan <raymond.tan@intel.com>   */ -#define DEFAULT_SYMBOL_NAMESPACE dwc_pwm +#define DEFAULT_SYMBOL_NAMESPACE "dwc_pwm"  #include <linux/bitops.h>  #include <linux/export.h> diff --git a/drivers/pwm/pwm-dwc.h b/drivers/pwm/pwm-dwc.h index c6e2df5a6122..1562594e7f85 100644 --- a/drivers/pwm/pwm-dwc.h +++ b/drivers/pwm/pwm-dwc.h @@ -9,7 +9,7 @@   * Author: Raymond Tan <raymond.tan@intel.com>   */ -MODULE_IMPORT_NS(dwc_pwm); +MODULE_IMPORT_NS("dwc_pwm");  #define DWC_TIM_LD_CNT(n)	((n) * 0x14)  #define DWC_TIM_LD_CNT2(n)	(((n) * 4) + 0xb0) diff --git a/drivers/pwm/pwm-lpss-pci.c b/drivers/pwm/pwm-lpss-pci.c index f7ece2809e6b..ddc2a4ca90fd 100644 --- a/drivers/pwm/pwm-lpss-pci.c +++ b/drivers/pwm/pwm-lpss-pci.c @@ -70,4 +70,4 @@ module_pci_driver(pwm_lpss_driver_pci);  MODULE_DESCRIPTION("PWM PCI driver for Intel LPSS");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PWM_LPSS); +MODULE_IMPORT_NS("PWM_LPSS"); diff --git a/drivers/pwm/pwm-lpss-platform.c b/drivers/pwm/pwm-lpss-platform.c index 5130238a4567..653ec9d0c8bf 100644 --- a/drivers/pwm/pwm-lpss-platform.c +++ b/drivers/pwm/pwm-lpss-platform.c @@ -78,5 +78,5 @@ module_platform_driver(pwm_lpss_driver_platform);  MODULE_DESCRIPTION("PWM platform driver for Intel LPSS");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(PWM_LPSS); +MODULE_IMPORT_NS("PWM_LPSS");  MODULE_ALIAS("platform:pwm-lpss"); diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c index 867e2bc8c601..3b99feb3bb49 100644 --- a/drivers/pwm/pwm-lpss.c +++ b/drivers/pwm/pwm-lpss.c @@ -19,7 +19,7 @@  #include <linux/pm_runtime.h>  #include <linux/time.h> -#define DEFAULT_SYMBOL_NAMESPACE PWM_LPSS +#define DEFAULT_SYMBOL_NAMESPACE "PWM_LPSS"  #include "pwm-lpss.h" diff --git a/drivers/pwm/pwm-stm32.c b/drivers/pwm/pwm-stm32.c index b889e64522c3..17e591f61efb 100644 --- a/drivers/pwm/pwm-stm32.c +++ b/drivers/pwm/pwm-stm32.c @@ -84,7 +84,7 @@ static int stm32_pwm_round_waveform_tohw(struct pwm_chip *chip,  	wfhw->ccer = TIM_CCER_CCxE(ch + 1);  	if (priv->have_complementary_output) -		wfhw->ccer = TIM_CCER_CCxNE(ch + 1); +		wfhw->ccer |= TIM_CCER_CCxNE(ch + 1);  	rate = clk_get_rate(priv->clk); diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c index e3cc59b82ea6..dca99cfb7cbb 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c @@ -371,8 +371,8 @@  		.ops		= &axp20x_ops,					\  	} -#define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\ -		 _vmask, _ereg, _emask) 					\ +#define AXP_DESC_DELAY(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\ +		 _vmask, _ereg, _emask, _ramp_delay) 				\  	[_family##_##_id] = {							\  		.name		= (_match),					\  		.supply_name	= (_supply),					\ @@ -388,9 +388,15 @@  		.vsel_mask	= (_vmask),					\  		.enable_reg	= (_ereg),					\  		.enable_mask	= (_emask),					\ +		.ramp_delay = (_ramp_delay),					\  		.ops		= &axp20x_ops,					\  	} +#define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\ +		 _vmask, _ereg, _emask) 					\ +	AXP_DESC_DELAY(_family, _id, _match, _supply, _min, _max, _step, _vreg,	\ +		 _vmask, _ereg, _emask, 0) +  #define AXP_DESC_SW(_family, _id, _match, _supply, _ereg, _emask)		\  	[_family##_##_id] = {							\  		.name		= (_match),					\ @@ -419,8 +425,8 @@  		.ops		= &axp20x_ops_fixed				\  	} -#define AXP_DESC_RANGES(_family, _id, _match, _supply, _ranges, _n_voltages,	\ -			_vreg, _vmask, _ereg, _emask)				\ +#define AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges, _n_voltages,	\ +			_vreg, _vmask, _ereg, _emask, _ramp_delay)	\  	[_family##_##_id] = {							\  		.name		= (_match),					\  		.supply_name	= (_supply),					\ @@ -436,9 +442,15 @@  		.enable_mask	= (_emask),					\  		.linear_ranges	= (_ranges),					\  		.n_linear_ranges = ARRAY_SIZE(_ranges),				\ +		.ramp_delay = (_ramp_delay),					\  		.ops		= &axp20x_ops_range,				\  	} +#define AXP_DESC_RANGES(_family, _id, _match, _supply, _ranges, _n_voltages,	\ +			_vreg, _vmask, _ereg, _emask)				\ +	AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges,		\ +		 _n_voltages, _vreg, _vmask, _ereg, _emask, 0) +  static const int axp209_dcdc2_ldo3_slew_rates[] = {  	1600,  	 800, @@ -781,21 +793,21 @@ static const struct linear_range axp717_dcdc3_ranges[] = {  };  static const struct regulator_desc axp717_regulators[] = { -	AXP_DESC_RANGES(AXP717, DCDC1, "dcdc1", "vin1", +	AXP_DESC_RANGES_DELAY(AXP717, DCDC1, "dcdc1", "vin1",  			axp717_dcdc1_ranges, AXP717_DCDC1_NUM_VOLTAGES,  			AXP717_DCDC1_CONTROL, AXP717_DCDC_V_OUT_MASK, -			AXP717_DCDC_OUTPUT_CONTROL, BIT(0)), -	AXP_DESC_RANGES(AXP717, DCDC2, "dcdc2", "vin2", +			AXP717_DCDC_OUTPUT_CONTROL, BIT(0), 640), +	AXP_DESC_RANGES_DELAY(AXP717, DCDC2, "dcdc2", "vin2",  			axp717_dcdc2_ranges, AXP717_DCDC2_NUM_VOLTAGES,  			AXP717_DCDC2_CONTROL, AXP717_DCDC_V_OUT_MASK, -			AXP717_DCDC_OUTPUT_CONTROL, BIT(1)), -	AXP_DESC_RANGES(AXP717, DCDC3, "dcdc3", "vin3", +			AXP717_DCDC_OUTPUT_CONTROL, BIT(1), 640), +	AXP_DESC_RANGES_DELAY(AXP717, DCDC3, "dcdc3", "vin3",  			axp717_dcdc3_ranges, AXP717_DCDC3_NUM_VOLTAGES,  			AXP717_DCDC3_CONTROL, AXP717_DCDC_V_OUT_MASK, -			AXP717_DCDC_OUTPUT_CONTROL, BIT(2)), -	AXP_DESC(AXP717, DCDC4, "dcdc4", "vin4", 1000, 3700, 100, +			AXP717_DCDC_OUTPUT_CONTROL, BIT(2), 640), +	AXP_DESC_DELAY(AXP717, DCDC4, "dcdc4", "vin4", 1000, 3700, 100,  		 AXP717_DCDC4_CONTROL, AXP717_DCDC_V_OUT_MASK, -		 AXP717_DCDC_OUTPUT_CONTROL, BIT(3)), +		 AXP717_DCDC_OUTPUT_CONTROL, BIT(3), 6400),  	AXP_DESC(AXP717, ALDO1, "aldo1", "aldoin", 500, 3500, 100,  		 AXP717_ALDO1_CONTROL, AXP717_LDO_V_OUT_MASK,  		 AXP717_LDO0_OUTPUT_CONTROL, BIT(0)), diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c index 3d85762beda6..e5b4b93c07e3 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c @@ -175,7 +175,7 @@ static int of_get_regulation_constraints(struct device *dev,  	if (!ret)  		constraints->enable_time = pval; -	ret = of_property_read_u32(np, "regulator-uv-survival-time-ms", &pval); +	ret = of_property_read_u32(np, "regulator-uv-less-critical-window-ms", &pval);  	if (!ret)  		constraints->uv_less_critical_window_ms = pval;  	else diff --git a/drivers/reset/amlogic/reset-meson-audio-arb.c b/drivers/reset/amlogic/reset-meson-audio-arb.c index 421ccb40da8c..6ec253976bed 100644 --- a/drivers/reset/amlogic/reset-meson-audio-arb.c +++ b/drivers/reset/amlogic/reset-meson-audio-arb.c @@ -180,7 +180,7 @@ static int meson_audio_arb_probe(struct platform_device *pdev)  static struct platform_driver meson_audio_arb_pdrv = {  	.probe = meson_audio_arb_probe, -	.remove_new = meson_audio_arb_remove, +	.remove = meson_audio_arb_remove,  	.driver = {  		.name = "meson-audio-arb-reset",  		.of_match_table = meson_audio_arb_of_match, diff --git a/drivers/reset/amlogic/reset-meson-aux.c b/drivers/reset/amlogic/reset-meson-aux.c index dd8453001db9..61ce515d92a2 100644 --- a/drivers/reset/amlogic/reset-meson-aux.c +++ b/drivers/reset/amlogic/reset-meson-aux.c @@ -133,4 +133,4 @@ EXPORT_SYMBOL_GPL(devm_meson_rst_aux_register);  MODULE_DESCRIPTION("Amlogic Meson Reset Auxiliary driver");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(MESON_RESET); +MODULE_IMPORT_NS("MESON_RESET"); diff --git a/drivers/reset/amlogic/reset-meson-common.c b/drivers/reset/amlogic/reset-meson-common.c index 38a767c06fc7..a90e0ecaaadf 100644 --- a/drivers/reset/amlogic/reset-meson-common.c +++ b/drivers/reset/amlogic/reset-meson-common.c @@ -105,7 +105,7 @@ const struct reset_control_ops meson_reset_ops = {  	.deassert	= meson_reset_deassert,  	.status		= meson_reset_status,  }; -EXPORT_SYMBOL_NS_GPL(meson_reset_ops, MESON_RESET); +EXPORT_SYMBOL_NS_GPL(meson_reset_ops, "MESON_RESET");  const struct reset_control_ops meson_reset_toggle_ops = {  	.reset		= meson_reset_level_toggle, @@ -113,7 +113,7 @@ const struct reset_control_ops meson_reset_toggle_ops = {  	.deassert	= meson_reset_deassert,  	.status		= meson_reset_status,  }; -EXPORT_SYMBOL_NS_GPL(meson_reset_toggle_ops, MESON_RESET); +EXPORT_SYMBOL_NS_GPL(meson_reset_toggle_ops, "MESON_RESET");  int meson_reset_controller_register(struct device *dev, struct regmap *map,  				    const struct meson_reset_param *param) @@ -133,10 +133,10 @@ int meson_reset_controller_register(struct device *dev, struct regmap *map,  	return devm_reset_controller_register(dev, &data->rcdev);  } -EXPORT_SYMBOL_NS_GPL(meson_reset_controller_register, MESON_RESET); +EXPORT_SYMBOL_NS_GPL(meson_reset_controller_register, "MESON_RESET");  MODULE_DESCRIPTION("Amlogic Meson Reset Core function");  MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(MESON_RESET); +MODULE_IMPORT_NS("MESON_RESET"); diff --git a/drivers/reset/amlogic/reset-meson.c b/drivers/reset/amlogic/reset-meson.c index 6ae4ed6b7f8b..84610365a823 100644 --- a/drivers/reset/amlogic/reset-meson.c +++ b/drivers/reset/amlogic/reset-meson.c @@ -102,4 +102,4 @@ MODULE_DESCRIPTION("Amlogic Meson Reset Controller driver");  MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");  MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");  MODULE_LICENSE("Dual BSD/GPL"); -MODULE_IMPORT_NS(MESON_RESET); +MODULE_IMPORT_NS("MESON_RESET"); diff --git a/drivers/reset/reset-mpfs.c b/drivers/reset/reset-mpfs.c index 710f9c1676f9..574e59db83a4 100644 --- a/drivers/reset/reset-mpfs.c +++ b/drivers/reset/reset-mpfs.c @@ -212,7 +212,7 @@ int mpfs_reset_controller_register(struct device *clk_dev, void __iomem *base)  	return devm_add_action_or_reset(clk_dev, mpfs_reset_unregister_adev, adev);  } -EXPORT_SYMBOL_NS_GPL(mpfs_reset_controller_register, MCHP_CLK_MPFS); +EXPORT_SYMBOL_NS_GPL(mpfs_reset_controller_register, "MCHP_CLK_MPFS");  static const struct auxiliary_device_id mpfs_reset_ids[] = {  	{ @@ -231,4 +231,4 @@ module_auxiliary_driver(mpfs_reset_driver);  MODULE_DESCRIPTION("Microchip PolarFire SoC Reset Driver");  MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>"); -MODULE_IMPORT_NS(MCHP_CLK_MPFS); +MODULE_IMPORT_NS("MCHP_CLK_MPFS"); diff --git a/drivers/reset/reset-rzg2l-usbphy-ctrl.c b/drivers/reset/reset-rzg2l-usbphy-ctrl.c index 1cd157f4f03b..8a7f167e405e 100644 --- a/drivers/reset/reset-rzg2l-usbphy-ctrl.c +++ b/drivers/reset/reset-rzg2l-usbphy-ctrl.c @@ -176,6 +176,7 @@ static int rzg2l_usbphy_ctrl_probe(struct platform_device *pdev)  	vdev->dev.parent = dev;  	priv->vdev = vdev; +	device_set_of_node_from_dev(&vdev->dev, dev);  	error = platform_device_add(vdev);  	if (error)  		goto err_device_put; @@ -208,7 +209,7 @@ static struct platform_driver rzg2l_usbphy_ctrl_driver = {  		.of_match_table	= rzg2l_usbphy_ctrl_match_table,  	},  	.probe	= rzg2l_usbphy_ctrl_probe, -	.remove_new = rzg2l_usbphy_ctrl_remove, +	.remove = rzg2l_usbphy_ctrl_remove,  };  module_platform_driver(rzg2l_usbphy_ctrl_driver); diff --git a/drivers/reset/reset-ti-sci.c b/drivers/reset/reset-ti-sci.c index d384da0982fa..1dc5b766aac1 100644 --- a/drivers/reset/reset-ti-sci.c +++ b/drivers/reset/reset-ti-sci.c @@ -246,7 +246,7 @@ static void ti_sci_reset_remove(struct platform_device *pdev)  static struct platform_driver ti_sci_reset_driver = {  	.probe = ti_sci_reset_probe, -	.remove_new = ti_sci_reset_remove, +	.remove = ti_sci_reset_remove,  	.driver = {  		.name = "ti-sci-reset",  		.of_match_table = ti_sci_reset_of_match, diff --git a/drivers/rpmsg/qcom_glink_rpm.c b/drivers/rpmsg/qcom_glink_rpm.c index 357272d7062e..e3ba2c63a5fc 100644 --- a/drivers/rpmsg/qcom_glink_rpm.c +++ b/drivers/rpmsg/qcom_glink_rpm.c @@ -381,7 +381,7 @@ MODULE_DEVICE_TABLE(of, glink_rpm_of_match);  static struct platform_driver glink_rpm_driver = {  	.probe = glink_rpm_probe, -	.remove_new = glink_rpm_remove, +	.remove = glink_rpm_remove,  	.driver = {  		.name = "qcom_glink_rpm",  		.of_match_table = glink_rpm_of_match, diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c index 43f601c84b4f..40d386809d6b 100644 --- a/drivers/rpmsg/qcom_smd.c +++ b/drivers/rpmsg/qcom_smd.c @@ -1596,7 +1596,7 @@ MODULE_DEVICE_TABLE(of, qcom_smd_of_match);  static struct platform_driver qcom_smd_driver = {  	.probe = qcom_smd_probe, -	.remove_new = qcom_smd_remove, +	.remove = qcom_smd_remove,  	.driver = {  		.name = "qcom-smd",  		.of_match_table = qcom_smd_of_match, diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c index e30f80dc9319..6228d0b2486e 100644 --- a/drivers/rtc/rtc-hid-sensor-time.c +++ b/drivers/rtc/rtc-hid-sensor-time.c @@ -326,4 +326,4 @@ module_platform_driver(hid_time_platform_driver);  MODULE_DESCRIPTION("HID Sensor Time");  MODULE_AUTHOR("Alexander Holler <holler@ahsoftware.de>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(IIO_HID); +MODULE_IMPORT_NS("IIO_HID"); diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index d7fcde692f46..90e71ce4bab8 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c @@ -413,7 +413,7 @@ static struct platform_driver bbc_i2c_driver = {  		.of_match_table = bbc_i2c_match,  	},  	.probe		= bbc_i2c_probe, -	.remove_new	= bbc_i2c_remove, +	.remove		= bbc_i2c_remove,  };  module_platform_driver(bbc_i2c_driver); diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index 521cf8affe65..e94222b3523c 100644 --- a/drivers/sbus/char/display7seg.c +++ b/drivers/sbus/char/display7seg.c @@ -261,7 +261,7 @@ static struct platform_driver d7s_driver = {  		.of_match_table = d7s_match,  	},  	.probe		= d7s_probe, -	.remove_new	= d7s_remove, +	.remove		= d7s_remove,  };  module_platform_driver(d7s_driver); diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index b543e9bcc785..81918aa67109 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c @@ -1125,7 +1125,7 @@ static struct platform_driver envctrl_driver = {  		.of_match_table = envctrl_match,  	},  	.probe		= envctrl_probe, -	.remove_new	= envctrl_remove, +	.remove		= envctrl_remove,  };  module_platform_driver(envctrl_driver); diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c index ddd449dfda31..6524a4a19109 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c @@ -206,7 +206,7 @@ static struct platform_driver flash_driver = {  		.of_match_table = flash_match,  	},  	.probe		= flash_probe, -	.remove_new	= flash_remove, +	.remove		= flash_remove,  };  module_platform_driver(flash_driver); diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c index 8bbed7a7afb7..e3dec78f51e9 100644 --- a/drivers/sbus/char/uctrl.c +++ b/drivers/sbus/char/uctrl.c @@ -424,7 +424,7 @@ static struct platform_driver uctrl_driver = {  		.of_match_table = uctrl_match,  	},  	.probe		= uctrl_probe, -	.remove_new	= uctrl_remove, +	.remove		= uctrl_remove,  }; diff --git a/drivers/scsi/bfa/bfa_fcbuild.c b/drivers/scsi/bfa/bfa_fcbuild.c index 52303e8c716d..c44fd096ee68 100644 --- a/drivers/scsi/bfa/bfa_fcbuild.c +++ b/drivers/scsi/bfa/bfa_fcbuild.c @@ -220,44 +220,6 @@ fc_plogi_x_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id,  }  u16 -fc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, -		u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size, -	       u8 set_npiv, u8 set_auth, u16 local_bb_credits) -{ -	u32        d_id = bfa_hton3b(FC_FABRIC_PORT); -	__be32	*vvl_info; - -	memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); - -	flogi->els_cmd.els_code = FC_ELS_FLOGI; -	fc_els_req_build(fchs, d_id, s_id, ox_id); - -	flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); -	flogi->port_name = port_name; -	flogi->node_name = node_name; - -	/* -	 * Set the NPIV Capability Bit ( word 1, bit 31) of Common -	 * Service Parameters. -	 */ -	flogi->csp.ciro = set_npiv; - -	/* set AUTH capability */ -	flogi->csp.security = set_auth; - -	flogi->csp.bbcred = cpu_to_be16(local_bb_credits); - -	/* Set brcd token in VVL */ -	vvl_info = (u32 *)&flogi->vvl[0]; - -	/* set the flag to indicate the presence of VVL */ -	flogi->csp.npiv_supp    = 1; /* @todo. field name is not correct */ -	vvl_info[0]	= cpu_to_be32(FLOGI_VVL_BRCD); - -	return sizeof(struct fc_logi_s); -} - -u16  fc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id,  		   __be16 ox_id, wwn_t port_name, wwn_t node_name,  		   u16 pdu_size, u16 local_bb_credits, u8 bb_scn) @@ -280,24 +242,6 @@ fc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id,  }  u16 -fc_fdisc_build(struct fchs_s *fchs, struct fc_logi_s *flogi, u32 s_id, -		u16 ox_id, wwn_t port_name, wwn_t node_name, u16 pdu_size) -{ -	u32        d_id = bfa_hton3b(FC_FABRIC_PORT); - -	memcpy(flogi, &plogi_tmpl, sizeof(struct fc_logi_s)); - -	flogi->els_cmd.els_code = FC_ELS_FDISC; -	fc_els_req_build(fchs, d_id, s_id, ox_id); - -	flogi->csp.rxsz = flogi->class3.rxsz = cpu_to_be16(pdu_size); -	flogi->port_name = port_name; -	flogi->node_name = node_name; - -	return sizeof(struct fc_logi_s); -} - -u16  fc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id,  	       u16 ox_id, wwn_t port_name, wwn_t node_name,  	       u16 pdu_size, u16 bb_cr) @@ -316,40 +260,6 @@ fc_plogi_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id,  }  enum fc_parse_status -fc_plogi_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) -{ -	struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); -	struct fc_logi_s *plogi; -	struct fc_ls_rjt_s *ls_rjt; - -	switch (els_cmd->els_code) { -	case FC_ELS_LS_RJT: -		ls_rjt = (struct fc_ls_rjt_s *) (fchs + 1); -		if (ls_rjt->reason_code == FC_LS_RJT_RSN_LOGICAL_BUSY) -			return FC_PARSE_BUSY; -		else -			return FC_PARSE_FAILURE; -	case FC_ELS_ACC: -		plogi = (struct fc_logi_s *) (fchs + 1); -		if (len < sizeof(struct fc_logi_s)) -			return FC_PARSE_FAILURE; - -		if (!wwn_is_equal(plogi->port_name, port_name)) -			return FC_PARSE_FAILURE; - -		if (!plogi->class3.class_valid) -			return FC_PARSE_FAILURE; - -		if (be16_to_cpu(plogi->class3.rxsz) < (FC_MIN_PDUSZ)) -			return FC_PARSE_FAILURE; - -		return FC_PARSE_OK; -	default: -		return FC_PARSE_FAILURE; -	} -} - -enum fc_parse_status  fc_plogi_parse(struct fchs_s *fchs)  {  	struct fc_logi_s *plogi = (struct fc_logi_s *) (fchs + 1); @@ -421,21 +331,6 @@ fc_prli_rsp_parse(struct fc_prli_s *prli, int len)  	return FC_PARSE_OK;  } -enum fc_parse_status -fc_prli_parse(struct fc_prli_s *prli) -{ -	if (prli->parampage.type != FC_TYPE_FCP) -		return FC_PARSE_FAILURE; - -	if (!prli->parampage.imagepair) -		return FC_PARSE_FAILURE; - -	if (!prli->parampage.servparams.initiator) -		return FC_PARSE_FAILURE; - -	return FC_PARSE_OK; -} -  u16  fc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id, u32 s_id,  	      u16 ox_id, wwn_t port_name) @@ -506,84 +401,6 @@ fc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len, wwn_t port_name,  	return FC_PARSE_OK;  } -enum fc_parse_status -fc_adisc_parse(struct fchs_s *fchs, void *pld, u32 host_dap, wwn_t node_name, -	       wwn_t port_name) -{ -	struct fc_adisc_s *adisc = (struct fc_adisc_s *) pld; - -	if (adisc->els_cmd.els_code != FC_ELS_ACC) -		return FC_PARSE_FAILURE; - -	if ((adisc->nport_id == (host_dap)) -	    && wwn_is_equal(adisc->orig_port_name, port_name) -	    && wwn_is_equal(adisc->orig_node_name, node_name)) -		return FC_PARSE_OK; - -	return FC_PARSE_FAILURE; -} - -enum fc_parse_status -fc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name, wwn_t port_name) -{ -	struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); - -	if (pdisc->class3.class_valid != 1) -		return FC_PARSE_FAILURE; - -	if ((be16_to_cpu(pdisc->class3.rxsz) < -		(FC_MIN_PDUSZ - sizeof(struct fchs_s))) -	    || (pdisc->class3.rxsz == 0)) -		return FC_PARSE_FAILURE; - -	if (!wwn_is_equal(pdisc->port_name, port_name)) -		return FC_PARSE_FAILURE; - -	if (!wwn_is_equal(pdisc->node_name, node_name)) -		return FC_PARSE_FAILURE; - -	return FC_PARSE_OK; -} - -u16 -fc_abts_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id) -{ -	memcpy(fchs, &fc_bls_req_tmpl, sizeof(struct fchs_s)); -	fchs->cat_info = FC_CAT_ABTS; -	fchs->d_id = (d_id); -	fchs->s_id = (s_id); -	fchs->ox_id = cpu_to_be16(ox_id); - -	return sizeof(struct fchs_s); -} - -enum fc_parse_status -fc_abts_rsp_parse(struct fchs_s *fchs, int len) -{ -	if ((fchs->cat_info == FC_CAT_BA_ACC) -	    || (fchs->cat_info == FC_CAT_BA_RJT)) -		return FC_PARSE_OK; - -	return FC_PARSE_FAILURE; -} - -u16 -fc_rrq_build(struct fchs_s *fchs, struct fc_rrq_s *rrq, u32 d_id, u32 s_id, -	     u16 ox_id, u16 rrq_oxid) -{ -	fc_els_req_build(fchs, d_id, s_id, ox_id); - -	/* -	 * build rrq payload -	 */ -	memcpy(rrq, &rrq_tmpl, sizeof(struct fc_rrq_s)); -	rrq->s_id = (s_id); -	rrq->ox_id = cpu_to_be16(rrq_oxid); -	rrq->rx_id = FC_RXID_ANY; - -	return sizeof(struct fc_rrq_s); -} -  u16  fc_logo_acc_build(struct fchs_s *fchs, void *pld, u32 d_id, u32 s_id,  		  __be16 ox_id) @@ -659,30 +476,6 @@ fc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code)  }  u16 -fc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc, -		u32 d_id, u32 s_id, __be16 ox_id, int num_pages) -{ -	int             page; - -	fc_els_rsp_build(fchs, d_id, s_id, ox_id); - -	memset(tprlo_acc, 0, (num_pages * 16) + 4); -	tprlo_acc->command = FC_ELS_ACC; - -	tprlo_acc->page_len = 0x10; -	tprlo_acc->payload_len = cpu_to_be16((num_pages * 16) + 4); - -	for (page = 0; page < num_pages; page++) { -		tprlo_acc->tprlo_acc_params[page].opa_valid = 0; -		tprlo_acc->tprlo_acc_params[page].rpa_valid = 0; -		tprlo_acc->tprlo_acc_params[page].fc4type_csp = FC_TYPE_FCP; -		tprlo_acc->tprlo_acc_params[page].orig_process_assc = 0; -		tprlo_acc->tprlo_acc_params[page].resp_process_assc = 0; -	} -	return be16_to_cpu(tprlo_acc->payload_len); -} - -u16  fc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc, u32 d_id,  		  u32 s_id, __be16 ox_id, int num_pages)  { @@ -707,20 +500,6 @@ fc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc, u32 d_id,  }  u16 -fc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid, u32 d_id, -		u32 s_id, u16 ox_id, u32 data_format) -{ -	fc_els_req_build(fchs, d_id, s_id, ox_id); - -	memset(rnid, 0, sizeof(struct fc_rnid_cmd_s)); - -	rnid->els_cmd.els_code = FC_ELS_RNID; -	rnid->node_id_data_format = data_format; - -	return sizeof(struct fc_rnid_cmd_s); -} - -u16  fc_rnid_acc_build(struct fchs_s *fchs, struct fc_rnid_acc_s *rnid_acc, u32 d_id,  		  u32 s_id, __be16 ox_id, u32 data_format,  		  struct fc_rnid_common_id_data_s *common_id_data, @@ -749,18 +528,6 @@ fc_rnid_acc_build(struct fchs_s *fchs, struct fc_rnid_acc_s *rnid_acc, u32 d_id,  }  u16 -fc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc, u32 d_id, -		u32 s_id, u16 ox_id) -{ -	fc_els_req_build(fchs, d_id, s_id, ox_id); - -	memset(rpsc, 0, sizeof(struct fc_rpsc_cmd_s)); - -	rpsc->els_cmd.els_code = FC_ELS_RPSC; -	return sizeof(struct fc_rpsc_cmd_s); -} - -u16  fc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rpsc2, u32 d_id,  		u32 s_id, u32 *pid_list, u16 npids)  { @@ -801,115 +568,6 @@ fc_rpsc_acc_build(struct fchs_s *fchs, struct fc_rpsc_acc_s *rpsc_acc,  	return sizeof(struct fc_rpsc_acc_s);  } -u16 -fc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, -	       wwn_t port_name, wwn_t node_name, u16 pdu_size) -{ -	struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); - -	memcpy(pdisc, &plogi_tmpl, sizeof(struct fc_logi_s)); - -	pdisc->els_cmd.els_code = FC_ELS_PDISC; -	fc_els_req_build(fchs, d_id, s_id, ox_id); - -	pdisc->csp.rxsz = pdisc->class3.rxsz = cpu_to_be16(pdu_size); -	pdisc->port_name = port_name; -	pdisc->node_name = node_name; - -	return sizeof(struct fc_logi_s); -} - -u16 -fc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name) -{ -	struct fc_logi_s *pdisc = (struct fc_logi_s *) (fchs + 1); - -	if (len < sizeof(struct fc_logi_s)) -		return FC_PARSE_LEN_INVAL; - -	if (pdisc->els_cmd.els_code != FC_ELS_ACC) -		return FC_PARSE_ACC_INVAL; - -	if (!wwn_is_equal(pdisc->port_name, port_name)) -		return FC_PARSE_PWWN_NOT_EQUAL; - -	if (!pdisc->class3.class_valid) -		return FC_PARSE_NWWN_NOT_EQUAL; - -	if (be16_to_cpu(pdisc->class3.rxsz) < (FC_MIN_PDUSZ)) -		return FC_PARSE_RXSZ_INVAL; - -	return FC_PARSE_OK; -} - -u16 -fc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, -	      int num_pages) -{ -	struct fc_prlo_s *prlo = (struct fc_prlo_s *) (fchs + 1); -	int             page; - -	fc_els_req_build(fchs, d_id, s_id, ox_id); -	memset(prlo, 0, (num_pages * 16) + 4); -	prlo->command = FC_ELS_PRLO; -	prlo->page_len = 0x10; -	prlo->payload_len = cpu_to_be16((num_pages * 16) + 4); - -	for (page = 0; page < num_pages; page++) { -		prlo->prlo_params[page].type = FC_TYPE_FCP; -		prlo->prlo_params[page].opa_valid = 0; -		prlo->prlo_params[page].rpa_valid = 0; -		prlo->prlo_params[page].orig_process_assc = 0; -		prlo->prlo_params[page].resp_process_assc = 0; -	} - -	return be16_to_cpu(prlo->payload_len); -} - -u16 -fc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, u16 ox_id, -	       int num_pages, enum fc_tprlo_type tprlo_type, u32 tpr_id) -{ -	struct fc_tprlo_s *tprlo = (struct fc_tprlo_s *) (fchs + 1); -	int             page; - -	fc_els_req_build(fchs, d_id, s_id, ox_id); -	memset(tprlo, 0, (num_pages * 16) + 4); -	tprlo->command = FC_ELS_TPRLO; -	tprlo->page_len = 0x10; -	tprlo->payload_len = cpu_to_be16((num_pages * 16) + 4); - -	for (page = 0; page < num_pages; page++) { -		tprlo->tprlo_params[page].type = FC_TYPE_FCP; -		tprlo->tprlo_params[page].opa_valid = 0; -		tprlo->tprlo_params[page].rpa_valid = 0; -		tprlo->tprlo_params[page].orig_process_assc = 0; -		tprlo->tprlo_params[page].resp_process_assc = 0; -		if (tprlo_type == FC_GLOBAL_LOGO) { -			tprlo->tprlo_params[page].global_process_logout = 1; -		} else if (tprlo_type == FC_TPR_LOGO) { -			tprlo->tprlo_params[page].tpo_nport_valid = 1; -			tprlo->tprlo_params[page].tpo_nport_id = (tpr_id); -		} -	} - -	return be16_to_cpu(tprlo->payload_len); -} - -u16 -fc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id, __be16 ox_id, -		u32 reason_code, u32 reason_expl) -{ -	struct fc_ba_rjt_s *ba_rjt = (struct fc_ba_rjt_s *) (fchs + 1); - -	fc_bls_rsp_build(fchs, d_id, s_id, ox_id); - -	fchs->cat_info = FC_CAT_BA_RJT; -	ba_rjt->reason_code = reason_code; -	ba_rjt->reason_expl = reason_expl; -	return sizeof(struct fc_ba_rjt_s); -} -  static void  fc_gs_cthdr_build(struct ct_hdr_s *cthdr, u32 s_id, u16 cmd_code)  { @@ -974,35 +632,6 @@ fc_gpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id,  }  u16 -fc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, -	       u32 port_id) -{ -	struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; -	fcgs_gnnid_req_t *gnnid = (fcgs_gnnid_req_t *) (cthdr + 1); -	u32        d_id = bfa_hton3b(FC_NAME_SERVER); - -	fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); -	fc_gs_cthdr_build(cthdr, s_id, GS_GNN_ID); - -	memset(gnnid, 0, sizeof(fcgs_gnnid_req_t)); -	gnnid->dap = port_id; -	return sizeof(fcgs_gnnid_req_t) + sizeof(struct ct_hdr_s); -} - -u16 -fc_ct_rsp_parse(struct ct_hdr_s *cthdr) -{ -	if (be16_to_cpu(cthdr->cmd_rsp_code) != CT_RSP_ACCEPT) { -		if (cthdr->reason_code == CT_RSN_LOGICAL_BUSY) -			return FC_PARSE_BUSY; -		else -			return FC_PARSE_FAILURE; -	} - -	return FC_PARSE_OK; -} - -u16  fc_gs_rjt_build(struct fchs_s *fchs,  struct ct_hdr_s *cthdr,  		u32 d_id, u32 s_id, u16 ox_id, u8 reason_code,  		u8 reason_code_expl) @@ -1035,26 +664,6 @@ fc_scr_build(struct fchs_s *fchs, struct fc_scr_s *scr,  }  u16 -fc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, -		u32 s_id, u16 ox_id) -{ -	u32        d_id = bfa_hton3b(FC_FABRIC_CONTROLLER); -	u16        payldlen; - -	fc_els_req_build(fchs, d_id, s_id, ox_id); -	rscn->command = FC_ELS_RSCN; -	rscn->pagelen = sizeof(rscn->event[0]); - -	payldlen = sizeof(u32) + rscn->pagelen; -	rscn->payldlen = cpu_to_be16(payldlen); - -	rscn->event[0].format = FC_RSCN_FORMAT_PORTID; -	rscn->event[0].portid = s_id; - -	return struct_size(rscn, event, 1); -} - -u16  fc_rftid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id,  	       enum bfa_lport_role roles)  { @@ -1079,26 +688,6 @@ fc_rftid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id,  }  u16 -fc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, -		   u8 *fc4_bitmap, u32 bitmap_size) -{ -	struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; -	struct fcgs_rftid_req_s *rftid = (struct fcgs_rftid_req_s *)(cthdr + 1); -	u32        d_id = bfa_hton3b(FC_NAME_SERVER); - -	fc_gs_fchdr_build(fchs, d_id, s_id, ox_id); -	fc_gs_cthdr_build(cthdr, s_id, GS_RFT_ID); - -	memset(rftid, 0, sizeof(struct fcgs_rftid_req_s)); - -	rftid->dap = s_id; -	memcpy((void *)rftid->fc4_type, (void *)fc4_bitmap, -		(bitmap_size < 32 ? bitmap_size : 32)); - -	return sizeof(struct fcgs_rftid_req_s) + sizeof(struct ct_hdr_s); -} - -u16  fc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id,  	       u8 fc4_type, u8 fc4_ftrs)  { @@ -1182,24 +771,6 @@ fc_gid_ft_build(struct fchs_s *fchs, void *pyld, u32 s_id, u8 fc4_type)  }  u16 -fc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, -	       wwn_t port_name) -{ -	struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; -	struct fcgs_rpnid_req_s *rpnid = (struct fcgs_rpnid_req_s *)(cthdr + 1); -	u32        d_id = bfa_hton3b(FC_NAME_SERVER); - -	fc_gs_fchdr_build(fchs, d_id, s_id, 0); -	fc_gs_cthdr_build(cthdr, s_id, GS_RPN_ID); - -	memset(rpnid, 0, sizeof(struct fcgs_rpnid_req_s)); -	rpnid->port_id = port_id; -	rpnid->port_name = port_name; - -	return sizeof(struct fcgs_rpnid_req_s) + sizeof(struct ct_hdr_s); -} - -u16  fc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id,  	       wwn_t node_name)  { @@ -1217,59 +788,6 @@ fc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id,  	return sizeof(struct fcgs_rnnid_req_s) + sizeof(struct ct_hdr_s);  } -u16 -fc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, -	       u32 cos) -{ -	struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; -	struct fcgs_rcsid_req_s *rcsid = -			(struct fcgs_rcsid_req_s *) (cthdr + 1); -	u32        d_id = bfa_hton3b(FC_NAME_SERVER); - -	fc_gs_fchdr_build(fchs, d_id, s_id, 0); -	fc_gs_cthdr_build(cthdr, s_id, GS_RCS_ID); - -	memset(rcsid, 0, sizeof(struct fcgs_rcsid_req_s)); -	rcsid->port_id = port_id; -	rcsid->cos = cos; - -	return sizeof(struct fcgs_rcsid_req_s) + sizeof(struct ct_hdr_s); -} - -u16 -fc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id, -	       u8 port_type) -{ -	struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; -	struct fcgs_rptid_req_s *rptid = (struct fcgs_rptid_req_s *)(cthdr + 1); -	u32        d_id = bfa_hton3b(FC_NAME_SERVER); - -	fc_gs_fchdr_build(fchs, d_id, s_id, 0); -	fc_gs_cthdr_build(cthdr, s_id, GS_RPT_ID); - -	memset(rptid, 0, sizeof(struct fcgs_rptid_req_s)); -	rptid->port_id = port_id; -	rptid->port_type = port_type; - -	return sizeof(struct fcgs_rptid_req_s) + sizeof(struct ct_hdr_s); -} - -u16 -fc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id, u32 port_id) -{ -	struct ct_hdr_s *cthdr = (struct ct_hdr_s *) pyld; -	struct fcgs_ganxt_req_s *ganxt = (struct fcgs_ganxt_req_s *)(cthdr + 1); -	u32        d_id = bfa_hton3b(FC_NAME_SERVER); - -	fc_gs_fchdr_build(fchs, d_id, s_id, 0); -	fc_gs_cthdr_build(cthdr, s_id, GS_GA_NXT); - -	memset(ganxt, 0, sizeof(struct fcgs_ganxt_req_s)); -	ganxt->port_id = port_id; - -	return sizeof(struct ct_hdr_s) + sizeof(struct fcgs_ganxt_req_s); -} -  /*   * Builds fc hdr and ct hdr for FDMI requests.   */ diff --git a/drivers/scsi/bfa/bfa_fcbuild.h b/drivers/scsi/bfa/bfa_fcbuild.h index 49e0ee4a7334..51da37b2ae6b 100644 --- a/drivers/scsi/bfa/bfa_fcbuild.h +++ b/drivers/scsi/bfa/bfa_fcbuild.h @@ -127,15 +127,6 @@ struct fc_templates_s {  void            fcbuild_init(void); -u16        fc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi, -			u32 s_id, u16 ox_id, wwn_t port_name, wwn_t node_name, -			       u16 pdu_size, u8 set_npiv, u8 set_auth, -			       u16 local_bb_credits); - -u16        fc_fdisc_build(struct fchs_s *buf, struct fc_logi_s *flogi, u32 s_id, -			       u16 ox_id, wwn_t port_name, wwn_t node_name, -			       u16 pdu_size); -  u16        fc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi,  				   u32 s_id, __be16 ox_id,  				   wwn_t port_name, wwn_t node_name, @@ -148,14 +139,6 @@ u16        fc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id,  enum fc_parse_status fc_plogi_parse(struct fchs_s *fchs); -u16        fc_abts_build(struct fchs_s *buf, u32 d_id, u32 s_id, -			      u16 ox_id); - -enum fc_parse_status fc_abts_rsp_parse(struct fchs_s *buf, int len); - -u16        fc_rrq_build(struct fchs_s *buf, struct fc_rrq_s *rrq, u32 d_id, -			     u32 s_id, u16 ox_id, u16 rrq_oxid); -  u16        fc_rspnid_build(struct fchs_s *fchs, void *pld, u32 s_id,  				u16 ox_id, u8 *name);  u16	fc_rsnn_nn_build(struct fchs_s *fchs, void *pld, u32 s_id, @@ -164,10 +147,6 @@ u16	fc_rsnn_nn_build(struct fchs_s *fchs, void *pld, u32 s_id,  u16        fc_rftid_build(struct fchs_s *fchs, void *pld, u32 s_id,  			       u16 ox_id, enum bfa_lport_role role); -u16       fc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id, -				   u16 ox_id, u8 *fc4_bitmap, -				   u32 bitmap_size); -  u16	fc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id,  			u16 ox_id, u8 fc4_type, u8 fc4_ftrs); @@ -193,9 +172,6 @@ u16        fc_adisc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc,  			u32 d_id, u32 s_id, __be16 ox_id, wwn_t port_name,  			       wwn_t node_name); -enum fc_parse_status fc_adisc_parse(struct fchs_s *fchs, void *pld, -			u32 host_dap, wwn_t node_name, wwn_t port_name); -  enum fc_parse_status fc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len,  				 wwn_t port_name, wwn_t node_name); @@ -216,10 +192,6 @@ u16        fc_prli_acc_build(struct fchs_s *fchs, void *pld, u32 d_id,  				  u32 s_id, __be16 ox_id,  				  enum bfa_lport_role role); -u16        fc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid, -			      u32 d_id, u32 s_id, u16 ox_id, -			      u32 data_format); -  u16        fc_rnid_acc_build(struct fchs_s *fchs,  			struct fc_rnid_acc_s *rnid_acc, u32 d_id, u32 s_id,  			__be16 ox_id, u32 data_format, @@ -228,29 +200,15 @@ u16        fc_rnid_acc_build(struct fchs_s *fchs,  u16	fc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rps2c,  			u32 d_id, u32 s_id, u32 *pid_list, u16 npids); -u16        fc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc, -			      u32 d_id, u32 s_id, u16 ox_id);  u16        fc_rpsc_acc_build(struct fchs_s *fchs,  			struct fc_rpsc_acc_s *rpsc_acc, u32 d_id, u32 s_id,  			__be16 ox_id, struct fc_rpsc_speed_info_s *oper_speed);  u16        fc_gid_ft_build(struct fchs_s *fchs, void *pld, u32 s_id,  				u8 fc4_type); -u16        fc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, -			       u32 port_id, wwn_t port_name); -  u16        fc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id,  			       u32 port_id, wwn_t node_name); -u16        fc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id, -			       u32 port_id, u32 cos); - -u16        fc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id, -			       u32 port_id, u8 port_type); - -u16        fc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id, -			       u32 port_id); -  u16        fc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id,  			      u32 s_id, u16 ox_id, wwn_t port_name); @@ -267,46 +225,16 @@ void		fc_get_fc4type_bitmask(u8 fc4_type, u8 *bit_mask);  void		fc_els_req_build(struct fchs_s *fchs, u32 d_id, u32 s_id,  					 __be16 ox_id); -enum fc_parse_status	fc_plogi_rsp_parse(struct fchs_s *fchs, int len, -					wwn_t port_name); - -enum fc_parse_status	fc_prli_parse(struct fc_prli_s *prli); - -enum fc_parse_status	fc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name, -					wwn_t port_name); -  u16 fc_ba_acc_build(struct fchs_s *fchs, struct fc_ba_acc_s *ba_acc, u32 d_id,  		u32 s_id, __be16 ox_id, u16 rx_id);  int fc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code); -u16 fc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc, -		u32 d_id, u32 s_id, __be16 ox_id, int num_pages); -  u16 fc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc,  		u32 d_id, u32 s_id, __be16 ox_id, int num_pages); -u16 fc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id, -		u16 ox_id, wwn_t port_name, wwn_t node_name, -		u16 pdu_size); - -u16 fc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name); - -u16 fc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id, -		u16 ox_id, int num_pages); -  u16 fc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id,  		u16 ox_id, int num_pages, enum fc_tprlo_type tprlo_type,  		u32 tpr_id); -u16 fc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id, -		__be16 ox_id, u32 reason_code, u32 reason_expl); - -u16 fc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id, -		u32 port_id); - -u16 fc_ct_rsp_parse(struct ct_hdr_s *cthdr); - -u16 fc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, u32 s_id, -		u16 ox_id);  #endif diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c index 49dd78ed8a9a..43dc1da4a156 100644 --- a/drivers/scsi/lpfc/lpfc_nvme.c +++ b/drivers/scsi/lpfc/lpfc_nvme.c @@ -242,7 +242,7 @@ lpfc_nvme_remoteport_delete(struct nvme_fc_remote_port *remoteport)   * @phba: pointer to lpfc hba data structure.   * @axchg: pointer to exchange context for the NVME LS request   * - * This routine is used for processing an asychronously received NVME LS + * This routine is used for processing an asynchronously received NVME LS   * request. Any remaining validation is done and the LS is then forwarded   * to the nvme-fc transport via nvme_fc_rcv_ls_req().   * diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c index e6c9112a8862..fba2e62027b7 100644 --- a/drivers/scsi/lpfc/lpfc_nvmet.c +++ b/drivers/scsi/lpfc/lpfc_nvmet.c @@ -2142,7 +2142,7 @@ lpfc_nvmet_destroy_targetport(struct lpfc_hba *phba)   * @phba: pointer to lpfc hba data structure.   * @axchg: pointer to exchange context for the NVME LS request   * - * This routine is used for processing an asychronously received NVME LS + * This routine is used for processing an asynchronously received NVME LS   * request. Any remaining validation is done and the LS is then forwarded   * to the nvmet-fc transport via nvmet_fc_rcv_ls_req().   * diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 8e75e2e279a4..50f1dcb6d584 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -8907,8 +8907,11 @@ megasas_aen_polling(struct work_struct *work)  						   (ld_target_id / MEGASAS_MAX_DEV_PER_CHANNEL),  						   (ld_target_id % MEGASAS_MAX_DEV_PER_CHANNEL),  						   0); -			if (sdev1) +			if (sdev1) { +				mutex_unlock(&instance->reset_mutex);  				megasas_remove_scsi_device(sdev1); +				mutex_lock(&instance->reset_mutex); +			}  			event_type = SCAN_VD_CHANNEL;  			break; diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index 81bb408ce56d..0c3e1ac076b5 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -57,8 +57,8 @@ extern struct list_head mrioc_list;  extern int prot_mask;  extern atomic64_t event_counter; -#define MPI3MR_DRIVER_VERSION	"8.12.0.0.50" -#define MPI3MR_DRIVER_RELDATE	"05-Sept-2024" +#define MPI3MR_DRIVER_VERSION	"8.12.0.3.50" +#define MPI3MR_DRIVER_RELDATE	"11-November-2024"  #define MPI3MR_DRIVER_NAME	"mpi3mr"  #define MPI3MR_DRIVER_LICENSE	"GPL" @@ -134,8 +134,6 @@ extern atomic64_t event_counter;  #define MPI3MR_WATCHDOG_INTERVAL		1000 /* in milli seconds */ -#define MPI3MR_DEFAULT_CFG_PAGE_SZ		1024 /* in bytes */ -  #define MPI3MR_RESET_TOPOLOGY_SETTLE_TIME	10  #define MPI3MR_SCMD_TIMEOUT    (60 * HZ) @@ -1133,9 +1131,6 @@ struct scmd_priv {   * @io_throttle_low: I/O size to stop throttle in 512b blocks   * @num_io_throttle_group: Maximum number of throttle groups   * @throttle_groups: Pointer to throttle group info structures - * @cfg_page: Default memory for configuration pages - * @cfg_page_dma: Configuration page DMA address - * @cfg_page_sz: Default configuration page memory size   * @sas_transport_enabled: SAS transport enabled or not   * @scsi_device_channel: Channel ID for SCSI devices   * @transport_cmds: Command tracker for SAS transport commands @@ -1332,10 +1327,6 @@ struct mpi3mr_ioc {  	u16 num_io_throttle_group;  	struct mpi3mr_throttle_group_info *throttle_groups; -	void *cfg_page; -	dma_addr_t cfg_page_dma; -	u16 cfg_page_sz; -  	u8 sas_transport_enabled;  	u8 scsi_device_channel;  	struct mpi3mr_drv_cmd transport_cmds; diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c index 01f035f9330e..10b8e4dc64f8 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_app.c +++ b/drivers/scsi/mpi3mr/mpi3mr_app.c @@ -2329,6 +2329,15 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  	if (!mrioc)  		return -ENODEV; +	if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex)) +		return -ERESTARTSYS; + +	if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) { +		dprint_bsg_err(mrioc, "%s: command is in use\n", __func__); +		mutex_unlock(&mrioc->bsg_cmds.mutex); +		return -EAGAIN; +	} +  	if (!mrioc->ioctl_sges_allocated) {  		dprint_bsg_err(mrioc, "%s: DMA memory was not allocated\n",  			       __func__); @@ -2339,13 +2348,16 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		karg->timeout = MPI3MR_APP_DEFAULT_TIMEOUT;  	mpi_req = kzalloc(MPI3MR_ADMIN_REQ_FRAME_SZ, GFP_KERNEL); -	if (!mpi_req) +	if (!mpi_req) { +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		return -ENOMEM; +	}  	mpi_header = (struct mpi3_request_header *)mpi_req;  	bufcnt = karg->buf_entry_list.num_of_entries;  	drv_bufs = kzalloc((sizeof(*drv_bufs) * bufcnt), GFP_KERNEL);  	if (!drv_bufs) { +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		rval = -ENOMEM;  		goto out;  	} @@ -2353,6 +2365,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  	dout_buf = kzalloc(job->request_payload.payload_len,  				      GFP_KERNEL);  	if (!dout_buf) { +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		rval = -ENOMEM;  		goto out;  	} @@ -2360,6 +2373,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  	din_buf = kzalloc(job->reply_payload.payload_len,  				     GFP_KERNEL);  	if (!din_buf) { +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		rval = -ENOMEM;  		goto out;  	} @@ -2435,6 +2449,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  					(mpi_msg_size > MPI3MR_ADMIN_REQ_FRAME_SZ)) {  				dprint_bsg_err(mrioc, "%s: invalid MPI message size\n",  					__func__); +				mutex_unlock(&mrioc->bsg_cmds.mutex);  				rval = -EINVAL;  				goto out;  			} @@ -2447,6 +2462,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		if (invalid_be) {  			dprint_bsg_err(mrioc, "%s: invalid buffer entries passed\n",  				__func__); +			mutex_unlock(&mrioc->bsg_cmds.mutex);  			rval = -EINVAL;  			goto out;  		} @@ -2454,12 +2470,14 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		if (sgl_dout_iter > (dout_buf + job->request_payload.payload_len)) {  			dprint_bsg_err(mrioc, "%s: data_out buffer length mismatch\n",  				       __func__); +			mutex_unlock(&mrioc->bsg_cmds.mutex);  			rval = -EINVAL;  			goto out;  		}  		if (sgl_din_iter > (din_buf + job->reply_payload.payload_len)) {  			dprint_bsg_err(mrioc, "%s: data_in buffer length mismatch\n",  				       __func__); +			mutex_unlock(&mrioc->bsg_cmds.mutex);  			rval = -EINVAL;  			goto out;  		} @@ -2472,6 +2490,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		dprint_bsg_err(mrioc, "%s:%d: invalid data transfer size passed for function 0x%x din_size = %d, dout_size = %d\n",  			       __func__, __LINE__, mpi_header->function, din_size,  			       dout_size); +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		rval = -EINVAL;  		goto out;  	} @@ -2480,6 +2499,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		dprint_bsg_err(mrioc,  		    "%s:%d: invalid data transfer size passed for function 0x%x din_size=%d\n",  		    __func__, __LINE__, mpi_header->function, din_size); +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		rval = -EINVAL;  		goto out;  	} @@ -2487,6 +2507,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		dprint_bsg_err(mrioc,  		    "%s:%d: invalid data transfer size passed for function 0x%x dout_size = %d\n",  		    __func__, __LINE__, mpi_header->function, dout_size); +		mutex_unlock(&mrioc->bsg_cmds.mutex);  		rval = -EINVAL;  		goto out;  	} @@ -2497,6 +2518,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  			dprint_bsg_err(mrioc, "%s:%d: invalid message size passed:%d:%d:%d:%d\n",  				       __func__, __LINE__, din_cnt, dout_cnt, din_size,  			    dout_size); +			mutex_unlock(&mrioc->bsg_cmds.mutex);  			rval = -EINVAL;  			goto out;  		} @@ -2544,6 +2566,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  				continue;  			if (mpi3mr_map_data_buffer_dma(mrioc, drv_buf_iter, desc_count)) {  				rval = -ENOMEM; +				mutex_unlock(&mrioc->bsg_cmds.mutex);  				dprint_bsg_err(mrioc, "%s:%d: mapping data buffers failed\n",  					       __func__, __LINE__);  			goto out; @@ -2556,20 +2579,11 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)  		sense_buff_k = kzalloc(erbsz, GFP_KERNEL);  		if (!sense_buff_k) {  			rval = -ENOMEM; +			mutex_unlock(&mrioc->bsg_cmds.mutex);  			goto out;  		}  	} -	if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex)) { -		rval = -ERESTARTSYS; -		goto out; -	} -	if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) { -		rval = -EAGAIN; -		dprint_bsg_err(mrioc, "%s: command is in use\n", __func__); -		mutex_unlock(&mrioc->bsg_cmds.mutex); -		goto out; -	}  	if (mrioc->unrecoverable) {  		dprint_bsg_err(mrioc, "%s: unrecoverable controller\n",  		    __func__); diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index f1ab76351bd8..5ed31fe57474 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -1036,6 +1036,36 @@ static const char *mpi3mr_reset_type_name(u16 reset_type)  }  /** + * mpi3mr_is_fault_recoverable - Read fault code and decide + * whether the controller can be recoverable + * @mrioc: Adapter instance reference + * Return: true if fault is recoverable, false otherwise. + */ +static inline bool mpi3mr_is_fault_recoverable(struct mpi3mr_ioc *mrioc) +{ +	u32 fault; + +	fault = (readl(&mrioc->sysif_regs->fault) & +		      MPI3_SYSIF_FAULT_CODE_MASK); + +	switch (fault) { +	case MPI3_SYSIF_FAULT_CODE_COMPLETE_RESET_NEEDED: +	case MPI3_SYSIF_FAULT_CODE_POWER_CYCLE_REQUIRED: +		ioc_warn(mrioc, +		    "controller requires system power cycle, marking controller as unrecoverable\n"); +		return false; +	case MPI3_SYSIF_FAULT_CODE_INSUFFICIENT_PCI_SLOT_POWER: +		ioc_warn(mrioc, +		    "controller faulted due to insufficient power,\n" +		    " try by connecting it to a different slot\n"); +		return false; +	default: +		break; +	} +	return true; +} + +/**   * mpi3mr_print_fault_info - Display fault information   * @mrioc: Adapter instance reference   * @@ -1373,6 +1403,11 @@ retry_bring_ioc_ready:  	ioc_info(mrioc, "ioc_status(0x%08x), ioc_config(0x%08x), ioc_info(0x%016llx) at the bringup\n",  	    ioc_status, ioc_config, base_info); +	if (!mpi3mr_is_fault_recoverable(mrioc)) { +		mrioc->unrecoverable = 1; +		goto out_device_not_present; +	} +  	/*The timeout value is in 2sec unit, changing it to seconds*/  	mrioc->ready_timeout =  	    ((base_info & MPI3_SYSIF_IOC_INFO_LOW_TIMEOUT_MASK) >> @@ -2734,6 +2769,11 @@ static void mpi3mr_watchdog_work(struct work_struct *work)  	mpi3mr_print_fault_info(mrioc);  	mrioc->diagsave_timeout = 0; +	if (!mpi3mr_is_fault_recoverable(mrioc)) { +		mrioc->unrecoverable = 1; +		goto schedule_work; +	} +  	switch (trigger_data.fault) {  	case MPI3_SYSIF_FAULT_CODE_COMPLETE_RESET_NEEDED:  	case MPI3_SYSIF_FAULT_CODE_POWER_CYCLE_REQUIRED: @@ -4186,17 +4226,6 @@ retry_init:  	mpi3mr_read_tsu_interval(mrioc);  	mpi3mr_print_ioc_info(mrioc); -	if (!mrioc->cfg_page) { -		dprint_init(mrioc, "allocating config page buffers\n"); -		mrioc->cfg_page_sz = MPI3MR_DEFAULT_CFG_PAGE_SZ; -		mrioc->cfg_page = dma_alloc_coherent(&mrioc->pdev->dev, -		    mrioc->cfg_page_sz, &mrioc->cfg_page_dma, GFP_KERNEL); -		if (!mrioc->cfg_page) { -			retval = -1; -			goto out_failed_noretry; -		} -	} -  	dprint_init(mrioc, "allocating host diag buffers\n");  	mpi3mr_alloc_diag_bufs(mrioc); @@ -4768,11 +4797,7 @@ void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc)  		    mrioc->admin_req_base, mrioc->admin_req_dma);  		mrioc->admin_req_base = NULL;  	} -	if (mrioc->cfg_page) { -		dma_free_coherent(&mrioc->pdev->dev, mrioc->cfg_page_sz, -		    mrioc->cfg_page, mrioc->cfg_page_dma); -		mrioc->cfg_page = NULL; -	} +  	if (mrioc->pel_seqnum_virt) {  		dma_free_coherent(&mrioc->pdev->dev, mrioc->pel_seqnum_sz,  		    mrioc->pel_seqnum_virt, mrioc->pel_seqnum_dma); @@ -5392,55 +5417,6 @@ out:  	return retval;  } - -/** - * mpi3mr_free_config_dma_memory - free memory for config page - * @mrioc: Adapter instance reference - * @mem_desc: memory descriptor structure - * - * Check whether the size of the buffer specified by the memory - * descriptor is greater than the default page size if so then - * free the memory pointed by the descriptor. - * - * Return: Nothing. - */ -static void mpi3mr_free_config_dma_memory(struct mpi3mr_ioc *mrioc, -	struct dma_memory_desc *mem_desc) -{ -	if ((mem_desc->size > mrioc->cfg_page_sz) && mem_desc->addr) { -		dma_free_coherent(&mrioc->pdev->dev, mem_desc->size, -		    mem_desc->addr, mem_desc->dma_addr); -		mem_desc->addr = NULL; -	} -} - -/** - * mpi3mr_alloc_config_dma_memory - Alloc memory for config page - * @mrioc: Adapter instance reference - * @mem_desc: Memory descriptor to hold dma memory info - * - * This function allocates new dmaable memory or provides the - * default config page dmaable memory based on the memory size - * described by the descriptor. - * - * Return: 0 on success, non-zero on failure. - */ -static int mpi3mr_alloc_config_dma_memory(struct mpi3mr_ioc *mrioc, -	struct dma_memory_desc *mem_desc) -{ -	if (mem_desc->size > mrioc->cfg_page_sz) { -		mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev, -		    mem_desc->size, &mem_desc->dma_addr, GFP_KERNEL); -		if (!mem_desc->addr) -			return -ENOMEM; -	} else { -		mem_desc->addr = mrioc->cfg_page; -		mem_desc->dma_addr = mrioc->cfg_page_dma; -		memset(mem_desc->addr, 0, mrioc->cfg_page_sz); -	} -	return 0; -} -  /**   * mpi3mr_post_cfg_req - Issue config requests and wait   * @mrioc: Adapter instance reference @@ -5596,8 +5572,12 @@ static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc,  		cfg_req->page_length = cfg_hdr->page_length;  		cfg_req->page_version = cfg_hdr->page_version;  	} -	if (mpi3mr_alloc_config_dma_memory(mrioc, &mem_desc)) -		goto out; + +	mem_desc.addr = dma_alloc_coherent(&mrioc->pdev->dev, +		mem_desc.size, &mem_desc.dma_addr, GFP_KERNEL); + +	if (!mem_desc.addr) +		return retval;  	mpi3mr_add_sg_single(&cfg_req->sgl, sgl_flags, mem_desc.size,  	    mem_desc.dma_addr); @@ -5626,7 +5606,12 @@ static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc,  	}  out: -	mpi3mr_free_config_dma_memory(mrioc, &mem_desc); +	if (mem_desc.addr) { +		dma_free_coherent(&mrioc->pdev->dev, mem_desc.size, +			mem_desc.addr, mem_desc.dma_addr); +		mem_desc.addr = NULL; +	} +  	return retval;  } diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 5f2f67acf8bf..1bef88130d0c 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -5215,7 +5215,7 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	}  	mrioc = shost_priv(shost); -	retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL); +	retval = ida_alloc_range(&mrioc_ida, 0, U8_MAX, GFP_KERNEL);  	if (retval < 0)  		goto id_alloc_failed;  	mrioc->id = (u8)retval; diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c index ed5046593fda..16ac2267c71e 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.c +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c @@ -7041,11 +7041,12 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,  	int i;  	u8 failed;  	__le32 *mfp; +	int ret_val;  	/* make sure doorbell is not in use */  	if ((ioc->base_readl_ext_retry(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {  		ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__); -		return -EFAULT; +		goto doorbell_diag_reset;  	}  	/* clear pending doorbell interrupts from previous state changes */ @@ -7135,6 +7136,10 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,  			    le32_to_cpu(mfp[i]));  	}  	return 0; + +doorbell_diag_reset: +	ret_val = _base_diag_reset(ioc); +	return ret_val;  }  /** diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h index eceb5eeb4651..d8d1a64b4764 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.h +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h @@ -77,11 +77,11 @@  #define MPT3SAS_DRIVER_NAME		"mpt3sas"  #define MPT3SAS_AUTHOR "Avago Technologies <MPT-FusionLinux.pdl@avagotech.com>"  #define MPT3SAS_DESCRIPTION	"LSI MPT Fusion SAS 3.0 Device Driver" -#define MPT3SAS_DRIVER_VERSION		"48.100.00.00" -#define MPT3SAS_MAJOR_VERSION		48 +#define MPT3SAS_DRIVER_VERSION		"51.100.00.00" +#define MPT3SAS_MAJOR_VERSION		51  #define MPT3SAS_MINOR_VERSION		100 -#define MPT3SAS_BUILD_VERSION		0 -#define MPT3SAS_RELEASE_VERSION	00 +#define MPT3SAS_BUILD_VERSION		00 +#define MPT3SAS_RELEASE_VERSION		00  #define MPT2SAS_DRIVER_NAME		"mpt2sas"  #define MPT2SAS_DESCRIPTION	"LSI MPT Fusion SAS 2.0 Device Driver" diff --git a/drivers/scsi/qla1280.h b/drivers/scsi/qla1280.h index d309e2ca14de..dea2290b37d4 100644 --- a/drivers/scsi/qla1280.h +++ b/drivers/scsi/qla1280.h @@ -116,12 +116,12 @@ struct device_reg {  	uint16_t id_h;		/* ID high */  	uint16_t cfg_0;		/* Configuration 0 */  #define ISP_CFG0_HWMSK   0x000f	/* Hardware revision mask */ -#define ISP_CFG0_1020    BIT_0	/* ISP1020 */ -#define ISP_CFG0_1020A	 BIT_1	/* ISP1020A */ -#define ISP_CFG0_1040	 BIT_2	/* ISP1040 */ -#define ISP_CFG0_1040A	 BIT_3	/* ISP1040A */ -#define ISP_CFG0_1040B	 BIT_4	/* ISP1040B */ -#define ISP_CFG0_1040C	 BIT_5	/* ISP1040C */ +#define ISP_CFG0_1020	 1	/* ISP1020 */ +#define ISP_CFG0_1020A	 2	/* ISP1020A */ +#define ISP_CFG0_1040	 3	/* ISP1040 */ +#define ISP_CFG0_1040A	 4	/* ISP1040A */ +#define ISP_CFG0_1040B	 5	/* ISP1040B */ +#define ISP_CFG0_1040C	 6	/* ISP1040C */  	uint16_t cfg_1;		/* Configuration 1 */  #define ISP_CFG1_F128    BIT_6  /* 128-byte FIFO threshold */  #define ISP_CFG1_F64     BIT_4|BIT_5 /* 128-byte FIFO threshold */ diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 2810608acd96..e6ece30c4348 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -3304,6 +3304,7 @@ struct fc_function_template qla2xxx_transport_vport_functions = {  	.show_host_node_name = 1,  	.show_host_port_name = 1,  	.show_host_supported_classes = 1, +	.show_host_supported_speeds = 1,  	.get_host_port_id = qla2x00_get_host_port_id,  	.show_host_port_id = 1, diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index 52dc9604f567..10431a67d202 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c @@ -24,6 +24,7 @@ void qla2x00_bsg_job_done(srb_t *sp, int res)  {  	struct bsg_job *bsg_job = sp->u.bsg_job;  	struct fc_bsg_reply *bsg_reply = bsg_job->reply; +	struct completion *comp = sp->comp;  	ql_dbg(ql_dbg_user, sp->vha, 0x7009,  	    "%s: sp hdl %x, result=%x bsg ptr %p\n", @@ -35,6 +36,9 @@ void qla2x00_bsg_job_done(srb_t *sp, int res)  	bsg_reply->result = res;  	bsg_job_done(bsg_job, bsg_reply->result,  		       bsg_reply->reply_payload_rcv_len); + +	if (comp) +		complete(comp);  }  void qla2x00_bsg_sp_free(srb_t *sp) @@ -490,16 +494,6 @@ qla2x00_process_ct(struct bsg_job *bsg_job)  		goto done;  	} -	if ((req_sg_cnt !=  bsg_job->request_payload.sg_cnt) || -	    (rsp_sg_cnt != bsg_job->reply_payload.sg_cnt)) { -		ql_log(ql_log_warn, vha, 0x7011, -		    "request_sg_cnt: %x dma_request_sg_cnt: %x reply_sg_cnt:%x " -		    "dma_reply_sg_cnt: %x\n", bsg_job->request_payload.sg_cnt, -		    req_sg_cnt, bsg_job->reply_payload.sg_cnt, rsp_sg_cnt); -		rval = -EAGAIN; -		goto done_unmap_sg; -	} -  	if (!vha->flags.online) {  		ql_log(ql_log_warn, vha, 0x7012,  		    "Host is not online.\n"); @@ -3061,7 +3055,7 @@ skip_chip_chk:  static bool qla_bsg_found(struct qla_qpair *qpair, struct bsg_job *bsg_job)  { -	bool found = false; +	bool found, do_bsg_done;  	struct fc_bsg_reply *bsg_reply = bsg_job->reply;  	scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));  	struct qla_hw_data *ha = vha->hw; @@ -3069,6 +3063,11 @@ static bool qla_bsg_found(struct qla_qpair *qpair, struct bsg_job *bsg_job)  	int cnt;  	unsigned long flags;  	struct req_que *req; +	int rval; +	DECLARE_COMPLETION_ONSTACK(comp); +	uint32_t ratov_j; + +	found = do_bsg_done = false;  	spin_lock_irqsave(qpair->qp_lock_ptr, flags);  	req = qpair->req; @@ -3080,42 +3079,104 @@ static bool qla_bsg_found(struct qla_qpair *qpair, struct bsg_job *bsg_job)  		     sp->type == SRB_ELS_CMD_HST ||  		     sp->type == SRB_ELS_CMD_HST_NOLOGIN) &&  		    sp->u.bsg_job == bsg_job) { -			req->outstanding_cmds[cnt] = NULL; -			spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); - -			if (!ha->flags.eeh_busy && ha->isp_ops->abort_command(sp)) { -				ql_log(ql_log_warn, vha, 0x7089, -						"mbx abort_command failed.\n"); -				bsg_reply->result = -EIO; -			} else { -				ql_dbg(ql_dbg_user, vha, 0x708a, -						"mbx abort_command success.\n"); -				bsg_reply->result = 0; -			} -			/* ref: INIT */ -			kref_put(&sp->cmd_kref, qla2x00_sp_release);  			found = true; -			goto done; +			sp->comp = ∁ +			break;  		}  	}  	spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); -done: -	return found; +	if (!found) +		return false; + +	if (ha->flags.eeh_busy) { +		/* skip over abort.  EEH handling will return the bsg. Wait for it */ +		rval = QLA_SUCCESS; +		ql_dbg(ql_dbg_user, vha, 0x802c, +			"eeh encounter. bsg %p sp=%p handle=%x \n", +			bsg_job, sp, sp->handle); +	} else { +		rval = ha->isp_ops->abort_command(sp); +		ql_dbg(ql_dbg_user, vha, 0x802c, +			"Aborting bsg %p sp=%p handle=%x rval=%x\n", +			bsg_job, sp, sp->handle, rval); +	} + +	switch (rval) { +	case QLA_SUCCESS: +		/* Wait for the command completion. */ +		ratov_j = ha->r_a_tov / 10 * 4 * 1000; +		ratov_j = msecs_to_jiffies(ratov_j); + +		if (!wait_for_completion_timeout(&comp, ratov_j)) { +			ql_log(ql_log_info, vha, 0x7089, +				"bsg abort timeout.  bsg=%p sp=%p handle %#x .\n", +				bsg_job, sp, sp->handle); + +			do_bsg_done = true; +		} else { +			/* fw had returned the bsg */ +			ql_dbg(ql_dbg_user, vha, 0x708a, +				"bsg abort success. bsg %p sp=%p handle=%#x\n", +				bsg_job, sp, sp->handle); +			do_bsg_done = false; +		} +		break; +	default: +		ql_log(ql_log_info, vha, 0x704f, +			"bsg abort fail.  bsg=%p sp=%p rval=%x.\n", +			bsg_job, sp, rval); + +		do_bsg_done = true; +		break; +	} + +	if (!do_bsg_done) +		return true; + +	spin_lock_irqsave(qpair->qp_lock_ptr, flags); +	/* +	 * recheck to make sure it's still the same bsg_job due to +	 * qp_lock_ptr was released earlier. +	 */ +	if (req->outstanding_cmds[cnt] && +	    req->outstanding_cmds[cnt]->u.bsg_job != bsg_job) { +		/* fw had returned the bsg */ +		spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); +		return true; +	} +	req->outstanding_cmds[cnt] = NULL; +	spin_unlock_irqrestore(qpair->qp_lock_ptr, flags); + +	/* ref: INIT */ +	sp->comp = NULL; +	kref_put(&sp->cmd_kref, qla2x00_sp_release); +	bsg_reply->result = -ENXIO; +	bsg_reply->reply_payload_rcv_len = 0; + +	ql_dbg(ql_dbg_user, vha, 0x7051, +	       "%s bsg_job_done : bsg %p result %#x sp %p.\n", +	       __func__, bsg_job, bsg_reply->result, sp); + +	bsg_job_done(bsg_job, bsg_reply->result, bsg_reply->reply_payload_rcv_len); + +	return true;  }  int  qla24xx_bsg_timeout(struct bsg_job *bsg_job)  { -	struct fc_bsg_reply *bsg_reply = bsg_job->reply; +	struct fc_bsg_request *bsg_request = bsg_job->request;  	scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));  	struct qla_hw_data *ha = vha->hw;  	int i;  	struct qla_qpair *qpair; -	ql_log(ql_log_info, vha, 0x708b, "%s CMD timeout. bsg ptr %p.\n", -	    __func__, bsg_job); +	ql_log(ql_log_info, vha, 0x708b, +	       "%s CMD timeout. bsg ptr %p msgcode %x vendor cmd %x\n", +	       __func__, bsg_job, bsg_request->msgcode, +	       bsg_request->rqst_data.h_vendor.vendor_cmd[0]);  	if (qla2x00_isp_reg_stat(ha)) {  		ql_log(ql_log_info, vha, 0x9007, @@ -3136,7 +3197,6 @@ qla24xx_bsg_timeout(struct bsg_job *bsg_job)  	}  	ql_log(ql_log_info, vha, 0x708b, "SRB not found to abort.\n"); -	bsg_reply->result = -ENXIO;  done:  	return 0; diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 76703f2706b8..79879c4743e6 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c @@ -506,6 +506,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)  		return(NULL);  	} +	vha->irq_offset = QLA_BASE_VECTORS;  	host = vha->host;  	fc_vport->dd_data = vha;  	/* New host info */ diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 7f980e6141c2..7ab717ed7232 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -6902,12 +6902,15 @@ qla2x00_do_dpc(void *data)  	set_user_nice(current, MIN_NICE);  	set_current_state(TASK_INTERRUPTIBLE); -	while (!kthread_should_stop()) { +	while (1) {  		ql_dbg(ql_dbg_dpc, base_vha, 0x4000,  		    "DPC handler sleeping.\n");  		schedule(); +		if (kthread_should_stop()) +			break; +  		if (test_and_clear_bit(DO_EEH_RECOVERY, &base_vha->dpc_flags))  			qla_pci_set_eeh_busy(base_vha); @@ -6920,15 +6923,16 @@ qla2x00_do_dpc(void *data)  			goto end_loop;  		} +		if (test_bit(UNLOADING, &base_vha->dpc_flags)) +			/* don't do any work. Wait to be terminated by kthread_stop */ +			goto end_loop; +  		ha->dpc_active = 1;  		ql_dbg(ql_dbg_dpc + ql_dbg_verbose, base_vha, 0x4001,  		    "DPC handler waking up, dpc_flags=0x%lx.\n",  		    base_vha->dpc_flags); -		if (test_bit(UNLOADING, &base_vha->dpc_flags)) -			break; -  		if (IS_P3P_TYPE(ha)) {  			if (IS_QLA8044(ha)) {  				if (test_and_clear_bit(ISP_UNRECOVERABLE, @@ -7241,9 +7245,6 @@ end_loop:  	 */  	ha->dpc_active = 0; -	/* Cleanup any residual CTX SRBs. */ -	qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); -  	return 0;  } diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index cf0f9d9db645..a491d6ee5c94 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h @@ -6,9 +6,9 @@  /*   * Driver version   */ -#define QLA2XXX_VERSION      "10.02.09.300-k" +#define QLA2XXX_VERSION      "10.02.09.400-k"  #define QLA_DRIVER_MAJOR_VER	10  #define QLA_DRIVER_MINOR_VER	2  #define QLA_DRIVER_PATCH_VER	9 -#define QLA_DRIVER_BETA_VER	300 +#define QLA_DRIVER_BETA_VER	400 diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index b52513eeeafa..680ba180a672 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -6447,7 +6447,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,  	}  	sd_dp = &sqcp->sd_dp; -	if (polled) +	if (polled || (ndelay > 0 && ndelay < INCLUSIVE_TIMING_MAX_NS))  		ns_from_boot = ktime_get_boottime_ns();  	/* one of the resp_*() response functions is called here */ diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index adee6f60c966..0cc6a0f77b09 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -210,6 +210,9 @@ static int scsi_check_passthrough(struct scsi_cmnd *scmd,  	struct scsi_sense_hdr sshdr;  	enum sam_status status; +	if (!scmd->result) +		return 0; +  	if (!failures)  		return 0; diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index fde7de3b1e55..9b47f91c5b97 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -4104,7 +4104,7 @@ iscsi_if_rx(struct sk_buff *skb)  		}  		do {  			/* -			 * special case for GET_STATS: +			 * special case for GET_STATS, GET_CHAP and GET_HOST_STATS:  			 * on success - sending reply and stats from  			 * inside of if_recv_msg(),  			 * on error - fall through. @@ -4113,6 +4113,8 @@ iscsi_if_rx(struct sk_buff *skb)  				break;  			if (ev->type == ISCSI_UEVENT_GET_CHAP && !err)  				break; +			if (ev->type == ISCSI_UEVENT_GET_HOST_STATS && !err) +				break;  			err = iscsi_if_send_reply(portid, nlh->nlmsg_type,  						  ev, sizeof(*ev));  			if (err == -EAGAIN && --retries < 0) { diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 84334ab39c81..94127868bedf 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -386,7 +386,6 @@ sg_release(struct inode *inode, struct file *filp)  	SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, "sg_release\n"));  	mutex_lock(&sdp->open_rel_lock); -	kref_put(&sfp->f_ref, sg_remove_sfp);  	sdp->open_cnt--;  	/* possibly many open()s waiting on exlude clearing, start many; @@ -398,6 +397,7 @@ sg_release(struct inode *inode, struct file *filp)  		wake_up_interruptible(&sdp->open_wait);  	}  	mutex_unlock(&sdp->open_rel_lock); +	kref_put(&sfp->f_ref, sg_remove_sfp);  	return 0;  } diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index 7ceb982040a5..d0b55c1fa908 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c @@ -149,6 +149,8 @@ struct hv_fc_wwn_packet {  */  static int vmstor_proto_version; +static bool hv_dev_is_fc(struct hv_device *hv_dev); +  #define STORVSC_LOGGING_NONE	0  #define STORVSC_LOGGING_ERROR	1  #define STORVSC_LOGGING_WARN	2 @@ -1138,6 +1140,7 @@ static void storvsc_on_io_completion(struct storvsc_device *stor_device,  	 * not correctly handle:  	 * INQUIRY command with page code parameter set to 0x80  	 * MODE_SENSE command with cmd[2] == 0x1c +	 * MAINTENANCE_IN is not supported by HyperV FC passthrough  	 *  	 * Setup srb and scsi status so this won't be fatal.  	 * We do this so we can distinguish truly fatal failues @@ -1145,7 +1148,9 @@ static void storvsc_on_io_completion(struct storvsc_device *stor_device,  	 */  	if ((stor_pkt->vm_srb.cdb[0] == INQUIRY) || -	   (stor_pkt->vm_srb.cdb[0] == MODE_SENSE)) { +	   (stor_pkt->vm_srb.cdb[0] == MODE_SENSE) || +	   (stor_pkt->vm_srb.cdb[0] == MAINTENANCE_IN && +	   hv_dev_is_fc(device))) {  		vstor_packet->vm_srb.scsi_status = 0;  		vstor_packet->vm_srb.srb_status = SRB_STATUS_SUCCESS;  	} diff --git a/drivers/slimbus/qcom-ctrl.c b/drivers/slimbus/qcom-ctrl.c index e25f9bdd9b23..ab344f7472f2 100644 --- a/drivers/slimbus/qcom-ctrl.c +++ b/drivers/slimbus/qcom-ctrl.c @@ -722,7 +722,7 @@ MODULE_DEVICE_TABLE(of, qcom_slim_dt_match);  static struct platform_driver qcom_slim_driver = {  	.probe = qcom_slim_probe, -	.remove_new = qcom_slim_remove, +	.remove = qcom_slim_remove,  	.driver	= {  		.name = "qcom_slim_ctrl",  		.of_match_table = qcom_slim_dt_match, diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c index 1ac8e2912fd1..4fb66986cc22 100644 --- a/drivers/slimbus/qcom-ngd-ctrl.c +++ b/drivers/slimbus/qcom-ngd-ctrl.c @@ -1743,7 +1743,7 @@ static const struct dev_pm_ops qcom_slim_ngd_dev_pm_ops = {  static struct platform_driver qcom_slim_ngd_ctrl_driver = {  	.probe = qcom_slim_ngd_ctrl_probe, -	.remove_new = qcom_slim_ngd_ctrl_remove, +	.remove = qcom_slim_ngd_ctrl_remove,  	.driver	= {  		.name = "qcom,slim-ngd-ctrl",  		.of_match_table = qcom_slim_ngd_dt_match, @@ -1752,7 +1752,7 @@ static struct platform_driver qcom_slim_ngd_ctrl_driver = {  static struct platform_driver qcom_slim_ngd_driver = {  	.probe = qcom_slim_ngd_probe, -	.remove_new = qcom_slim_ngd_remove, +	.remove = qcom_slim_ngd_remove,  	.driver	= {  		.name = QCOM_SLIM_NGD_DRV_NAME,  		.pm = &qcom_slim_ngd_dev_pm_ops, diff --git a/drivers/soundwire/amd_init.c b/drivers/soundwire/amd_init.c index d11b60efda33..643e94524fe6 100644 --- a/drivers/soundwire/amd_init.c +++ b/drivers/soundwire/amd_init.c @@ -173,7 +173,7 @@ int sdw_amd_probe(struct sdw_amd_res *res, struct sdw_amd_ctx **sdw_ctx)  	return sdw_amd_startup(*sdw_ctx);  } -EXPORT_SYMBOL_NS(sdw_amd_probe, SOUNDWIRE_AMD_INIT); +EXPORT_SYMBOL_NS(sdw_amd_probe, "SOUNDWIRE_AMD_INIT");  void sdw_amd_exit(struct sdw_amd_ctx *ctx)  { @@ -181,7 +181,7 @@ void sdw_amd_exit(struct sdw_amd_ctx *ctx)  	kfree(ctx->peripherals);  	kfree(ctx);  } -EXPORT_SYMBOL_NS(sdw_amd_exit, SOUNDWIRE_AMD_INIT); +EXPORT_SYMBOL_NS(sdw_amd_exit, "SOUNDWIRE_AMD_INIT");  int sdw_amd_get_slave_info(struct sdw_amd_ctx *ctx)  { @@ -224,7 +224,7 @@ int sdw_amd_get_slave_info(struct sdw_amd_ctx *ctx)  	}  	return 0;  } -EXPORT_SYMBOL_NS(sdw_amd_get_slave_info, SOUNDWIRE_AMD_INIT); +EXPORT_SYMBOL_NS(sdw_amd_get_slave_info, "SOUNDWIRE_AMD_INIT");  MODULE_AUTHOR("Vijendar.Mukunda@amd.com");  MODULE_DESCRIPTION("AMD SoundWire Init Library"); diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c index 5a4bfaef65fb..96a7f9709720 100644 --- a/drivers/soundwire/amd_manager.c +++ b/drivers/soundwire/amd_manager.c @@ -1221,7 +1221,7 @@ static const struct dev_pm_ops amd_pm = {  static struct platform_driver amd_sdw_driver = {  	.probe	= &amd_sdw_manager_probe, -	.remove_new = &amd_sdw_manager_remove, +	.remove = &amd_sdw_manager_remove,  	.driver = {  		.name	= "amd_sdw_manager",  		.pm = &amd_pm, diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c index 421da0f86fad..9db78f3d7615 100644 --- a/drivers/soundwire/intel.c +++ b/drivers/soundwire/intel.c @@ -1111,4 +1111,4 @@ const struct sdw_intel_hw_ops sdw_intel_cnl_hw_ops = {  	.sync_go = intel_shim_sync_go,  	.sync_check_cmdsync_unlocked = intel_check_cmdsync_unlocked,  }; -EXPORT_SYMBOL_NS(sdw_intel_cnl_hw_ops, SOUNDWIRE_INTEL); +EXPORT_SYMBOL_NS(sdw_intel_cnl_hw_ops, "SOUNDWIRE_INTEL"); diff --git a/drivers/soundwire/intel_ace2x.c b/drivers/soundwire/intel_ace2x.c index a005b63582e9..e305c6258ca9 100644 --- a/drivers/soundwire/intel_ace2x.c +++ b/drivers/soundwire/intel_ace2x.c @@ -754,6 +754,6 @@ const struct sdw_intel_hw_ops sdw_intel_lnl_hw_ops = {  	.program_sdi = intel_program_sdi,  }; -EXPORT_SYMBOL_NS(sdw_intel_lnl_hw_ops, SOUNDWIRE_INTEL); +EXPORT_SYMBOL_NS(sdw_intel_lnl_hw_ops, "SOUNDWIRE_INTEL"); -MODULE_IMPORT_NS(SND_SOC_SOF_HDA_MLINK); +MODULE_IMPORT_NS("SND_SOC_SOF_HDA_MLINK"); diff --git a/drivers/soundwire/intel_init.c b/drivers/soundwire/intel_init.c index 12e7a98f319f..5f53666514a4 100644 --- a/drivers/soundwire/intel_init.c +++ b/drivers/soundwire/intel_init.c @@ -149,7 +149,7 @@ irqreturn_t sdw_intel_thread(int irq, void *dev_id)  	return IRQ_HANDLED;  } -EXPORT_SYMBOL_NS(sdw_intel_thread, SOUNDWIRE_INTEL_INIT); +EXPORT_SYMBOL_NS(sdw_intel_thread, "SOUNDWIRE_INTEL_INIT");  static struct sdw_intel_ctx  *sdw_intel_probe_controller(struct sdw_intel_res *res) @@ -334,7 +334,7 @@ struct sdw_intel_ctx  {  	return sdw_intel_probe_controller(res);  } -EXPORT_SYMBOL_NS(sdw_intel_probe, SOUNDWIRE_INTEL_INIT); +EXPORT_SYMBOL_NS(sdw_intel_probe, "SOUNDWIRE_INTEL_INIT");  /**   * sdw_intel_startup() - SoundWire Intel startup @@ -347,7 +347,7 @@ int sdw_intel_startup(struct sdw_intel_ctx *ctx)  {  	return sdw_intel_startup_controller(ctx);  } -EXPORT_SYMBOL_NS(sdw_intel_startup, SOUNDWIRE_INTEL_INIT); +EXPORT_SYMBOL_NS(sdw_intel_startup, "SOUNDWIRE_INTEL_INIT");  /**   * sdw_intel_exit() - SoundWire Intel exit   * @ctx: SoundWire context allocated in the probe @@ -374,7 +374,7 @@ void sdw_intel_exit(struct sdw_intel_ctx *ctx)  	kfree(ctx->ldev);  	kfree(ctx);  } -EXPORT_SYMBOL_NS(sdw_intel_exit, SOUNDWIRE_INTEL_INIT); +EXPORT_SYMBOL_NS(sdw_intel_exit, "SOUNDWIRE_INTEL_INIT");  void sdw_intel_process_wakeen_event(struct sdw_intel_ctx *ctx)  { @@ -397,7 +397,7 @@ void sdw_intel_process_wakeen_event(struct sdw_intel_ctx *ctx)  		intel_link_process_wakeen_event(&ldev->auxdev);  	}  } -EXPORT_SYMBOL_NS(sdw_intel_process_wakeen_event, SOUNDWIRE_INTEL_INIT); +EXPORT_SYMBOL_NS(sdw_intel_process_wakeen_event, "SOUNDWIRE_INTEL_INIT");  MODULE_LICENSE("Dual BSD/GPL");  MODULE_DESCRIPTION("Intel Soundwire Init Library"); diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 2b403b14066c..e00c5ac496a6 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -1779,7 +1779,7 @@ MODULE_DEVICE_TABLE(of, qcom_swrm_of_match);  static struct platform_driver qcom_swrm_driver = {  	.probe	= &qcom_swrm_probe, -	.remove_new = qcom_swrm_remove, +	.remove = qcom_swrm_remove,  	.driver = {  		.name	= "qcom-soundwire",  		.of_match_table = qcom_swrm_of_match, diff --git a/drivers/soundwire/slave.c b/drivers/soundwire/slave.c index 97cf8bcca047..4869b073b11c 100644 --- a/drivers/soundwire/slave.c +++ b/drivers/soundwire/slave.c @@ -272,4 +272,4 @@ int sdw_of_find_slaves(struct sdw_bus *bus)  	return 0;  } -MODULE_IMPORT_NS(SND_SOC_SDCA); +MODULE_IMPORT_NS("SND_SOC_SDCA"); diff --git a/drivers/spi/spi-apple.c b/drivers/spi/spi-apple.c index d4b126c8701a..6273352a2b28 100644 --- a/drivers/spi/spi-apple.c +++ b/drivers/spi/spi-apple.c @@ -493,6 +493,7 @@ static int apple_spi_probe(struct platform_device *pdev)  	ctlr->prepare_message = apple_spi_prepare_message;  	ctlr->set_cs = apple_spi_set_cs;  	ctlr->transfer_one = apple_spi_transfer_one; +	ctlr->use_gpio_descriptors = true;  	ctlr->auto_runtime_pm = true;  	pm_runtime_set_active(&pdev->dev); diff --git a/drivers/spi/spi-aspeed-smc.c b/drivers/spi/spi-aspeed-smc.c index 8eb843ddb25f..e9beae95dded 100644 --- a/drivers/spi/spi-aspeed-smc.c +++ b/drivers/spi/spi-aspeed-smc.c @@ -239,7 +239,7 @@ static ssize_t aspeed_spi_read_user(struct aspeed_spi_chip *chip,  	ret = aspeed_spi_send_cmd_addr(chip, op->addr.nbytes, offset, op->cmd.opcode);  	if (ret < 0) -		return ret; +		goto stop_user;  	if (op->dummy.buswidth && op->dummy.nbytes) {  		for (i = 0; i < op->dummy.nbytes / op->dummy.buswidth; i++) @@ -249,8 +249,9 @@ static ssize_t aspeed_spi_read_user(struct aspeed_spi_chip *chip,  	aspeed_spi_set_io_mode(chip, io_mode);  	aspeed_spi_read_from_ahb(buf, chip->ahb_base, len); +stop_user:  	aspeed_spi_stop_user(chip); -	return 0; +	return ret;  }  static ssize_t aspeed_spi_write_user(struct aspeed_spi_chip *chip, @@ -261,10 +262,11 @@ static ssize_t aspeed_spi_write_user(struct aspeed_spi_chip *chip,  	aspeed_spi_start_user(chip);  	ret = aspeed_spi_send_cmd_addr(chip, op->addr.nbytes, op->addr.val, op->cmd.opcode);  	if (ret < 0) -		return ret; +		goto stop_user;  	aspeed_spi_write_to_ahb(chip->ahb_base, op->data.buf.out, op->data.nbytes); +stop_user:  	aspeed_spi_stop_user(chip); -	return 0; +	return ret;  }  /* support for 1-1-1, 1-1-2 or 1-1-4 */ diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c index 0b45b7b2b3ab..a031ecb358e0 100644 --- a/drivers/spi/spi-cadence-quadspi.c +++ b/drivers/spi/spi-cadence-quadspi.c @@ -43,6 +43,7 @@ static_assert(CQSPI_MAX_CHIPSELECT <= SPI_CS_CNT_MAX);  #define CQSPI_SLOW_SRAM		BIT(4)  #define CQSPI_NEEDS_APB_AHB_HAZARD_WAR	BIT(5)  #define CQSPI_RD_NO_IRQ			BIT(6) +#define CQSPI_DISABLE_STIG_MODE		BIT(7)  /* Capabilities */  #define CQSPI_SUPPORTS_OCTAL		BIT(0) @@ -103,6 +104,7 @@ struct cqspi_st {  	bool			apb_ahb_hazard;  	bool			is_jh7110; /* Flag for StarFive JH7110 SoC */ +	bool			disable_stig_mode;  	const struct cqspi_driver_platdata *ddata;  }; @@ -1416,7 +1418,8 @@ static int cqspi_mem_process(struct spi_mem *mem, const struct spi_mem_op *op)  	 * reads, prefer STIG mode for such small reads.  	 */  		if (!op->addr.nbytes || -		    op->data.nbytes <= CQSPI_STIG_DATA_LEN_MAX) +		    (op->data.nbytes <= CQSPI_STIG_DATA_LEN_MAX && +		     !cqspi->disable_stig_mode))  			return cqspi_command_read(f_pdata, op);  		return cqspi_read(f_pdata, op); @@ -1880,6 +1883,8 @@ static int cqspi_probe(struct platform_device *pdev)  			if (ret)  				goto probe_reset_failed;  		} +		if (ddata->quirks & CQSPI_DISABLE_STIG_MODE) +			cqspi->disable_stig_mode = true;  		if (of_device_is_compatible(pdev->dev.of_node,  					    "xlnx,versal-ospi-1.0")) { @@ -2043,7 +2048,8 @@ static const struct cqspi_driver_platdata intel_lgm_qspi = {  static const struct cqspi_driver_platdata socfpga_qspi = {  	.quirks = CQSPI_DISABLE_DAC_MODE  			| CQSPI_NO_SUPPORT_WR_COMPLETION -			| CQSPI_SLOW_SRAM, +			| CQSPI_SLOW_SRAM +			| CQSPI_DISABLE_STIG_MODE,  };  static const struct cqspi_driver_platdata versal_ospi = { diff --git a/drivers/spi/spi-cs42l43.c b/drivers/spi/spi-cs42l43.c index d0b55a26c31b..ceefc253c549 100644 --- a/drivers/spi/spi-cs42l43.c +++ b/drivers/spi/spi-cs42l43.c @@ -462,7 +462,7 @@ static struct platform_driver cs42l43_spi_driver = {  };  module_platform_driver(cs42l43_spi_driver); -MODULE_IMPORT_NS(GPIO_SWNODE); +MODULE_IMPORT_NS("GPIO_SWNODE");  MODULE_DESCRIPTION("CS42L43 SPI Driver");  MODULE_AUTHOR("Lucas Tanure <tanureal@opensource.cirrus.com>");  MODULE_AUTHOR("Maciej Strozek <mstrozek@opensource.cirrus.com>"); diff --git a/drivers/spi/spi-dw-bt1.c b/drivers/spi/spi-dw-bt1.c index abe6410f0e99..4a5be813efa7 100644 --- a/drivers/spi/spi-dw-bt1.c +++ b/drivers/spi/spi-dw-bt1.c @@ -328,4 +328,4 @@ module_platform_driver(dw_spi_bt1_driver);  MODULE_AUTHOR("Serge Semin <Sergey.Semin@baikalelectronics.ru>");  MODULE_DESCRIPTION("Baikal-T1 System Boot SPI Controller driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SPI_DW_CORE); +MODULE_IMPORT_NS("SPI_DW_CORE"); diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c index 431788dd848c..ea517af9435f 100644 --- a/drivers/spi/spi-dw-core.c +++ b/drivers/spi/spi-dw-core.c @@ -104,7 +104,7 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable)  	else  		dw_writel(dws, DW_SPI_SER, 0);  } -EXPORT_SYMBOL_NS_GPL(dw_spi_set_cs, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_set_cs, "SPI_DW_CORE");  /* Return the max entries we can fill into tx fifo */  static inline u32 dw_spi_tx_max(struct dw_spi *dws) @@ -208,7 +208,7 @@ int dw_spi_check_status(struct dw_spi *dws, bool raw)  	return ret;  } -EXPORT_SYMBOL_NS_GPL(dw_spi_check_status, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_check_status, "SPI_DW_CORE");  static irqreturn_t dw_spi_transfer_handler(struct dw_spi *dws)  { @@ -351,7 +351,7 @@ void dw_spi_update_config(struct dw_spi *dws, struct spi_device *spi,  		dws->cur_rx_sample_dly = chip->rx_sample_dly;  	}  } -EXPORT_SYMBOL_NS_GPL(dw_spi_update_config, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_update_config, "SPI_DW_CORE");  static void dw_spi_irq_setup(struct dw_spi *dws)  { @@ -982,7 +982,7 @@ err_free_host:  	spi_controller_put(host);  	return ret;  } -EXPORT_SYMBOL_NS_GPL(dw_spi_add_host, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_add_host, "SPI_DW_CORE");  void dw_spi_remove_host(struct dw_spi *dws)  { @@ -997,7 +997,7 @@ void dw_spi_remove_host(struct dw_spi *dws)  	free_irq(dws->irq, dws->host);  } -EXPORT_SYMBOL_NS_GPL(dw_spi_remove_host, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_remove_host, "SPI_DW_CORE");  int dw_spi_suspend_host(struct dw_spi *dws)  { @@ -1010,14 +1010,14 @@ int dw_spi_suspend_host(struct dw_spi *dws)  	dw_spi_shutdown_chip(dws);  	return 0;  } -EXPORT_SYMBOL_NS_GPL(dw_spi_suspend_host, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_suspend_host, "SPI_DW_CORE");  int dw_spi_resume_host(struct dw_spi *dws)  {  	dw_spi_hw_init(&dws->host->dev, dws);  	return spi_controller_resume(dws->host);  } -EXPORT_SYMBOL_NS_GPL(dw_spi_resume_host, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_resume_host, "SPI_DW_CORE");  MODULE_AUTHOR("Feng Tang <feng.tang@intel.com>");  MODULE_DESCRIPTION("Driver for DesignWare SPI controller core"); diff --git a/drivers/spi/spi-dw-dma.c b/drivers/spi/spi-dw-dma.c index f4c209e5f52b..b5bed02b7e50 100644 --- a/drivers/spi/spi-dw-dma.c +++ b/drivers/spi/spi-dw-dma.c @@ -693,7 +693,7 @@ void dw_spi_dma_setup_mfld(struct dw_spi *dws)  {  	dws->dma_ops = &dw_spi_dma_mfld_ops;  } -EXPORT_SYMBOL_NS_GPL(dw_spi_dma_setup_mfld, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_dma_setup_mfld, "SPI_DW_CORE");  static const struct dw_spi_dma_ops dw_spi_dma_generic_ops = {  	.dma_init	= dw_spi_dma_init_generic, @@ -708,4 +708,4 @@ void dw_spi_dma_setup_generic(struct dw_spi *dws)  {  	dws->dma_ops = &dw_spi_dma_generic_ops;  } -EXPORT_SYMBOL_NS_GPL(dw_spi_dma_setup_generic, SPI_DW_CORE); +EXPORT_SYMBOL_NS_GPL(dw_spi_dma_setup_generic, "SPI_DW_CORE"); diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c index 863040cf5db7..f0f576fac77a 100644 --- a/drivers/spi/spi-dw-mmio.c +++ b/drivers/spi/spi-dw-mmio.c @@ -445,4 +445,4 @@ module_platform_driver(dw_spi_mmio_driver);  MODULE_AUTHOR("Jean-Hugues Deschenes <jean-hugues.deschenes@octasic.com>");  MODULE_DESCRIPTION("Memory-mapped I/O interface driver for DW SPI Core");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SPI_DW_CORE); +MODULE_IMPORT_NS("SPI_DW_CORE"); diff --git a/drivers/spi/spi-dw-pci.c b/drivers/spi/spi-dw-pci.c index 6b8cc26e06f8..b32d6648a32e 100644 --- a/drivers/spi/spi-dw-pci.c +++ b/drivers/spi/spi-dw-pci.c @@ -211,4 +211,4 @@ module_pci_driver(dw_spi_pci_driver);  MODULE_AUTHOR("Feng Tang <feng.tang@intel.com>");  MODULE_DESCRIPTION("PCI interface driver for DW SPI Core");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SPI_DW_CORE); +MODULE_IMPORT_NS("SPI_DW_CORE"); diff --git a/drivers/spi/spi-intel-pci.c b/drivers/spi/spi-intel-pci.c index c3b54928143d..4d9ffec900bb 100644 --- a/drivers/spi/spi-intel-pci.c +++ b/drivers/spi/spi-intel-pci.c @@ -86,6 +86,8 @@ static const struct pci_device_id intel_spi_pci_ids[] = {  	{ PCI_VDEVICE(INTEL, 0xa324), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0xa3a4), (unsigned long)&cnl_info },  	{ PCI_VDEVICE(INTEL, 0xa823), (unsigned long)&cnl_info }, +	{ PCI_VDEVICE(INTEL, 0xe323), (unsigned long)&cnl_info }, +	{ PCI_VDEVICE(INTEL, 0xe423), (unsigned long)&cnl_info },  	{ },  };  MODULE_DEVICE_TABLE(pci, intel_spi_pci_ids); diff --git a/drivers/spi/spi-ljca.c b/drivers/spi/spi-ljca.c index 1cc1422ddba0..2cab79ad2b98 100644 --- a/drivers/spi/spi-ljca.c +++ b/drivers/spi/spi-ljca.c @@ -294,4 +294,4 @@ MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");  MODULE_AUTHOR("Lixu Zhang <lixu.zhang@intel.com>");  MODULE_DESCRIPTION("Intel La Jolla Cove Adapter USB-SPI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(LJCA); +MODULE_IMPORT_NS("LJCA"); diff --git a/drivers/spi/spi-loongson-core.c b/drivers/spi/spi-loongson-core.c index f97800b6fd65..4fec226456d1 100644 --- a/drivers/spi/spi-loongson-core.c +++ b/drivers/spi/spi-loongson-core.c @@ -227,7 +227,7 @@ int loongson_spi_init_controller(struct device *dev, void __iomem *regs)  	return devm_spi_register_controller(dev, controller);  } -EXPORT_SYMBOL_NS_GPL(loongson_spi_init_controller, SPI_LOONGSON_CORE); +EXPORT_SYMBOL_NS_GPL(loongson_spi_init_controller, "SPI_LOONGSON_CORE");  static int __maybe_unused loongson_spi_suspend(struct device *dev)  { @@ -273,7 +273,7 @@ const struct dev_pm_ops loongson_spi_dev_pm_ops = {  	.suspend = loongson_spi_suspend,  	.resume = loongson_spi_resume,  }; -EXPORT_SYMBOL_NS_GPL(loongson_spi_dev_pm_ops, SPI_LOONGSON_CORE); +EXPORT_SYMBOL_NS_GPL(loongson_spi_dev_pm_ops, "SPI_LOONGSON_CORE");  MODULE_DESCRIPTION("Loongson SPI core driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/spi/spi-loongson-pci.c b/drivers/spi/spi-loongson-pci.c index 892cf1eba1cf..cbcde153260e 100644 --- a/drivers/spi/spi-loongson-pci.c +++ b/drivers/spi/spi-loongson-pci.c @@ -51,4 +51,4 @@ module_pci_driver(loongson_spi_pci_driver);  MODULE_DESCRIPTION("Loongson spi pci driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(SPI_LOONGSON_CORE); +MODULE_IMPORT_NS("SPI_LOONGSON_CORE"); diff --git a/drivers/spi/spi-loongson-plat.c b/drivers/spi/spi-loongson-plat.c index c066e5f5891e..64a7270f9a64 100644 --- a/drivers/spi/spi-loongson-plat.c +++ b/drivers/spi/spi-loongson-plat.c @@ -44,4 +44,4 @@ module_platform_driver(loongson_spi_plat_driver);  MODULE_DESCRIPTION("Loongson spi platform driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(SPI_LOONGSON_CORE); +MODULE_IMPORT_NS("SPI_LOONGSON_CORE"); diff --git a/drivers/spi/spi-mpc52xx.c b/drivers/spi/spi-mpc52xx.c index 036bfb7bf189..6d4dde15ac54 100644 --- a/drivers/spi/spi-mpc52xx.c +++ b/drivers/spi/spi-mpc52xx.c @@ -520,6 +520,7 @@ static void mpc52xx_spi_remove(struct platform_device *op)  	struct mpc52xx_spi *ms = spi_controller_get_devdata(host);  	int i; +	cancel_work_sync(&ms->work);  	free_irq(ms->irq0, ms);  	free_irq(ms->irq1, ms); diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index e2400a067a95..add6247d3481 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c @@ -1561,10 +1561,10 @@ static int omap2_mcspi_probe(struct platform_device *pdev)  	}  	mcspi->ref_clk = devm_clk_get_optional_enabled(&pdev->dev, NULL); -	if (mcspi->ref_clk) -		mcspi->ref_clk_hz = clk_get_rate(mcspi->ref_clk); -	else +	if (IS_ERR(mcspi->ref_clk))  		mcspi->ref_clk_hz = OMAP2_MCSPI_MAX_FREQ; +	else +		mcspi->ref_clk_hz = clk_get_rate(mcspi->ref_clk);  	ctlr->max_speed_hz = mcspi->ref_clk_hz;  	ctlr->min_speed_hz = mcspi->ref_clk_hz >> 15; diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c index e51c1b492283..cae77ac18520 100644 --- a/drivers/spi/spi-pxa2xx-pci.c +++ b/drivers/spi/spi-pxa2xx-pci.c @@ -346,5 +346,5 @@ module_pci_driver(pxa2xx_spi_pci_driver);  MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");  MODULE_LICENSE("GPL v2"); -MODULE_IMPORT_NS(SPI_PXA2xx); +MODULE_IMPORT_NS("SPI_PXA2xx");  MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>"); diff --git a/drivers/spi/spi-pxa2xx-platform.c b/drivers/spi/spi-pxa2xx-platform.c index b88b7de7a005..45e159e75a52 100644 --- a/drivers/spi/spi-pxa2xx-platform.c +++ b/drivers/spi/spi-pxa2xx-platform.c @@ -225,6 +225,6 @@ module_exit(pxa2xx_spi_exit);  MODULE_AUTHOR("Stephen Street");  MODULE_DESCRIPTION("PXA2xx SSP SPI Controller platform driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(SPI_PXA2xx); +MODULE_IMPORT_NS("SPI_PXA2xx");  MODULE_ALIAS("platform:pxa2xx-spi");  MODULE_SOFTDEP("pre: dw_dmac"); diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index bf1f34b0ffc8..903d76145272 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c @@ -1468,7 +1468,7 @@ out_error_dma_irq_alloc:  	return status;  } -EXPORT_SYMBOL_NS_GPL(pxa2xx_spi_probe, SPI_PXA2xx); +EXPORT_SYMBOL_NS_GPL(pxa2xx_spi_probe, "SPI_PXA2xx");  void pxa2xx_spi_remove(struct device *dev)  { @@ -1488,7 +1488,7 @@ void pxa2xx_spi_remove(struct device *dev)  	/* Release IRQ */  	free_irq(ssp->irq, drv_data);  } -EXPORT_SYMBOL_NS_GPL(pxa2xx_spi_remove, SPI_PXA2xx); +EXPORT_SYMBOL_NS_GPL(pxa2xx_spi_remove, "SPI_PXA2xx");  static int pxa2xx_spi_suspend(struct device *dev)  { diff --git a/drivers/spi/spi-rockchip-sfc.c b/drivers/spi/spi-rockchip-sfc.c index 69d0f2175568..70bbb459caa4 100644 --- a/drivers/spi/spi-rockchip-sfc.c +++ b/drivers/spi/spi-rockchip-sfc.c @@ -182,6 +182,7 @@ struct rockchip_sfc {  	bool use_dma;  	u32 max_iosize;  	u16 version; +	struct spi_controller *host;  };  static int rockchip_sfc_reset(struct rockchip_sfc *sfc) @@ -574,6 +575,7 @@ static int rockchip_sfc_probe(struct platform_device *pdev)  	sfc = spi_controller_get_devdata(host);  	sfc->dev = dev; +	sfc->host = host;  	sfc->regbase = devm_platform_ioremap_resource(pdev, 0);  	if (IS_ERR(sfc->regbase)) @@ -651,8 +653,8 @@ err_hclk:  static void rockchip_sfc_remove(struct platform_device *pdev)  { -	struct spi_controller *host = platform_get_drvdata(pdev);  	struct rockchip_sfc *sfc = platform_get_drvdata(pdev); +	struct spi_controller *host = sfc->host;  	spi_unregister_controller(host); diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index 864e58167417..1bc012fce7cb 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c @@ -241,6 +241,20 @@ static void rockchip_spi_set_cs(struct spi_device *spi, bool enable)  	struct spi_controller *ctlr = spi->controller;  	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);  	bool cs_asserted = spi->mode & SPI_CS_HIGH ? enable : !enable; +	bool cs_actual; + +	/* +	 * SPI subsystem tries to avoid no-op calls that would break the PM +	 * refcount below. It can't however for the first time it is used. +	 * To detect this case we read it here and bail out early for no-ops. +	 */ +	if (spi_get_csgpiod(spi, 0)) +		cs_actual = !!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SER) & 1); +	else +		cs_actual = !!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SER) & +			       BIT(spi_get_chipselect(spi, 0))); +	if (unlikely(cs_actual == cs_asserted)) +		return;  	if (cs_asserted) {  		/* Keep things powered as long as CS is asserted */ diff --git a/drivers/spmi/spmi-mtk-pmif.c b/drivers/spmi/spmi-mtk-pmif.c index 5079442f8ea1..160d36f7d238 100644 --- a/drivers/spmi/spmi-mtk-pmif.c +++ b/drivers/spmi/spmi-mtk-pmif.c @@ -545,7 +545,7 @@ static struct platform_driver mtk_spmi_driver = {  		.of_match_table = mtk_spmi_match_table,  	},  	.probe		= mtk_spmi_probe, -	.remove_new	= mtk_spmi_remove, +	.remove		= mtk_spmi_remove,  };  module_platform_driver(mtk_spmi_driver); diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c index ea843159b745..5c058db21821 100644 --- a/drivers/spmi/spmi-pmic-arb.c +++ b/drivers/spmi/spmi-pmic-arb.c @@ -1881,7 +1881,7 @@ MODULE_DEVICE_TABLE(of, spmi_pmic_arb_match_table);  static struct platform_driver spmi_pmic_arb_driver = {  	.probe		= spmi_pmic_arb_probe, -	.remove_new	= spmi_pmic_arb_remove, +	.remove		= spmi_pmic_arb_remove,  	.driver		= {  		.name	= "spmi_pmic_arb",  		.of_match_table = spmi_pmic_arb_match_table, diff --git a/drivers/staging/fbtft/Kconfig b/drivers/staging/fbtft/Kconfig index 77ab44362f16..dcf6a70455cc 100644 --- a/drivers/staging/fbtft/Kconfig +++ b/drivers/staging/fbtft/Kconfig @@ -3,6 +3,7 @@ menuconfig FB_TFT  	tristate "Support for small TFT LCD display modules"  	depends on FB && SPI  	depends on FB_DEVICE +	depends on BACKLIGHT_CLASS_DEVICE  	depends on GPIOLIB || COMPILE_TEST  	select FB_BACKLIGHT  	select FB_SYSMEM_HELPERS_DEFERRED diff --git a/drivers/staging/gpib/Kconfig b/drivers/staging/gpib/Kconfig index 95308d15a555..81510db3072e 100644 --- a/drivers/staging/gpib/Kconfig +++ b/drivers/staging/gpib/Kconfig @@ -50,6 +50,7 @@ config GPIB_CEC_PCI  	tristate "CEC PCI board"  	depends on PCI  	depends on HAS_IOPORT +	depends on !X86_PAE  	select GPIB_COMMON  	select GPIB_NEC7210  	help @@ -62,6 +63,10 @@ config GPIB_CEC_PCI  config GPIB_NI_PCI_ISA  	tristate "NI PCI/ISA compatible boards"  	depends on ISA_BUS || PCI || PCMCIA +	depends on HAS_IOPORT +	depends on !X86_PAE +	depends on PCMCIA || !PCMCIA +	depends on HAS_IOPORT_MAP  	select GPIB_COMMON  	select GPIB_NEC7210  	help @@ -85,6 +90,8 @@ config GPIB_CB7210         tristate "Measurement Computing compatible boards"  	depends on HAS_IOPORT  	depends on ISA_BUS || PCI || PCMCIA +	depends on !X86_PAE +	depends on PCMCIA || !PCMCIA         select GPIB_COMMON  	select GPIB_NEC7210         help @@ -128,7 +135,7 @@ config GPIB_FMH         tristate "FMH FPGA based devices"         select GPIB_COMMON         select GPIB_NEC7210 -       depends on BROKEN +       depends on !PPC         depends on OF && PCI         help           GPIB driver for fmhess FPGA based devices @@ -173,7 +180,9 @@ config GPIB_HP82341  config GPIB_INES         tristate "INES"  	depends on PCI || ISA_BUS || PCMCIA +	depends on PCMCIA || !PCMCIA  	depends on HAS_IOPORT +	depends on !X86_PAE         select GPIB_COMMON         select GPIB_NEC7210         help @@ -194,8 +203,8 @@ config GPIB_INES  	  called cb7210.  config GPIB_PCMCIA -       bool "PCMCIA/Cardbus support for NI MC and Ines boards" -       depends on PCCARD && (GPIB_NI_PCI_ISA || GPIB_CB7210 || GPIB_INES) +       def_bool y +       depends on PCMCIA && (GPIB_NI_PCI_ISA || GPIB_CB7210 || GPIB_INES)         help           Enable PCMCIA/CArdbus support for National Instruments,  	 measurement computing boards and Ines boards. diff --git a/drivers/staging/gpib/agilent_82350b/Makefile b/drivers/staging/gpib/agilent_82350b/Makefile index d9236c92e04b..f24e1e713a63 100644 --- a/drivers/staging/gpib/agilent_82350b/Makefile +++ b/drivers/staging/gpib/agilent_82350b/Makefile @@ -1,2 +1,2 @@ -obj-m += agilent_82350b.o +obj-$(CONFIG_GPIB_AGILENT_82350B) += agilent_82350b.o diff --git a/drivers/staging/gpib/agilent_82350b/agilent_82350b.c b/drivers/staging/gpib/agilent_82350b/agilent_82350b.c index 53006d0cc79c..8e2334fe5c9b 100644 --- a/drivers/staging/gpib/agilent_82350b/agilent_82350b.c +++ b/drivers/staging/gpib/agilent_82350b/agilent_82350b.c @@ -700,7 +700,7 @@ static int agilent_82350b_generic_attach(gpib_board_t *board, const gpib_board_c  							     GPIB_82350A_REGION));  		dev_dbg(board->gpib_dev, "%s: gpib base address remapped to 0x%p\n",  			driver_name, a_priv->gpib_base); -		tms_priv->iobase = a_priv->gpib_base + TMS9914_BASE_REG; +		tms_priv->mmiobase = a_priv->gpib_base + TMS9914_BASE_REG;  		a_priv->sram_base = ioremap(pci_resource_start(a_priv->pci_device,  							       SRAM_82350A_REGION),  					    pci_resource_len(a_priv->pci_device, @@ -724,7 +724,7 @@ static int agilent_82350b_generic_attach(gpib_board_t *board, const gpib_board_c  					    pci_resource_len(a_priv->pci_device, GPIB_REGION));  		dev_dbg(board->gpib_dev, "%s: gpib base address remapped to 0x%p\n",  			driver_name, a_priv->gpib_base); -		tms_priv->iobase = a_priv->gpib_base + TMS9914_BASE_REG; +		tms_priv->mmiobase = a_priv->gpib_base + TMS9914_BASE_REG;  		a_priv->sram_base = ioremap(pci_resource_start(a_priv->pci_device, SRAM_REGION),  					    pci_resource_len(a_priv->pci_device, SRAM_REGION));  		dev_dbg(board->gpib_dev, "%s: sram base address remapped to 0x%p\n", diff --git a/drivers/staging/gpib/agilent_82357a/Makefile b/drivers/staging/gpib/agilent_82357a/Makefile index 4a1d940fce2b..81a55c257a6e 100644 --- a/drivers/staging/gpib/agilent_82357a/Makefile +++ b/drivers/staging/gpib/agilent_82357a/Makefile @@ -1,4 +1,4 @@ -obj-m += agilent_82357a.o +obj-$(CONFIG_GPIB_AGILENT_82357A) += agilent_82357a.o diff --git a/drivers/staging/gpib/cb7210/Makefile b/drivers/staging/gpib/cb7210/Makefile index 22e0214fc17d..cda0725d6487 100644 --- a/drivers/staging/gpib/cb7210/Makefile +++ b/drivers/staging/gpib/cb7210/Makefile @@ -1,4 +1,4 @@  ccflags-$(CONFIG_GPIB_PCMCIA) := -DGPIB_PCMCIA -obj-m += cb7210.o +obj-$(CONFIG_GPIB_CB7210) += cb7210.o diff --git a/drivers/staging/gpib/cb7210/cb7210.c b/drivers/staging/gpib/cb7210/cb7210.c index 63df7f3eb3f3..59e41c97f518 100644 --- a/drivers/staging/gpib/cb7210/cb7210.c +++ b/drivers/staging/gpib/cb7210/cb7210.c @@ -971,12 +971,12 @@ int cb_pci_attach(gpib_board_t *board, const gpib_board_config_t *config)  	switch (cb_priv->pci_chip) {  	case PCI_CHIP_AMCC_S5933:  		cb_priv->amcc_iobase = pci_resource_start(cb_priv->pci_device, 0); -		nec_priv->iobase = (void *)(pci_resource_start(cb_priv->pci_device, 1)); +		nec_priv->iobase = pci_resource_start(cb_priv->pci_device, 1);  		cb_priv->fifo_iobase = pci_resource_start(cb_priv->pci_device, 2);  		break;  	case PCI_CHIP_QUANCOM: -		nec_priv->iobase = (void *)(pci_resource_start(cb_priv->pci_device, 0)); -		cb_priv->fifo_iobase = (unsigned long)nec_priv->iobase; +		nec_priv->iobase = pci_resource_start(cb_priv->pci_device, 0); +		cb_priv->fifo_iobase = nec_priv->iobase;  		break;  	default:  		pr_err("cb7210: bug! unhandled pci_chip=%i\n", cb_priv->pci_chip); @@ -1040,8 +1040,8 @@ int cb_isa_attach(gpib_board_t *board, const gpib_board_config_t *config)  		return retval;  	cb_priv = board->private_data;  	nec_priv = &cb_priv->nec7210_priv; -	if (request_region((unsigned long)config->ibbase, cb7210_iosize, "cb7210") == 0) { -		pr_err("gpib: ioports starting at 0x%p are already in use\n", config->ibbase); +	if (request_region(config->ibbase, cb7210_iosize, "cb7210") == 0) { +		pr_err("gpib: ioports starting at 0x%u are already in use\n", config->ibbase);  		return -EIO;  	}  	nec_priv->iobase = config->ibbase; @@ -1471,7 +1471,7 @@ int cb_pcmcia_attach(gpib_board_t *board, const gpib_board_config_t *config)  		       (unsigned long)curr_dev->resource[0]->start);  		return -EIO;  	} -	nec_priv->iobase = (void *)(unsigned long)curr_dev->resource[0]->start; +	nec_priv->iobase = curr_dev->resource[0]->start;  	cb_priv->fifo_iobase = curr_dev->resource[0]->start;  	if (request_irq(curr_dev->irq, cb7210_interrupt, IRQF_SHARED, diff --git a/drivers/staging/gpib/cb7210/cb7210.h b/drivers/staging/gpib/cb7210/cb7210.h index 4ad976de2b68..c17cb22585f7 100644 --- a/drivers/staging/gpib/cb7210/cb7210.h +++ b/drivers/staging/gpib/cb7210/cb7210.h @@ -113,9 +113,9 @@ enum hs_regs {  	HS_STATUS = 0x8,	/* HS_STATUS register */  }; -static inline unsigned long nec7210_iobase(const struct cb7210_priv *cb_priv) +static inline u32 nec7210_iobase(const struct cb7210_priv *cb_priv)  { -	return (unsigned long)(cb_priv->nec7210_priv.iobase); +	return cb_priv->nec7210_priv.iobase;  }  static inline int cb7210_page_in_bits(unsigned int page) diff --git a/drivers/staging/gpib/cec/Makefile b/drivers/staging/gpib/cec/Makefile index f4638628ff29..b7141e23d4e0 100644 --- a/drivers/staging/gpib/cec/Makefile +++ b/drivers/staging/gpib/cec/Makefile @@ -1,3 +1,3 @@ -obj-m += cec_gpib.o +obj-$(CONFIG_GPIB_CEC_PCI) += cec_gpib.o diff --git a/drivers/staging/gpib/cec/cec_gpib.c b/drivers/staging/gpib/cec/cec_gpib.c index 3dc933deb401..9c00a874468c 100644 --- a/drivers/staging/gpib/cec/cec_gpib.c +++ b/drivers/staging/gpib/cec/cec_gpib.c @@ -297,8 +297,8 @@ int cec_pci_attach(gpib_board_t *board, const gpib_board_config_t *config)  	cec_priv->plx_iobase = pci_resource_start(cec_priv->pci_device, 1);  	pr_info(" plx9050 base address 0x%lx\n", cec_priv->plx_iobase); -	nec_priv->iobase = (void *)(pci_resource_start(cec_priv->pci_device, 3)); -	pr_info(" nec7210 base address 0x%p\n", nec_priv->iobase); +	nec_priv->iobase = pci_resource_start(cec_priv->pci_device, 3); +	pr_info(" nec7210 base address 0x%x\n", nec_priv->iobase);  	isr_flags |= IRQF_SHARED;  	if (request_irq(cec_priv->pci_device->irq, cec_interrupt, isr_flags, "pci-gpib", board)) { diff --git a/drivers/staging/gpib/common/Makefile b/drivers/staging/gpib/common/Makefile index 0c4c77bea75b..460586edb574 100644 --- a/drivers/staging/gpib/common/Makefile +++ b/drivers/staging/gpib/common/Makefile @@ -1,5 +1,5 @@ -obj-m += gpib_common.o +obj-$(CONFIG_GPIB_COMMON) += gpib_common.o  gpib_common-objs := gpib_os.o iblib.o diff --git a/drivers/staging/gpib/common/gpib_os.c b/drivers/staging/gpib/common/gpib_os.c index 405237d8cb47..0962729d7dfe 100644 --- a/drivers/staging/gpib/common/gpib_os.c +++ b/drivers/staging/gpib/common/gpib_os.c @@ -116,56 +116,6 @@ int io_timed_out(gpib_board_t *board)  	return 0;  } -void writeb_wrapper(unsigned int value, void *address) -{ -	writeb(value, address); -}; -EXPORT_SYMBOL(writeb_wrapper); - -void writew_wrapper(unsigned int value, void *address) -{ -	writew(value, address); -}; -EXPORT_SYMBOL(writew_wrapper); - -unsigned int readb_wrapper(void *address) -{ -	return readb(address); -}; -EXPORT_SYMBOL(readb_wrapper); - -unsigned int readw_wrapper(void *address) -{ -	return readw(address); -}; -EXPORT_SYMBOL(readw_wrapper); - -#ifdef CONFIG_HAS_IOPORT -void outb_wrapper(unsigned int value, void *address) -{ -	outb(value, (unsigned long)(address)); -}; -EXPORT_SYMBOL(outb_wrapper); - -void outw_wrapper(unsigned int value, void *address) -{ -	outw(value, (unsigned long)(address)); -}; -EXPORT_SYMBOL(outw_wrapper); - -unsigned int inb_wrapper(void *address) -{ -	return inb((unsigned long)(address)); -}; -EXPORT_SYMBOL(inb_wrapper); - -unsigned int inw_wrapper(void *address) -{ -	return inw((unsigned long)(address)); -}; -EXPORT_SYMBOL(inw_wrapper); -#endif -  /* this is a function instead of a constant because of Suse   * defining HZ to be a function call to get_hz()   */ @@ -536,7 +486,7 @@ int dvrsp(gpib_board_t *board, unsigned int pad, int sad,  		return -1;  	} -	if (pad > MAX_GPIB_PRIMARY_ADDRESS || sad > MAX_GPIB_SECONDARY_ADDRESS) { +	if (pad > MAX_GPIB_PRIMARY_ADDRESS || sad > MAX_GPIB_SECONDARY_ADDRESS || sad < -1) {  		pr_err("gpib: bad address for serial poll");  		return -1;  	} @@ -1623,7 +1573,7 @@ static int iobase_ioctl(gpib_board_config_t *config, unsigned long arg)  	if (WARN_ON_ONCE(sizeof(void *) > sizeof(base_addr)))  		return -EFAULT; -	config->ibbase = (void *)(unsigned long)(base_addr); +	config->ibbase = base_addr;  	return 0;  } diff --git a/drivers/staging/gpib/eastwood/Makefile b/drivers/staging/gpib/eastwood/Makefile index c74056f959d0..384825195f77 100644 --- a/drivers/staging/gpib/eastwood/Makefile +++ b/drivers/staging/gpib/eastwood/Makefile @@ -1,3 +1,3 @@ -obj-m += fluke_gpib.o +obj-$(CONFIG_GPIB_FLUKE) += fluke_gpib.o diff --git a/drivers/staging/gpib/eastwood/fluke_gpib.c b/drivers/staging/gpib/eastwood/fluke_gpib.c index 3f938ab0c84d..5e59d38beb35 100644 --- a/drivers/staging/gpib/eastwood/fluke_gpib.c +++ b/drivers/staging/gpib/eastwood/fluke_gpib.c @@ -1011,12 +1011,12 @@ static int fluke_attach_impl(gpib_board_t *board, const gpib_board_config_t *con  	}  	e_priv->gpib_iomem_res = res; -	nec_priv->iobase = ioremap(e_priv->gpib_iomem_res->start, +	nec_priv->mmiobase = ioremap(e_priv->gpib_iomem_res->start,  				   resource_size(e_priv->gpib_iomem_res)); -	pr_info("gpib: iobase %lx remapped to %p, length=%d\n", -		(unsigned long)e_priv->gpib_iomem_res->start, -		nec_priv->iobase, (int)resource_size(e_priv->gpib_iomem_res)); -	if (!nec_priv->iobase) { +	pr_info("gpib: mmiobase %llx remapped to %p, length=%d\n", +		(u64)e_priv->gpib_iomem_res->start, +		nec_priv->mmiobase, (int)resource_size(e_priv->gpib_iomem_res)); +	if (!nec_priv->mmiobase) {  		dev_err(&fluke_gpib_pdev->dev, "Could not map I/O memory\n");  		return -ENOMEM;  	} @@ -1107,7 +1107,7 @@ void fluke_detach(gpib_board_t *board)  		gpib_free_pseudo_irq(board);  		nec_priv = &e_priv->nec7210_priv; -		if (nec_priv->iobase) { +		if (nec_priv->mmiobase) {  			fluke_paged_write_byte(e_priv, 0, ISR0_IMR0, ISR0_IMR0_PAGE);  			nec7210_board_reset(nec_priv, board);  		} diff --git a/drivers/staging/gpib/eastwood/fluke_gpib.h b/drivers/staging/gpib/eastwood/fluke_gpib.h index fcbd42f8f9af..4e2144d45270 100644 --- a/drivers/staging/gpib/eastwood/fluke_gpib.h +++ b/drivers/staging/gpib/eastwood/fluke_gpib.h @@ -72,7 +72,7 @@ static inline uint8_t fluke_read_byte_nolock(struct nec7210_priv *nec_priv,  {  	u8 retval; -	retval = readl(nec_priv->iobase + register_num * nec_priv->offset); +	retval = readl(nec_priv->mmiobase + register_num * nec_priv->offset);  	return retval;  } @@ -80,7 +80,7 @@ static inline uint8_t fluke_read_byte_nolock(struct nec7210_priv *nec_priv,  static inline void fluke_write_byte_nolock(struct nec7210_priv *nec_priv, uint8_t data,  					   int register_num)  { -	writel(data, nec_priv->iobase + register_num * nec_priv->offset); +	writel(data, nec_priv->mmiobase + register_num * nec_priv->offset);  }  static inline uint8_t fluke_paged_read_byte(struct fluke_priv *e_priv, diff --git a/drivers/staging/gpib/fmh_gpib/fmh_gpib.c b/drivers/staging/gpib/fmh_gpib/fmh_gpib.c index 62791db1c34a..0662b20a45e7 100644 --- a/drivers/staging/gpib/fmh_gpib/fmh_gpib.c +++ b/drivers/staging/gpib/fmh_gpib/fmh_gpib.c @@ -24,6 +24,8 @@  #include <linux/slab.h>  MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("GPIB Driver for fmh_gpib_core"); +MODULE_AUTHOR("Frank Mori Hess <fmh6jj@gmail.com>");  static irqreturn_t fmh_gpib_interrupt(int irq, void *arg);  static int fmh_gpib_attach_holdoff_all(gpib_board_t *board, const gpib_board_config_t *config); @@ -1419,15 +1421,14 @@ static int fmh_gpib_attach_impl(gpib_board_t *board, const gpib_board_config_t *  	}  	e_priv->gpib_iomem_res = res; -	nec_priv->iobase = ioremap(e_priv->gpib_iomem_res->start, +	nec_priv->mmiobase = ioremap(e_priv->gpib_iomem_res->start,  				   resource_size(e_priv->gpib_iomem_res)); -	if (!nec_priv->iobase) { +	if (!nec_priv->mmiobase) {  		dev_err(board->dev, "Could not map I/O memory for gpib\n");  		return -ENOMEM;  	} -	dev_info(board->dev, "iobase 0x%lx remapped to %p, length=%ld\n", -		 (unsigned long)e_priv->gpib_iomem_res->start, -		 nec_priv->iobase, (unsigned long)resource_size(e_priv->gpib_iomem_res)); +	dev_info(board->dev, "iobase %pr remapped to %p\n", +		 e_priv->gpib_iomem_res, nec_priv->mmiobase);  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dma_fifos");  	if (!res) { @@ -1507,14 +1508,14 @@ void fmh_gpib_detach(gpib_board_t *board)  			free_irq(e_priv->irq, board);  		if (e_priv->fifo_base)  			fifos_write(e_priv, 0, FIFO_CONTROL_STATUS_REG); -		if (nec_priv->iobase) { +		if (nec_priv->mmiobase) {  			write_byte(nec_priv, 0, ISR0_IMR0_REG);  			nec7210_board_reset(nec_priv, board);  		}  		if (e_priv->fifo_base)  			iounmap(e_priv->fifo_base); -		if (nec_priv->iobase) -			iounmap(nec_priv->iobase); +		if (nec_priv->mmiobase) +			iounmap(nec_priv->mmiobase);  		if (e_priv->dma_port_res) {  			release_mem_region(e_priv->dma_port_res->start,  					   resource_size(e_priv->dma_port_res)); @@ -1564,12 +1565,12 @@ static int fmh_gpib_pci_attach_impl(gpib_board_t *board, const gpib_board_config  	e_priv->gpib_iomem_res = &pci_device->resource[gpib_control_status_pci_resource_index];  	e_priv->dma_port_res =  &pci_device->resource[gpib_fifo_pci_resource_index]; -	nec_priv->iobase = ioremap(pci_resource_start(pci_device, +	nec_priv->mmiobase = ioremap(pci_resource_start(pci_device,  						      gpib_control_status_pci_resource_index),  				   pci_resource_len(pci_device,  						    gpib_control_status_pci_resource_index));  	dev_info(board->dev, "base address for gpib control/status registers remapped to 0x%p\n", -		 nec_priv->iobase); +		 nec_priv->mmiobase);  	if (e_priv->dma_port_res->flags & IORESOURCE_MEM) {  		e_priv->fifo_base = ioremap(pci_resource_start(pci_device, @@ -1632,14 +1633,14 @@ void fmh_gpib_pci_detach(gpib_board_t *board)  			free_irq(e_priv->irq, board);  		if (e_priv->fifo_base)  			fifos_write(e_priv, 0, FIFO_CONTROL_STATUS_REG); -		if (nec_priv->iobase) { +		if (nec_priv->mmiobase) {  			write_byte(nec_priv, 0, ISR0_IMR0_REG);  			nec7210_board_reset(nec_priv, board);  		}  		if (e_priv->fifo_base)  			iounmap(e_priv->fifo_base); -		if (nec_priv->iobase) -			iounmap(nec_priv->iobase); +		if (nec_priv->mmiobase) +			iounmap(nec_priv->mmiobase);  		if (e_priv->dma_port_res || e_priv->gpib_iomem_res)  			pci_release_regions(to_pci_dev(board->dev));  		if (board->dev) diff --git a/drivers/staging/gpib/fmh_gpib/fmh_gpib.h b/drivers/staging/gpib/fmh_gpib/fmh_gpib.h index 43bfc89d2a6f..60b1bd6d3c15 100644 --- a/drivers/staging/gpib/fmh_gpib/fmh_gpib.h +++ b/drivers/staging/gpib/fmh_gpib/fmh_gpib.h @@ -127,13 +127,13 @@ static const unsigned int fifo_max_burst_length_mask = 0x00ff;  static inline uint8_t gpib_cs_read_byte(struct nec7210_priv *nec_priv,  					unsigned int register_num)  { -	return readb(nec_priv->iobase + register_num * nec_priv->offset); +	return readb(nec_priv->mmiobase + register_num * nec_priv->offset);  }  static inline void gpib_cs_write_byte(struct nec7210_priv *nec_priv, uint8_t data,  				      unsigned int register_num)  { -	writeb(data, nec_priv->iobase + register_num * nec_priv->offset); +	writeb(data, nec_priv->mmiobase + register_num * nec_priv->offset);  }  static inline uint16_t fifos_read(struct fmh_priv *fmh_priv, int register_num) diff --git a/drivers/staging/gpib/gpio/Makefile b/drivers/staging/gpib/gpio/Makefile index a31ded6e5924..00ea52abdda7 100644 --- a/drivers/staging/gpib/gpio/Makefile +++ b/drivers/staging/gpib/gpio/Makefile @@ -1,4 +1,4 @@ -obj-m += gpib_bitbang.o +obj-$(CONFIG_GPIB_GPIO) += gpib_bitbang.o diff --git a/drivers/staging/gpib/gpio/gpib_bitbang.c b/drivers/staging/gpib/gpio/gpib_bitbang.c index a2d562cbd65b..23550502e012 100644 --- a/drivers/staging/gpib/gpio/gpib_bitbang.c +++ b/drivers/staging/gpib/gpio/gpib_bitbang.c @@ -315,7 +315,7 @@ struct bb_priv {  	enum listener_function_state listener_state;  }; -inline long usec_diff(struct timespec64 *a, struct timespec64 *b); +static inline long usec_diff(struct timespec64 *a, struct timespec64 *b);  static void bb_buffer_print(unsigned char *buffer, size_t length, int cmd, int eoi);  static void set_data_lines(u8 byte);  static u8 get_data_lines(void); diff --git a/drivers/staging/gpib/hp_82335/Makefile b/drivers/staging/gpib/hp_82335/Makefile index 8b7a552e9355..305ce44ee48a 100644 --- a/drivers/staging/gpib/hp_82335/Makefile +++ b/drivers/staging/gpib/hp_82335/Makefile @@ -1,4 +1,4 @@ -obj-m += hp82335.o +obj-$(CONFIG_GPIB_HP82335) += hp82335.o diff --git a/drivers/staging/gpib/hp_82335/hp82335.c b/drivers/staging/gpib/hp_82335/hp82335.c index 40afe42aea47..ea78143c7ab6 100644 --- a/drivers/staging/gpib/hp_82335/hp82335.c +++ b/drivers/staging/gpib/hp_82335/hp82335.c @@ -9,6 +9,7 @@   */  #include "hp82335.h" +#include <linux/io.h>  #include <linux/ioport.h>  #include <linux/sched.h>  #include <linux/module.h> @@ -233,7 +234,7 @@ static void hp82335_clear_interrupt(struct hp82335_priv *hp_priv)  {  	struct tms9914_priv *tms_priv = &hp_priv->tms9914_priv; -	writeb(0, tms_priv->iobase + HPREG_INTR_CLEAR); +	writeb(0, tms_priv->mmiobase + HPREG_INTR_CLEAR);  }  int hp82335_attach(gpib_board_t *board, const gpib_board_config_t *config) @@ -241,7 +242,7 @@ int hp82335_attach(gpib_board_t *board, const gpib_board_config_t *config)  	struct hp82335_priv *hp_priv;  	struct tms9914_priv *tms_priv;  	int retval; -	const unsigned long upper_iomem_base = (unsigned long)config->ibbase + hp82335_rom_size; +	const unsigned long upper_iomem_base = config->ibbase + hp82335_rom_size;  	board->status = 0; @@ -253,7 +254,7 @@ int hp82335_attach(gpib_board_t *board, const gpib_board_config_t *config)  	tms_priv->write_byte = hp82335_write_byte;  	tms_priv->offset = 1; -	switch ((unsigned long)(config->ibbase)) { +	switch (config->ibbase) {  	case 0xc4000:  	case 0xc8000:  	case 0xcc000: @@ -271,7 +272,7 @@ int hp82335_attach(gpib_board_t *board, const gpib_board_config_t *config)  	case 0xfc000:  		break;  	default: -		pr_err("hp82335: invalid base io address 0x%p\n", config->ibbase); +		pr_err("hp82335: invalid base io address 0x%u\n", config->ibbase);  		return -EINVAL;  	}  	if (!request_mem_region(upper_iomem_base, hp82335_upper_iomem_size, "hp82335")) { @@ -280,9 +281,9 @@ int hp82335_attach(gpib_board_t *board, const gpib_board_config_t *config)  		return -EBUSY;  	}  	hp_priv->raw_iobase = upper_iomem_base; -	tms_priv->iobase = ioremap(upper_iomem_base, hp82335_upper_iomem_size); +	tms_priv->mmiobase = ioremap(upper_iomem_base, hp82335_upper_iomem_size);  	pr_info("hp82335: upper half of 82335 iomem region 0x%lx remapped to 0x%p\n", -		hp_priv->raw_iobase, tms_priv->iobase); +		hp_priv->raw_iobase, tms_priv->mmiobase);  	retval = request_irq(config->ibirq, hp82335_interrupt, 0, "hp82335", board);  	if (retval) { @@ -296,7 +297,7 @@ int hp82335_attach(gpib_board_t *board, const gpib_board_config_t *config)  	hp82335_clear_interrupt(hp_priv); -	writeb(INTR_ENABLE, tms_priv->iobase + HPREG_CCR); +	writeb(INTR_ENABLE, tms_priv->mmiobase + HPREG_CCR);  	tms9914_online(board, tms_priv); @@ -312,10 +313,10 @@ void hp82335_detach(gpib_board_t *board)  		tms_priv = &hp_priv->tms9914_priv;  		if (hp_priv->irq)  			free_irq(hp_priv->irq, board); -		if (tms_priv->iobase) { -			writeb(0, tms_priv->iobase + HPREG_CCR); +		if (tms_priv->mmiobase) { +			writeb(0, tms_priv->mmiobase + HPREG_CCR);  			tms9914_board_reset(tms_priv); -			iounmap((void *)tms_priv->iobase); +			iounmap(tms_priv->mmiobase);  		}  		if (hp_priv->raw_iobase)  			release_mem_region(hp_priv->raw_iobase, hp82335_upper_iomem_size); diff --git a/drivers/staging/gpib/hp_82341/Makefile b/drivers/staging/gpib/hp_82341/Makefile index 1fe7db4f8ca4..21367310a17e 100644 --- a/drivers/staging/gpib/hp_82341/Makefile +++ b/drivers/staging/gpib/hp_82341/Makefile @@ -1,2 +1,2 @@ -obj-m += hp_82341.o +obj-$(CONFIG_GPIB_HP82341) += hp_82341.o diff --git a/drivers/staging/gpib/hp_82341/hp_82341.c b/drivers/staging/gpib/hp_82341/hp_82341.c index 8ad1c885a9fb..71d481e88bd9 100644 --- a/drivers/staging/gpib/hp_82341/hp_82341.c +++ b/drivers/staging/gpib/hp_82341/hp_82341.c @@ -473,12 +473,12 @@ void hp_82341_free_private(gpib_board_t *board)  static uint8_t hp_82341_read_byte(struct tms9914_priv *priv, unsigned int register_num)  { -	return inb((unsigned long)(priv->iobase) + register_num); +	return inb(priv->iobase + register_num);  }  static void hp_82341_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)  { -	outb(data, (unsigned long)(priv->iobase) + register_num); +	outb(data, priv->iobase + register_num);  }  static int hp_82341_find_isapnp_board(struct pnp_dev **dev) @@ -682,8 +682,8 @@ int hp_82341_attach(gpib_board_t *board, const gpib_board_config_t *config)  {  	struct hp_82341_priv *hp_priv;  	struct tms9914_priv *tms_priv; -	unsigned long start_addr; -	void *iobase; +	u32 start_addr; +	u32 iobase;  	int irq;  	int i;  	int retval; @@ -704,7 +704,7 @@ int hp_82341_attach(gpib_board_t *board, const gpib_board_config_t *config)  		if (retval < 0)  			return retval;  		hp_priv->pnp_dev = dev; -		iobase = (void *)(pnp_port_start(dev, 0)); +		iobase = pnp_port_start(dev, 0);  		irq = pnp_irq(dev, 0);  		hp_priv->hw_version = HW_VERSION_82341D;  		hp_priv->io_region_offset = 0x8; @@ -714,9 +714,9 @@ int hp_82341_attach(gpib_board_t *board, const gpib_board_config_t *config)  		hp_priv->hw_version = HW_VERSION_82341C;  		hp_priv->io_region_offset = 0x400;  	} -	pr_info("hp_82341: base io 0x%p\n", iobase); +	pr_info("hp_82341: base io 0x%u\n", iobase);  	for (i = 0; i < hp_82341_num_io_regions; ++i) { -		start_addr = (unsigned long)(iobase) + i * hp_priv->io_region_offset; +		start_addr = iobase + i * hp_priv->io_region_offset;  		if (!request_region(start_addr, hp_82341_region_iosize, "hp_82341")) {  			pr_err("hp_82341: failed to allocate io ports 0x%lx-0x%lx\n",  			       start_addr, @@ -725,7 +725,7 @@ int hp_82341_attach(gpib_board_t *board, const gpib_board_config_t *config)  		}  		hp_priv->iobase[i] = start_addr;  	} -	tms_priv->iobase = (void *)(hp_priv->iobase[2]); +	tms_priv->iobase = hp_priv->iobase[2];  	if (hp_priv->hw_version == HW_VERSION_82341D) {  		retval = isapnp_cfg_begin(hp_priv->pnp_dev->card->number,  					  hp_priv->pnp_dev->number); diff --git a/drivers/staging/gpib/include/gpibP.h b/drivers/staging/gpib/include/gpibP.h index 5fc42b645ab7..b97da577ba33 100644 --- a/drivers/staging/gpib/include/gpibP.h +++ b/drivers/staging/gpib/include/gpibP.h @@ -16,6 +16,7 @@  #include <linux/fs.h>  #include <linux/interrupt.h> +#include <linux/io.h>  void gpib_register_driver(gpib_interface_t *interface, struct module *mod);  void gpib_unregister_driver(gpib_interface_t *interface); @@ -35,16 +36,5 @@ extern gpib_board_t board_array[GPIB_MAX_NUM_BOARDS];  extern struct list_head registered_drivers; -#include <linux/io.h> - -void writeb_wrapper(unsigned int value, void *address); -unsigned int readb_wrapper(void *address); -void outb_wrapper(unsigned int value, void *address); -unsigned int inb_wrapper(void *address); -void writew_wrapper(unsigned int value, void *address); -unsigned int readw_wrapper(void *address); -void outw_wrapper(unsigned int value, void *address); -unsigned int inw_wrapper(void *address); -  #endif	// _GPIB_P_H diff --git a/drivers/staging/gpib/include/gpib_types.h b/drivers/staging/gpib/include/gpib_types.h index ee2643da6d71..b41781a55a60 100644 --- a/drivers/staging/gpib/include/gpib_types.h +++ b/drivers/staging/gpib/include/gpib_types.h @@ -31,7 +31,8 @@ typedef struct {  	void *init_data;  	int init_data_length;  	/* IO base address to use for non-pnp cards (set by core, driver should make local copy) */ -	void *ibbase; +	u32 ibbase; +	void __iomem *mmibbase;  	/* IRQ to use for non-pnp cards (set by core, driver should make local copy) */  	unsigned int ibirq;  	/* dma channel to use for non-pnp cards (set by core, driver should make local copy) */ diff --git a/drivers/staging/gpib/include/nec7210.h b/drivers/staging/gpib/include/nec7210.h index c00aba4ce846..ca998c4a84bf 100644 --- a/drivers/staging/gpib/include/nec7210.h +++ b/drivers/staging/gpib/include/nec7210.h @@ -18,7 +18,10 @@  /* struct used to provide variables local to a nec7210 chip */  struct nec7210_priv { -	void *iobase; +#ifdef CONFIG_HAS_IOPORT +	u32 iobase; +#endif +	void __iomem *mmiobase;  	unsigned int offset;	// offset between successive nec7210 io addresses  	unsigned int dma_channel;  	u8 *dma_buffer; diff --git a/drivers/staging/gpib/include/tms9914.h b/drivers/staging/gpib/include/tms9914.h index 456b488212d2..d8c8d1c9b131 100644 --- a/drivers/staging/gpib/include/tms9914.h +++ b/drivers/staging/gpib/include/tms9914.h @@ -20,7 +20,10 @@ enum tms9914_holdoff_mode {  /* struct used to provide variables local to a tms9914 chip */  struct tms9914_priv { -	void *iobase; +#ifdef CONFIG_HAS_IOPORT +	u32 iobase; +#endif +	void __iomem *mmiobase;  	unsigned int offset;	// offset between successive tms9914 io addresses  	unsigned int dma_channel;  	// software copy of bits written to interrupt mask registers diff --git a/drivers/staging/gpib/ines/Makefile b/drivers/staging/gpib/ines/Makefile index cdcaa59a4e39..6b6e480fd811 100644 --- a/drivers/staging/gpib/ines/Makefile +++ b/drivers/staging/gpib/ines/Makefile @@ -1,4 +1,4 @@  ccflags-$(CONFIG_GPIB_PCMCIA) := -DGPIB_PCMCIA -obj-m += ines_gpib.o +obj-$(CONFIG_GPIB_INES) += ines_gpib.o diff --git a/drivers/staging/gpib/ines/ines.h b/drivers/staging/gpib/ines/ines.h index 7e8302619998..eed038fd3f28 100644 --- a/drivers/staging/gpib/ines/ines.h +++ b/drivers/staging/gpib/ines/ines.h @@ -83,14 +83,14 @@ void ines_set_xfer_counter(struct ines_priv *priv, unsigned int count);  /* inb/outb wrappers */  static inline unsigned int ines_inb(struct ines_priv *priv, unsigned int register_number)  { -	return inb((unsigned long)(priv->nec7210_priv.iobase) + +	return inb(priv->nec7210_priv.iobase +  		   register_number * priv->nec7210_priv.offset);  }  static inline void ines_outb(struct ines_priv *priv, unsigned int value,  			     unsigned int register_number)  { -	outb(value, (unsigned long)(priv->nec7210_priv.iobase) + +	outb(value, priv->nec7210_priv.iobase +  	     register_number * priv->nec7210_priv.offset);  } diff --git a/drivers/staging/gpib/ines/ines_gpib.c b/drivers/staging/gpib/ines/ines_gpib.c index 9d8387c3bf01..e18455ba842f 100644 --- a/drivers/staging/gpib/ines/ines_gpib.c +++ b/drivers/staging/gpib/ines/ines_gpib.c @@ -273,10 +273,10 @@ irqreturn_t ines_pci_interrupt(int irq, void *arg)  	struct nec7210_priv *nec_priv = &priv->nec7210_priv;  	if (priv->pci_chip_type == PCI_CHIP_QUANCOM) { -		if ((inb((unsigned long)nec_priv->iobase + +		if ((inb(nec_priv->iobase +  			 QUANCOM_IRQ_CONTROL_STATUS_REG) &  		     QUANCOM_IRQ_ASSERTED_BIT)) -			outb(QUANCOM_IRQ_ENABLE_BIT, (unsigned long)(nec_priv->iobase) + +			outb(QUANCOM_IRQ_ENABLE_BIT, nec_priv->iobase +  			     QUANCOM_IRQ_CONTROL_STATUS_REG);  	} @@ -780,8 +780,8 @@ static int ines_common_pci_attach(gpib_board_t *board, const gpib_board_config_t  	if (pci_request_regions(ines_priv->pci_device, "ines-gpib"))  		return -1; -	nec_priv->iobase = (void *)(pci_resource_start(ines_priv->pci_device, -						       found_id.gpib_region)); +	nec_priv->iobase = pci_resource_start(ines_priv->pci_device, +					      found_id.gpib_region);  	ines_priv->pci_chip_type = found_id.pci_chip_type;  	nec_priv->offset = found_id.io_offset; @@ -840,7 +840,7 @@ static int ines_common_pci_attach(gpib_board_t *board, const gpib_board_config_t  	}  	break;  	case PCI_CHIP_QUANCOM: -		outb(QUANCOM_IRQ_ENABLE_BIT, (unsigned long)(nec_priv->iobase) + +		outb(QUANCOM_IRQ_ENABLE_BIT, nec_priv->iobase +  		     QUANCOM_IRQ_CONTROL_STATUS_REG);  		break;  	case PCI_CHIP_QUICKLOGIC5030: @@ -899,8 +899,8 @@ int ines_isa_attach(gpib_board_t *board, const gpib_board_config_t *config)  	ines_priv = board->private_data;  	nec_priv = &ines_priv->nec7210_priv; -	if (!request_region((unsigned long)config->ibbase, ines_isa_iosize, "ines_gpib")) { -		pr_err("ines_gpib: ioports at 0x%p already in use\n", config->ibbase); +	if (!request_region(config->ibbase, ines_isa_iosize, "ines_gpib")) { +		pr_err("ines_gpib: ioports at 0x%x already in use\n", config->ibbase);  		return -1;  	}  	nec_priv->iobase = config->ibbase; @@ -931,7 +931,7 @@ void ines_pci_detach(gpib_board_t *board)  				break;  			case PCI_CHIP_QUANCOM:  				if (nec_priv->iobase) -					outb(0, (unsigned long)(nec_priv->iobase) + +					outb(0, nec_priv->iobase +  					     QUANCOM_IRQ_CONTROL_STATUS_REG);  				break;  			default: @@ -960,7 +960,7 @@ void ines_isa_detach(gpib_board_t *board)  			free_irq(ines_priv->irq, board);  		if (nec_priv->iobase) {  			nec7210_board_reset(nec_priv, board); -			release_region((unsigned long)(nec_priv->iobase), ines_isa_iosize); +			release_region(nec_priv->iobase, ines_isa_iosize);  		}  	}  	ines_free_private(board); @@ -1355,7 +1355,7 @@ int ines_common_pcmcia_attach(gpib_board_t *board)  		return -1;  	} -	nec_priv->iobase = (void *)(unsigned long)curr_dev->resource[0]->start; +	nec_priv->iobase = curr_dev->resource[0]->start;  	nec7210_board_reset(nec_priv, board); @@ -1410,7 +1410,7 @@ void ines_pcmcia_detach(gpib_board_t *board)  			free_irq(ines_priv->irq, board);  		if (nec_priv->iobase) {  			nec7210_board_reset(nec_priv, board); -			release_region((unsigned long)(nec_priv->iobase), ines_pcmcia_iosize); +			release_region(nec_priv->iobase, ines_pcmcia_iosize);  		}  	}  	ines_free_private(board); diff --git a/drivers/staging/gpib/lpvo_usb_gpib/Makefile b/drivers/staging/gpib/lpvo_usb_gpib/Makefile index 137511acce63..360553488e6d 100644 --- a/drivers/staging/gpib/lpvo_usb_gpib/Makefile +++ b/drivers/staging/gpib/lpvo_usb_gpib/Makefile @@ -1,3 +1,3 @@ -obj-m += lpvo_usb_gpib.o +obj-$(CONFIG_GPIB_LPVO) += lpvo_usb_gpib.o diff --git a/drivers/staging/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c b/drivers/staging/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c index 796c3a5be545..93a05c792816 100644 --- a/drivers/staging/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c +++ b/drivers/staging/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c @@ -99,8 +99,8 @@ module_param(debug, int, 0644);  #define USB_GPIB_DEBUG_ON    "\nIBDE\xAA\n"  #define USB_GPIB_SET_LISTEN  "\nIBDT0\n"  #define USB_GPIB_SET_TALK    "\nIBDT1\n" -#define USB_GPIB_SET_LINES   "\nIBDC\n" -#define USB_GPIB_SET_DATA    "\nIBDM\n" +#define USB_GPIB_SET_LINES   "\nIBDC.\n" +#define USB_GPIB_SET_DATA    "\nIBDM.\n"  #define USB_GPIB_READ_LINES  "\nIBD?C\n"  #define USB_GPIB_READ_DATA   "\nIBD?M\n"  #define USB_GPIB_READ_BUS    "\nIBD??\n" @@ -210,7 +210,7 @@ static int skel_do_release(gpib_board_t *);   *		 (unix time in sec and NANOsec)   */ -inline int usec_diff(struct timespec64 *a, struct timespec64 *b) +static inline int usec_diff(struct timespec64 *a, struct timespec64 *b)  {  	return ((a->tv_sec - b->tv_sec) * 1000000 +  		(a->tv_nsec - b->tv_nsec) / 1000); @@ -436,7 +436,7 @@ static void set_timeout(gpib_board_t *board)  static int usb_gpib_attach(gpib_board_t *board, const gpib_board_config_t *config)  {  	int retval, j; -	int base = (long)config->ibbase; +	u32 base = config->ibbase;  	char *device_path;  	int match;  	struct usb_device *udev; @@ -589,7 +589,7 @@ static int usb_gpib_command(gpib_board_t *board,  			    size_t *bytes_written)  {  	int i, retval; -	char command[6] = "IBc\n"; +	char command[6] = "IBc.\n";  	DIA_LOG(1, "enter %p\n", board); @@ -608,7 +608,7 @@ static int usb_gpib_command(gpib_board_t *board,  }  /** - * disable_eos() - Disable END on eos byte (END on EOI only) + * usb_gpib_disable_eos() - Disable END on eos byte (END on EOI only)   *   * @board:    the gpib_board data area for this gpib interface   * @@ -624,7 +624,7 @@ static void usb_gpib_disable_eos(gpib_board_t *board)  }  /** - * enable_eos() - Enable END for reads when eos byte is received. + * usb_gpib_enable_eos() - Enable END for reads when eos byte is received.   *   * @board:    the gpib_board data area for this gpib interface   * @eos_byte: the 'eos' byte @@ -647,7 +647,7 @@ static int usb_gpib_enable_eos(gpib_board_t *board,  }  /** - * go_to_standby() - De-assert ATN + * usb_gpib_go_to_standby() - De-assert ATN   *   * @board:    the gpib_board data area for this gpib interface   */ @@ -664,7 +664,7 @@ static int usb_gpib_go_to_standby(gpib_board_t *board)  }  /** - * interface_clear() - Assert or de-assert IFC + * usb_gpib_interface_clear() - Assert or de-assert IFC   *   * @board:    the gpib_board data area for this gpib interface   * assert:    1: assert IFC;  0: de-assert IFC @@ -901,7 +901,7 @@ static int usb_gpib_read(gpib_board_t *board,  		} else {  			/* we are in the closing <DLE><ETX> sequence */ - +			c = nc;  			if (c == ETX) {  				c = one_char(board, &b);  				if (c == ACK) { diff --git a/drivers/staging/gpib/nec7210/Makefile b/drivers/staging/gpib/nec7210/Makefile index 8d4d90f21109..64330f2e89d1 100644 --- a/drivers/staging/gpib/nec7210/Makefile +++ b/drivers/staging/gpib/nec7210/Makefile @@ -1,4 +1,4 @@ -obj-m += nec7210.o +obj-$(CONFIG_GPIB_NEC7210) += nec7210.o diff --git a/drivers/staging/gpib/nec7210/nec7210.c b/drivers/staging/gpib/nec7210/nec7210.c index 1d9951035497..c9a837fad96e 100644 --- a/drivers/staging/gpib/nec7210/nec7210.c +++ b/drivers/staging/gpib/nec7210/nec7210.c @@ -1035,7 +1035,7 @@ EXPORT_SYMBOL(nec7210_board_online);  /* wrappers for io */  uint8_t nec7210_ioport_read_byte(struct nec7210_priv *priv, unsigned int register_num)  { -	return inb((unsigned long)(priv->iobase) + register_num * priv->offset); +	return inb(priv->iobase + register_num * priv->offset);  }  EXPORT_SYMBOL(nec7210_ioport_read_byte); @@ -1047,7 +1047,7 @@ void nec7210_ioport_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned  		 */  		nec7210_locking_ioport_write_byte(priv, data, register_num);  	else -		outb(data, (unsigned long)(priv->iobase) + register_num * priv->offset); +		outb(data, priv->iobase + register_num * priv->offset);  }  EXPORT_SYMBOL(nec7210_ioport_write_byte); @@ -1058,7 +1058,7 @@ uint8_t nec7210_locking_ioport_read_byte(struct nec7210_priv *priv, unsigned int  	unsigned long flags;  	spin_lock_irqsave(&priv->register_page_lock, flags); -	retval = inb((unsigned long)(priv->iobase) + register_num * priv->offset); +	retval = inb(priv->iobase + register_num * priv->offset);  	spin_unlock_irqrestore(&priv->register_page_lock, flags);  	return retval;  } @@ -1072,7 +1072,7 @@ void nec7210_locking_ioport_write_byte(struct nec7210_priv *priv, uint8_t data,  	spin_lock_irqsave(&priv->register_page_lock, flags);  	if (register_num == AUXMR)  		udelay(1); -	outb(data, (unsigned long)(priv->iobase) + register_num * priv->offset); +	outb(data, priv->iobase + register_num * priv->offset);  	spin_unlock_irqrestore(&priv->register_page_lock, flags);  }  EXPORT_SYMBOL(nec7210_locking_ioport_write_byte); @@ -1080,7 +1080,7 @@ EXPORT_SYMBOL(nec7210_locking_ioport_write_byte);  uint8_t nec7210_iomem_read_byte(struct nec7210_priv *priv, unsigned int register_num)  { -	return readb(priv->iobase + register_num * priv->offset); +	return readb(priv->mmiobase + register_num * priv->offset);  }  EXPORT_SYMBOL(nec7210_iomem_read_byte); @@ -1092,7 +1092,7 @@ void nec7210_iomem_write_byte(struct nec7210_priv *priv, uint8_t data, unsigned  		 */  		nec7210_locking_iomem_write_byte(priv, data, register_num);  	else -		writeb(data, priv->iobase + register_num * priv->offset); +		writeb(data, priv->mmiobase + register_num * priv->offset);  }  EXPORT_SYMBOL(nec7210_iomem_write_byte); @@ -1102,7 +1102,7 @@ uint8_t nec7210_locking_iomem_read_byte(struct nec7210_priv *priv, unsigned int  	unsigned long flags;  	spin_lock_irqsave(&priv->register_page_lock, flags); -	retval = readb(priv->iobase + register_num * priv->offset); +	retval = readb(priv->mmiobase + register_num * priv->offset);  	spin_unlock_irqrestore(&priv->register_page_lock, flags);  	return retval;  } @@ -1116,7 +1116,7 @@ void nec7210_locking_iomem_write_byte(struct nec7210_priv *priv, uint8_t data,  	spin_lock_irqsave(&priv->register_page_lock, flags);  	if (register_num == AUXMR)  		udelay(1); -	writeb(data, priv->iobase + register_num * priv->offset); +	writeb(data, priv->mmiobase + register_num * priv->offset);  	spin_unlock_irqrestore(&priv->register_page_lock, flags);  }  EXPORT_SYMBOL(nec7210_locking_iomem_write_byte); diff --git a/drivers/staging/gpib/ni_usb/Makefile b/drivers/staging/gpib/ni_usb/Makefile index e22b3b21a62c..469c5d16add3 100644 --- a/drivers/staging/gpib/ni_usb/Makefile +++ b/drivers/staging/gpib/ni_usb/Makefile @@ -1,4 +1,4 @@ -obj-m += ni_usb_gpib.o +obj-$(CONFIG_GPIB_NI_USB) += ni_usb_gpib.o diff --git a/drivers/staging/gpib/pc2/Makefile b/drivers/staging/gpib/pc2/Makefile index 8148425e0f87..481ee4296e1b 100644 --- a/drivers/staging/gpib/pc2/Makefile +++ b/drivers/staging/gpib/pc2/Makefile @@ -1,5 +1,5 @@ -obj-m += pc2_gpib.o +obj-$(CONFIG_GPIB_PC2) += pc2_gpib.o diff --git a/drivers/staging/gpib/pc2/pc2_gpib.c b/drivers/staging/gpib/pc2/pc2_gpib.c index 7b3b34f47341..d22af25125b1 100644 --- a/drivers/staging/gpib/pc2/pc2_gpib.c +++ b/drivers/staging/gpib/pc2/pc2_gpib.c @@ -426,7 +426,7 @@ int pc2_attach(gpib_board_t *board, const gpib_board_config_t *config)  	nec_priv = &pc2_priv->nec7210_priv;  	nec_priv->offset = pc2_reg_offset; -	if (request_region((unsigned long)config->ibbase, pc2_iosize, "pc2") == 0) { +	if (request_region(config->ibbase, pc2_iosize, "pc2") == 0) {  		pr_err("gpib: ioports are already in use\n");  		return -1;  	} @@ -471,7 +471,7 @@ void pc2_detach(gpib_board_t *board)  			free_irq(pc2_priv->irq, board);  		if (nec_priv->iobase) {  			nec7210_board_reset(nec_priv, board); -			release_region((unsigned long)(nec_priv->iobase), pc2_iosize); +			release_region(nec_priv->iobase, pc2_iosize);  		}  		if (nec_priv->dma_buffer) {  			dma_free_coherent(board->dev, nec_priv->dma_buffer_length, @@ -498,14 +498,14 @@ static int pc2a_common_attach(gpib_board_t *board, const gpib_board_config_t *co  	nec_priv = &pc2_priv->nec7210_priv;  	nec_priv->offset = pc2a_reg_offset; -	switch ((unsigned long)(config->ibbase)) { +	switch (config->ibbase) {  	case 0x02e1:  	case 0x22e1:  	case 0x42e1:  	case 0x62e1:  		break;  	default: -		pr_err("PCIIa base range invalid, must be one of 0x[0246]2e1, but is 0x%p\n", +		pr_err("PCIIa base range invalid, must be one of 0x[0246]2e1, but is 0x%d\n",  		       config->ibbase);  		return -1;  	} @@ -522,7 +522,7 @@ static int pc2a_common_attach(gpib_board_t *board, const gpib_board_config_t *co  	unsigned int err = 0;  	for (i = 0; i < num_registers; i++) { -		if (check_region((unsigned long)config->ibbase + i * pc2a_reg_offset, 1)) +		if (check_region(config->ibbase + i * pc2a_reg_offset, 1))  			err++;  	}  	if (config->ibirq && check_region(pc2a_clear_intr_iobase + config->ibirq, 1)) @@ -533,11 +533,11 @@ static int pc2a_common_attach(gpib_board_t *board, const gpib_board_config_t *co  	}  #endif  	for (i = 0; i < num_registers; i++) { -		if (!request_region((unsigned long)config->ibbase + +		if (!request_region(config->ibbase +  					i * pc2a_reg_offset, 1, "pc2a")) {  			pr_err("gpib: ioports are already in use");  			for (j = 0; j < i; j++) -				release_region((unsigned long)(config->ibbase) + +				release_region(config->ibbase +  					j * pc2a_reg_offset, 1);  			return -1;  		} @@ -608,7 +608,7 @@ static void pc2a_common_detach(gpib_board_t *board, unsigned int num_registers)  		if (nec_priv->iobase) {  			nec7210_board_reset(nec_priv, board);  			for (i = 0; i < num_registers; i++) -				release_region((unsigned long)nec_priv->iobase + +				release_region(nec_priv->iobase +  					       i * pc2a_reg_offset, 1);  		}  		if (pc2_priv->clear_intr_addr) diff --git a/drivers/staging/gpib/tms9914/Makefile b/drivers/staging/gpib/tms9914/Makefile index 81b7e3cf104c..4705ab07f413 100644 --- a/drivers/staging/gpib/tms9914/Makefile +++ b/drivers/staging/gpib/tms9914/Makefile @@ -1,5 +1,5 @@ -obj-m += tms9914.o +obj-$(CONFIG_GPIB_TMS9914) += tms9914.o diff --git a/drivers/staging/gpib/tms9914/tms9914.c b/drivers/staging/gpib/tms9914/tms9914.c index 152b243b845b..ec8e1d4d762f 100644 --- a/drivers/staging/gpib/tms9914/tms9914.c +++ b/drivers/staging/gpib/tms9914/tms9914.c @@ -866,14 +866,14 @@ EXPORT_SYMBOL_GPL(tms9914_online);  // wrapper for inb  uint8_t tms9914_ioport_read_byte(struct tms9914_priv *priv, unsigned int register_num)  { -	return inb((unsigned long)(priv->iobase) + register_num * priv->offset); +	return inb(priv->iobase + register_num * priv->offset);  }  EXPORT_SYMBOL_GPL(tms9914_ioport_read_byte);  // wrapper for outb  void tms9914_ioport_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)  { -	outb(data, (unsigned long)(priv->iobase) + register_num * priv->offset); +	outb(data, priv->iobase + register_num * priv->offset);  	if (register_num == AUXCR)  		udelay(1);  } @@ -883,14 +883,14 @@ EXPORT_SYMBOL_GPL(tms9914_ioport_write_byte);  // wrapper for readb  uint8_t tms9914_iomem_read_byte(struct tms9914_priv *priv, unsigned int register_num)  { -	return readb(priv->iobase + register_num * priv->offset); +	return readb(priv->mmiobase + register_num * priv->offset);  }  EXPORT_SYMBOL_GPL(tms9914_iomem_read_byte);  // wrapper for writeb  void tms9914_iomem_write_byte(struct tms9914_priv *priv, uint8_t data, unsigned int register_num)  { -	writeb(data, priv->iobase + register_num * priv->offset); +	writeb(data, priv->mmiobase + register_num * priv->offset);  	if (register_num == AUXCR)  		udelay(1);  } diff --git a/drivers/staging/gpib/tnt4882/Makefile b/drivers/staging/gpib/tnt4882/Makefile index f767c990db7a..a3c3fb96d5ed 100644 --- a/drivers/staging/gpib/tnt4882/Makefile +++ b/drivers/staging/gpib/tnt4882/Makefile @@ -1,5 +1,5 @@  ccflags-$(CONFIG_GPIB_PCMCIA) := -DGPIB_PCMCIA -obj-m += tnt4882.o +obj-$(CONFIG_GPIB_NI_PCI_ISA) += tnt4882.o  tnt4882-objs := tnt4882_gpib.o mite.o diff --git a/drivers/staging/gpib/tnt4882/mite.c b/drivers/staging/gpib/tnt4882/mite.c index 0edf34d243e9..4bd352967616 100644 --- a/drivers/staging/gpib/tnt4882/mite.c +++ b/drivers/staging/gpib/tnt4882/mite.c @@ -148,72 +148,3 @@ void mite_list_devices(void)  	}  	pr_info("\n");  } - -int mite_bytes_transferred(struct mite_struct *mite, int chan) -{ -	int dar, fcr; - -	dar = readl(mite->mite_io_addr + MITE_DAR + CHAN_OFFSET(chan)); -	fcr = readl(mite->mite_io_addr + MITE_FCR + CHAN_OFFSET(chan)) & 0x000000FF; -	return dar - fcr; -} - -int mite_dma_tcr(struct mite_struct *mite) -{ -	int tcr; -	int lkar; - -	lkar = readl(mite->mite_io_addr + CHAN_OFFSET(0) + MITE_LKAR); -	tcr = readl(mite->mite_io_addr + CHAN_OFFSET(0) + MITE_TCR); -	MDPRINTK("lkar=0x%08x tcr=%d\n", lkar, tcr); - -	return tcr; -} - -void mite_dma_disarm(struct mite_struct *mite) -{ -	int chor; - -	/* disarm */ -	chor = CHOR_ABORT; -	writel(chor, mite->mite_io_addr + CHAN_OFFSET(0) + MITE_CHOR); -} - -void mite_dump_regs(struct mite_struct *mite) -{ -	void *addr = 0; -	unsigned long temp = 0; - -	pr_info("mite address is  =0x%p\n", mite->mite_io_addr); - -	addr = mite->mite_io_addr + MITE_CHOR + CHAN_OFFSET(0); -	pr_info("mite status[CHOR]at 0x%p =0x%08lx\n", addr, temp = readl(addr)); -	//mite_decode(mite_CHOR_strings,temp); -	addr = mite->mite_io_addr + MITE_CHCR + CHAN_OFFSET(0); -	pr_info("mite status[CHCR]at 0x%p =0x%08lx\n", addr, temp = readl(addr)); -	//mite_decode(mite_CHCR_strings,temp); -	addr = mite->mite_io_addr + MITE_TCR + CHAN_OFFSET(0); -	pr_info("mite status[TCR] at 0x%p =0x%08x\n", addr, readl(addr)); -	addr = mite->mite_io_addr + MITE_MCR + CHAN_OFFSET(0); -	pr_info("mite status[MCR] at 0x%p =0x%08lx\n", addr, temp = readl(addr)); -	//mite_decode(mite_MCR_strings,temp); -	addr = mite->mite_io_addr + MITE_MAR + CHAN_OFFSET(0); -	pr_info("mite status[MAR] at 0x%p =0x%08x\n", addr, readl(addr)); -	addr = mite->mite_io_addr + MITE_DCR + CHAN_OFFSET(0); -	pr_info("mite status[DCR] at 0x%p =0x%08lx\n", addr, temp = readl(addr)); -	//mite_decode(mite_CR_strings,temp); -	addr = mite->mite_io_addr + MITE_DAR + CHAN_OFFSET(0); -	pr_info("mite status[DAR] at 0x%p =0x%08x\n", addr, readl(addr)); -	addr = mite->mite_io_addr + MITE_LKCR + CHAN_OFFSET(0); -	pr_info("mite status[LKCR]at 0x%p =0x%08lx\n", addr, temp = readl(addr)); -	//mite_decode(mite_CR_strings,temp); -	addr = mite->mite_io_addr + MITE_LKAR + CHAN_OFFSET(0); -	pr_info("mite status[LKAR]at 0x%p =0x%08x\n", addr, readl(addr)); - -	addr = mite->mite_io_addr + MITE_CHSR + CHAN_OFFSET(0); -	pr_info("mite status[CHSR]at 0x%p =0x%08lx\n", addr, temp = readl(addr)); -	//mite_decode(mite_CHSR_strings,temp); -	addr = mite->mite_io_addr + MITE_FCR + CHAN_OFFSET(0); -	pr_info("mite status[FCR] at 0x%p =0x%08x\n\n", addr, readl(addr)); -} - diff --git a/drivers/staging/gpib/tnt4882/mite.h b/drivers/staging/gpib/tnt4882/mite.h index 6454d069b8cc..edb873435b51 100644 --- a/drivers/staging/gpib/tnt4882/mite.h +++ b/drivers/staging/gpib/tnt4882/mite.h @@ -34,9 +34,9 @@ struct mite_struct {  	struct pci_dev *pcidev;  	unsigned long mite_phys_addr; -	void *mite_io_addr; +	void __iomem *mite_io_addr;  	unsigned long daq_phys_addr; -	void *daq_io_addr; +	void __iomem *daq_io_addr;  	int DMA_CheckNearEnd; @@ -61,15 +61,6 @@ int mite_setup(struct mite_struct *mite);  void mite_unsetup(struct mite_struct *mite);  void mite_list_devices(void); -int mite_dma_tcr(struct mite_struct *mite); - -void mite_dma_arm(struct mite_struct *mite); -void mite_dma_disarm(struct mite_struct *mite); - -void mite_dump_regs(struct mite_struct *mite); -void mite_setregs(struct mite_struct *mite, unsigned long ll_start, int chan, int dir); -int mite_bytes_transferred(struct mite_struct *mite, int chan); -  #define CHAN_OFFSET(x)			(0x100 * (x))  /* DMA base for chan 0 is 0x500, chan 1 is 0x600 */ diff --git a/drivers/staging/gpib/tnt4882/tnt4882_gpib.c b/drivers/staging/gpib/tnt4882/tnt4882_gpib.c index e49a952fa0d8..ce91c3eb768c 100644 --- a/drivers/staging/gpib/tnt4882/tnt4882_gpib.c +++ b/drivers/staging/gpib/tnt4882/tnt4882_gpib.c @@ -45,10 +45,6 @@ struct tnt4882_priv {  	unsigned short imr0_bits;  	unsigned short imr3_bits;  	unsigned short auxg_bits;	// bits written to auxiliary register G -	void (*io_writeb)(unsigned int value, void *address); -	void (*io_writew)(unsigned int value, void *address); -	unsigned int (*io_readb)(void *address); -	unsigned int (*io_readw)(void *address);  };  // interface functions @@ -104,23 +100,23 @@ static const int atgpib_iosize = 32;  /* paged io */  static inline unsigned int tnt_paged_readb(struct tnt4882_priv *priv, unsigned long offset)  { -	priv->io_writeb(AUX_PAGEIN, priv->nec7210_priv.iobase + AUXMR * priv->nec7210_priv.offset); +	iowrite8(AUX_PAGEIN, priv->nec7210_priv.mmiobase + AUXMR * priv->nec7210_priv.offset);  	udelay(1); -	return priv->io_readb(priv->nec7210_priv.iobase + offset); +	return ioread8(priv->nec7210_priv.mmiobase + offset);  }  static inline void tnt_paged_writeb(struct tnt4882_priv *priv, unsigned int value,  				    unsigned long offset)  { -	priv->io_writeb(AUX_PAGEIN, priv->nec7210_priv.iobase + AUXMR * priv->nec7210_priv.offset); +	iowrite8(AUX_PAGEIN, priv->nec7210_priv.mmiobase + AUXMR * priv->nec7210_priv.offset);  	udelay(1); -	priv->io_writeb(value, priv->nec7210_priv.iobase + offset); +	iowrite8(value, priv->nec7210_priv.mmiobase + offset);  }  /* readb/writeb wrappers */  static inline unsigned short tnt_readb(struct tnt4882_priv *priv, unsigned long offset)  { -	void *address = priv->nec7210_priv.iobase + offset; +	void *address = priv->nec7210_priv.mmiobase + offset;  	unsigned long flags;  	unsigned short retval;  	spinlock_t *register_lock = &priv->nec7210_priv.register_page_lock; @@ -134,7 +130,7 @@ static inline unsigned short tnt_readb(struct tnt4882_priv *priv, unsigned long  		switch (priv->nec7210_priv.type) {  		case TNT4882:  		case TNT5004: -			retval = priv->io_readb(address); +			retval = ioread8(address);  			break;  		case NAT4882:  			retval = tnt_paged_readb(priv, offset - tnt_pagein_offset); @@ -149,7 +145,7 @@ static inline unsigned short tnt_readb(struct tnt4882_priv *priv, unsigned long  		}  		break;  	default: -		retval = priv->io_readb(address); +		retval = ioread8(address);  		break;  	}  	spin_unlock_irqrestore(register_lock, flags); @@ -158,7 +154,7 @@ static inline unsigned short tnt_readb(struct tnt4882_priv *priv, unsigned long  static inline void tnt_writeb(struct tnt4882_priv *priv, unsigned short value, unsigned long offset)  { -	void *address = priv->nec7210_priv.iobase + offset; +	void *address = priv->nec7210_priv.mmiobase + offset;  	unsigned long flags;  	spinlock_t *register_lock = &priv->nec7210_priv.register_page_lock; @@ -170,7 +166,7 @@ static inline void tnt_writeb(struct tnt4882_priv *priv, unsigned short value, u  		switch (priv->nec7210_priv.type) {  		case TNT4882:  		case TNT5004: -			priv->io_writeb(value, address); +			iowrite8(value, address);  			break;  		case NAT4882:  			tnt_paged_writeb(priv, value, offset - tnt_pagein_offset); @@ -183,7 +179,7 @@ static inline void tnt_writeb(struct tnt4882_priv *priv, unsigned short value, u  		}  		break;  	default: -		priv->io_writeb(value, address); +		iowrite8(value, address);  		break;  	}  	spin_unlock_irqrestore(register_lock, flags); @@ -288,7 +284,7 @@ static int drain_fifo_words(struct tnt4882_priv *tnt_priv, uint8_t *buffer, int  	while (fifo_word_available(tnt_priv) && count + 2 <= num_bytes)	{  		short word; -		word = tnt_priv->io_readw(nec_priv->iobase + FIFOB); +		word = ioread16(nec_priv->mmiobase + FIFOB);  		buffer[count++] = word & 0xff;  		buffer[count++] = (word >> 8) & 0xff;  	} @@ -573,7 +569,7 @@ static int generic_write(gpib_board_t *board, uint8_t *buffer, size_t length,  			word = buffer[count++] & 0xff;  			if (count < length)  				word |= (buffer[count++] << 8) & 0xff00; -			tnt_priv->io_writew(word, nec_priv->iobase + FIFOB); +			iowrite16(word, nec_priv->mmiobase + FIFOB);  		}  //  avoid unnecessary HR_NFF interrupts  //		tnt_priv->imr3_bits |= HR_NFF; @@ -1269,10 +1265,6 @@ int ni_pci_attach(gpib_board_t *board, const gpib_board_config_t *config)  	if (tnt4882_allocate_private(board))  		return -ENOMEM;  	tnt_priv = board->private_data; -	tnt_priv->io_writeb = writeb_wrapper; -	tnt_priv->io_readb = readb_wrapper; -	tnt_priv->io_writew = writew_wrapper; -	tnt_priv->io_readw = readw_wrapper;  	nec_priv = &tnt_priv->nec7210_priv;  	nec_priv->type = TNT4882;  	nec_priv->read_byte = nec7210_locking_iomem_read_byte; @@ -1324,7 +1316,7 @@ int ni_pci_attach(gpib_board_t *board, const gpib_board_config_t *config)  		return retval;  	} -	nec_priv->iobase = tnt_priv->mite->daq_io_addr; +	nec_priv->mmiobase = tnt_priv->mite->daq_io_addr;  	// get irq  	if (request_irq(mite_irq(tnt_priv->mite), tnt4882_interrupt, isr_flags, @@ -1359,7 +1351,7 @@ void ni_pci_detach(gpib_board_t *board)  	if (tnt_priv) {  		nec_priv = &tnt_priv->nec7210_priv; -		if (nec_priv->iobase) +		if (nec_priv->mmiobase)  			tnt4882_board_reset(tnt_priv, board);  		if (tnt_priv->irq)  			free_irq(tnt_priv->irq, board); @@ -1400,7 +1392,7 @@ static int ni_isa_attach_common(gpib_board_t *board, const gpib_board_config_t *  	struct tnt4882_priv *tnt_priv;  	struct nec7210_priv *nec_priv;  	int isr_flags = 0; -	void *iobase; +	u32 iobase;  	int irq;  	board->status = 0; @@ -1408,10 +1400,6 @@ static int ni_isa_attach_common(gpib_board_t *board, const gpib_board_config_t *  	if (tnt4882_allocate_private(board))  		return -ENOMEM;  	tnt_priv = board->private_data; -	tnt_priv->io_writeb = outb_wrapper; -	tnt_priv->io_readb = inb_wrapper; -	tnt_priv->io_writew = outw_wrapper; -	tnt_priv->io_readw = inw_wrapper;  	nec_priv = &tnt_priv->nec7210_priv;  	nec_priv->type = chipset;  	nec_priv->read_byte = nec7210_locking_ioport_read_byte; @@ -1427,18 +1415,20 @@ static int ni_isa_attach_common(gpib_board_t *board, const gpib_board_config_t *  		if (retval < 0)  			return retval;  		tnt_priv->pnp_dev = dev; -		iobase = (void *)(pnp_port_start(dev, 0)); +		iobase = pnp_port_start(dev, 0);  		irq = pnp_irq(dev, 0);  	} else {  		iobase = config->ibbase;  		irq = config->ibirq;  	}  	// allocate ioports -	if (!request_region((unsigned long)(iobase), atgpib_iosize, "atgpib")) { +	if (!request_region(iobase, atgpib_iosize, "atgpib")) {  		pr_err("tnt4882: failed to allocate ioports\n");  		return -1;  	} -	nec_priv->iobase = iobase; +	nec_priv->mmiobase = ioport_map(iobase, atgpib_iosize); +	if (!nec_priv->mmiobase) +		return -1;  	// get irq  	if (request_irq(irq, tnt4882_interrupt, isr_flags, "atgpib", board)) { @@ -1478,8 +1468,10 @@ void ni_isa_detach(gpib_board_t *board)  			tnt4882_board_reset(tnt_priv, board);  		if (tnt_priv->irq)  			free_irq(tnt_priv->irq, board); +		if (nec_priv->mmiobase) +			ioport_unmap(nec_priv->mmiobase);  		if (nec_priv->iobase) -			release_region((unsigned long)(nec_priv->iobase), atgpib_iosize); +			release_region(nec_priv->iobase, atgpib_iosize);  		if (tnt_priv->pnp_dev)  			pnp_device_detach(tnt_priv->pnp_dev);  	} @@ -1817,10 +1809,6 @@ int ni_pcmcia_attach(gpib_board_t *board, const gpib_board_config_t *config)  	if (tnt4882_allocate_private(board))  		return -ENOMEM;  	tnt_priv = board->private_data; -	tnt_priv->io_writeb = outb_wrapper; -	tnt_priv->io_readb = inb_wrapper; -	tnt_priv->io_writew = outw_wrapper; -	tnt_priv->io_readw = inw_wrapper;  	nec_priv = &tnt_priv->nec7210_priv;  	nec_priv->type = TNT4882;  	nec_priv->read_byte = nec7210_locking_ioport_read_byte; @@ -1835,7 +1823,10 @@ int ni_pcmcia_attach(gpib_board_t *board, const gpib_board_config_t *config)  		return -EIO;  	} -	nec_priv->iobase = (void *)(unsigned long)curr_dev->resource[0]->start; +	nec_priv->mmiobase = ioport_map(curr_dev->resource[0]->start, +					resource_size(curr_dev->resource[0])); +	if (!nec_priv->mmiobase) +		return -1;  	// get irq  	if (request_irq(curr_dev->irq, tnt4882_interrupt, isr_flags, "tnt4882", board))	{ @@ -1860,9 +1851,11 @@ void ni_pcmcia_detach(gpib_board_t *board)  		nec_priv = &tnt_priv->nec7210_priv;  		if (tnt_priv->irq)  			free_irq(tnt_priv->irq, board); +		if (nec_priv->mmiobase) +			ioport_unmap(nec_priv->mmiobase);  		if (nec_priv->iobase) {  			tnt4882_board_reset(tnt_priv, board); -			release_region((unsigned long)nec_priv->iobase, pcmcia_gpib_iosize); +			release_region(nec_priv->iobase, pcmcia_gpib_iosize);  		}  	}  	tnt4882_free_private(board); diff --git a/drivers/staging/iio/accel/adis16203.c b/drivers/staging/iio/accel/adis16203.c index c0e4c9266b5f..c1c73308800c 100644 --- a/drivers/staging/iio/accel/adis16203.c +++ b/drivers/staging/iio/accel/adis16203.c @@ -312,4 +312,4 @@ MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices ADIS16203 Programmable 360 Degrees Inclinometer");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("spi:adis16203"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/staging/iio/accel/adis16240.c b/drivers/staging/iio/accel/adis16240.c index 337492785f04..3be3eaf5d9d4 100644 --- a/drivers/staging/iio/accel/adis16240.c +++ b/drivers/staging/iio/accel/adis16240.c @@ -440,4 +440,4 @@ MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");  MODULE_DESCRIPTION("Analog Devices Programmable Impact Sensor and Recorder");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("spi:adis16240"); -MODULE_IMPORT_NS(IIO_ADISLIB); +MODULE_IMPORT_NS("IIO_ADISLIB"); diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c index 492612e8f8ba..140ee4f9c137 100644 --- a/drivers/staging/iio/frequency/ad9832.c +++ b/drivers/staging/iio/frequency/ad9832.c @@ -158,7 +158,7 @@ static int ad9832_write_frequency(struct ad9832_state *st,  static int ad9832_write_phase(struct ad9832_state *st,  			      unsigned long addr, unsigned long phase)  { -	if (phase > BIT(AD9832_PHASE_BITS)) +	if (phase >= BIT(AD9832_PHASE_BITS))  		return -EINVAL;  	st->phase_data[0] = cpu_to_be16((AD9832_CMD_PHA8BITSW << CMD_SHIFT) | diff --git a/drivers/staging/iio/frequency/ad9834.c b/drivers/staging/iio/frequency/ad9834.c index 47e7d7e6d920..6e99e008c5f4 100644 --- a/drivers/staging/iio/frequency/ad9834.c +++ b/drivers/staging/iio/frequency/ad9834.c @@ -131,7 +131,7 @@ static int ad9834_write_frequency(struct ad9834_state *st,  static int ad9834_write_phase(struct ad9834_state *st,  			      unsigned long addr, unsigned long phase)  { -	if (phase > BIT(AD9834_PHASE_BITS)) +	if (phase >= BIT(AD9834_PHASE_BITS))  		return -EINVAL;  	st->data = cpu_to_be16(addr | phase); diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c index d92b5cce107a..2841824cd0ca 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c +++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c @@ -1482,4 +1482,4 @@ MODULE_AUTHOR("Wen Wang <wen.w.wang@intel.com>");  MODULE_AUTHOR("Xiaolin Zhang <xiaolin.zhang@intel.com>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Intel ATOM Platform ISP Driver"); -MODULE_IMPORT_NS(INTEL_IPU_BRIDGE); +MODULE_IMPORT_NS("INTEL_IPU_BRIDGE"); diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 717931267bda..0f5d820af119 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -361,7 +361,7 @@ static const struct genl_multicast_group tcmu_mcgrps[] = {  	[TCMU_MCGRP_CONFIG] = { .name = "config", },  }; -static struct nla_policy tcmu_attr_policy[TCMU_ATTR_MAX+1] = { +static const struct nla_policy tcmu_attr_policy[TCMU_ATTR_MAX + 1] = {  	[TCMU_ATTR_DEVICE]	= { .type = NLA_STRING },  	[TCMU_ATTR_MINOR]	= { .type = NLA_U32 },  	[TCMU_ATTR_CMD_STATUS]	= { .type = NLA_S32 }, @@ -2430,7 +2430,7 @@ enum {  	Opt_cmd_ring_size_mb, Opt_err,  }; -static match_table_t tokens = { +static const match_table_t tokens = {  	{Opt_dev_config, "dev_config=%s"},  	{Opt_dev_size, "dev_size=%s"},  	{Opt_hw_block_size, "hw_block_size=%d"}, diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index e9456e3e74cc..3e33cf2af73b 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -1817,7 +1817,7 @@ MODULE_DEVICE_TABLE(of, optee_dt_match);  static struct platform_driver optee_driver = {  	.probe  = optee_probe, -	.remove_new = optee_smc_remove, +	.remove = optee_smc_remove,  	.shutdown = optee_shutdown,  	.driver = {  		.name = "optee", diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c index 7c46dd6bee73..c868d8b7bd1c 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device.c @@ -454,8 +454,8 @@ void proc_thermal_mmio_remove(struct pci_dev *pdev, struct proc_thermal_device *  }  EXPORT_SYMBOL_GPL(proc_thermal_mmio_remove); -MODULE_IMPORT_NS(INTEL_TCC); -MODULE_IMPORT_NS(INT340X_THERMAL); +MODULE_IMPORT_NS("INTEL_TCC"); +MODULE_IMPORT_NS("INT340X_THERMAL");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_DESCRIPTION("Processor Thermal Reporting Device Driver");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c index ba5d36d36fc4..145d471546d5 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci.c @@ -510,7 +510,7 @@ static struct pci_driver proc_thermal_pci_driver = {  module_pci_driver(proc_thermal_pci_driver); -MODULE_IMPORT_NS(INT340X_THERMAL); +MODULE_IMPORT_NS("INT340X_THERMAL");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_DESCRIPTION("Processor Thermal Reporting Device Driver"); diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c index af2ec0beb7a1..b1d531ef440f 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_mbox.c @@ -94,7 +94,7 @@ int processor_thermal_send_mbox_read_cmd(struct pci_dev *pdev, u16 id, u64 *resp  	return ret;  } -EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_read_cmd, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_read_cmd, "INT340X_THERMAL");  int processor_thermal_send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data)  { @@ -106,7 +106,7 @@ int processor_thermal_send_mbox_write_cmd(struct pci_dev *pdev, u16 id, u32 data  	return ret;  } -EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_write_cmd, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(processor_thermal_send_mbox_write_cmd, "INT340X_THERMAL");  #define MBOX_CAMARILLO_RD_INTR_CONFIG	0x1E  #define MBOX_CAMARILLO_WR_INTR_CONFIG	0x1F @@ -153,7 +153,7 @@ unlock:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(processor_thermal_mbox_interrupt_config, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(processor_thermal_mbox_interrupt_config, "INT340X_THERMAL");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("Processor Thermal Mail Box Interface"); diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_power_floor.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_power_floor.c index d6b787ca2741..25cdbb6d91a6 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_power_floor.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_power_floor.c @@ -42,7 +42,7 @@ int proc_thermal_read_power_floor_status(struct proc_thermal_device *proc_priv)  	status = readq(proc_priv->mmio_base + SOC_WT_RES_INT_STATUS_OFFSET);  	return (status & SOC_POWER_FLOOR_STATUS) >> SOC_POWER_FLOOR_SHIFT;  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_read_power_floor_status, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_read_power_floor_status, "INT340X_THERMAL");  static bool enable_state;  static DEFINE_MUTEX(pf_lock); @@ -69,13 +69,13 @@ pf_unlock:  	return ret;  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_power_floor_set_state, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_power_floor_set_state, "INT340X_THERMAL");  bool proc_thermal_power_floor_get_state(struct proc_thermal_device *proc_priv)  {  	return enable_state;  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_power_floor_get_state, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_power_floor_get_state, "INT340X_THERMAL");  /**   * proc_thermal_check_power_floor_intr() - Check power floor interrupt. @@ -94,7 +94,7 @@ bool proc_thermal_check_power_floor_intr(struct proc_thermal_device *proc_priv)  	int_status = readq(proc_priv->mmio_base + SOC_WT_RES_INT_STATUS_OFFSET);  	return !!(int_status & SOC_POWER_FLOOR_INT_ACTIVE);  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_check_power_floor_intr, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_check_power_floor_intr, "INT340X_THERMAL");  /**   * proc_thermal_power_floor_intr_callback() - Process power floor notification @@ -120,8 +120,8 @@ void proc_thermal_power_floor_intr_callback(struct pci_dev *pdev,  	sysfs_notify(&pdev->dev.kobj, "power_limits", "power_floor_status");  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_power_floor_intr_callback, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_power_floor_intr_callback, "INT340X_THERMAL"); -MODULE_IMPORT_NS(INT340X_THERMAL); +MODULE_IMPORT_NS("INT340X_THERMAL");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Processor Thermal power floor notification Interface"); diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c index 0e2dc1426282..dad63f2d5f90 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_rfim.c @@ -9,7 +9,7 @@  #include <linux/pci.h>  #include "processor_thermal_device.h" -MODULE_IMPORT_NS(INT340X_THERMAL); +MODULE_IMPORT_NS("INT340X_THERMAL");  struct mmio_reg {  	int read_only; diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_hint.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_hint.c index e947d84f4977..68e8391af8f4 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_hint.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_hint.c @@ -204,7 +204,7 @@ bool proc_thermal_check_wt_intr(struct proc_thermal_device *proc_priv)  	return false;  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_check_wt_intr, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_check_wt_intr, "INT340X_THERMAL");  /* Callback to notify user space */  void proc_thermal_wt_intr_callback(struct pci_dev *pdev, struct proc_thermal_device *proc_priv) @@ -217,7 +217,7 @@ void proc_thermal_wt_intr_callback(struct pci_dev *pdev, struct proc_thermal_dev  	sysfs_notify(&pdev->dev.kobj, "workload_hint", "workload_type_index");  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_wt_intr_callback, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_wt_intr_callback, "INT340X_THERMAL");  static bool workload_hint_created; @@ -233,7 +233,7 @@ int proc_thermal_wt_hint_add(struct pci_dev *pdev, struct proc_thermal_device *p  	return 0;  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_wt_hint_add, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_wt_hint_add, "INT340X_THERMAL");  void proc_thermal_wt_hint_remove(struct pci_dev *pdev)  { @@ -249,8 +249,8 @@ void proc_thermal_wt_hint_remove(struct pci_dev *pdev)  	workload_hint_created = false;  } -EXPORT_SYMBOL_NS_GPL(proc_thermal_wt_hint_remove, INT340X_THERMAL); +EXPORT_SYMBOL_NS_GPL(proc_thermal_wt_hint_remove, "INT340X_THERMAL"); -MODULE_IMPORT_NS(INT340X_THERMAL); +MODULE_IMPORT_NS("INT340X_THERMAL");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Processor Thermal Work Load type hint Interface"); diff --git a/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_req.c b/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_req.c index f298e7442662..b95810f4a011 100644 --- a/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_req.c +++ b/drivers/thermal/intel/int340x_thermal/processor_thermal_wt_req.c @@ -132,6 +132,6 @@ void proc_thermal_wt_req_remove(struct pci_dev *pdev)  }  EXPORT_SYMBOL_GPL(proc_thermal_wt_req_remove); -MODULE_IMPORT_NS(INT340X_THERMAL); +MODULE_IMPORT_NS("INT340X_THERMAL");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Processor Thermal Work Load type request Interface"); diff --git a/drivers/thermal/intel/intel_powerclamp.c b/drivers/thermal/intel/intel_powerclamp.c index 4ba649370aa1..96a24df79686 100644 --- a/drivers/thermal/intel/intel_powerclamp.c +++ b/drivers/thermal/intel/intel_powerclamp.c @@ -809,7 +809,7 @@ static void __exit powerclamp_exit(void)  }  module_exit(powerclamp_exit); -MODULE_IMPORT_NS(IDLE_INJECT); +MODULE_IMPORT_NS("IDLE_INJECT");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>"); diff --git a/drivers/thermal/intel/intel_soc_dts_iosf.c b/drivers/thermal/intel/intel_soc_dts_iosf.c index 43a29551ba17..ea87439fe7a9 100644 --- a/drivers/thermal/intel/intel_soc_dts_iosf.c +++ b/drivers/thermal/intel/intel_soc_dts_iosf.c @@ -388,6 +388,6 @@ void intel_soc_dts_iosf_exit(struct intel_soc_dts_sensors *sensors)  }  EXPORT_SYMBOL_GPL(intel_soc_dts_iosf_exit); -MODULE_IMPORT_NS(INTEL_TCC); +MODULE_IMPORT_NS("INTEL_TCC");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("SoC DTS driver using side band interface"); diff --git a/drivers/thermal/intel/intel_tcc.c b/drivers/thermal/intel/intel_tcc.c index c86654f28aa5..817421508d5c 100644 --- a/drivers/thermal/intel/intel_tcc.c +++ b/drivers/thermal/intel/intel_tcc.c @@ -150,7 +150,7 @@ u32 intel_tcc_get_offset_mask(void)  {  	return intel_tcc_temp_masks.tcc_offset;  } -EXPORT_SYMBOL_NS(intel_tcc_get_offset_mask, INTEL_TCC); +EXPORT_SYMBOL_NS(intel_tcc_get_offset_mask, "INTEL_TCC");  /**   * get_temp_mask() - Returns the model-specific bitmask for temperature @@ -195,7 +195,7 @@ int intel_tcc_get_tjmax(int cpu)  	return val ? val : -ENODATA;  } -EXPORT_SYMBOL_NS_GPL(intel_tcc_get_tjmax, INTEL_TCC); +EXPORT_SYMBOL_NS_GPL(intel_tcc_get_tjmax, "INTEL_TCC");  /**   * intel_tcc_get_offset() - returns the TCC Offset value to Tjmax @@ -220,7 +220,7 @@ int intel_tcc_get_offset(int cpu)  	return (low >> 24) & intel_tcc_temp_masks.tcc_offset;  } -EXPORT_SYMBOL_NS_GPL(intel_tcc_get_offset, INTEL_TCC); +EXPORT_SYMBOL_NS_GPL(intel_tcc_get_offset, "INTEL_TCC");  /**   * intel_tcc_set_offset() - set the TCC offset value to Tjmax @@ -263,7 +263,7 @@ int intel_tcc_set_offset(int cpu, int offset)  	else  		return wrmsr_safe_on_cpu(cpu, MSR_IA32_TEMPERATURE_TARGET, low, high);  } -EXPORT_SYMBOL_NS_GPL(intel_tcc_set_offset, INTEL_TCC); +EXPORT_SYMBOL_NS_GPL(intel_tcc_set_offset, "INTEL_TCC");  /**   * intel_tcc_get_temp() - returns the current temperature @@ -303,4 +303,4 @@ int intel_tcc_get_temp(int cpu, int *temp, bool pkg)  	return 0;  } -EXPORT_SYMBOL_NS_GPL(intel_tcc_get_temp, INTEL_TCC); +EXPORT_SYMBOL_NS_GPL(intel_tcc_get_temp, "INTEL_TCC"); diff --git a/drivers/thermal/intel/intel_tcc_cooling.c b/drivers/thermal/intel/intel_tcc_cooling.c index 17110ffa80bb..9ff0ebdde0ef 100644 --- a/drivers/thermal/intel/intel_tcc_cooling.c +++ b/drivers/thermal/intel/intel_tcc_cooling.c @@ -118,7 +118,7 @@ static void __exit tcc_cooling_exit(void)  module_exit(tcc_cooling_exit) -MODULE_IMPORT_NS(INTEL_TCC); +MODULE_IMPORT_NS("INTEL_TCC");  MODULE_DESCRIPTION("TCC offset cooling device Driver");  MODULE_AUTHOR("Zhang Rui <rui.zhang@intel.com>");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/thermal/intel/x86_pkg_temp_thermal.c b/drivers/thermal/intel/x86_pkg_temp_thermal.c index 65b33b56a9be..496abf8e55e0 100644 --- a/drivers/thermal/intel/x86_pkg_temp_thermal.c +++ b/drivers/thermal/intel/x86_pkg_temp_thermal.c @@ -524,7 +524,7 @@ static void __exit pkg_temp_thermal_exit(void)  }  module_exit(pkg_temp_thermal_exit) -MODULE_IMPORT_NS(INTEL_TCC); +MODULE_IMPORT_NS("INTEL_TCC");  MODULE_DESCRIPTION("X86 PKG TEMP Thermal Driver");  MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/thermal/thermal_hwmon.c b/drivers/thermal/thermal_hwmon.c index 37da7a8ea948..0ecccd4d8556 100644 --- a/drivers/thermal/thermal_hwmon.c +++ b/drivers/thermal/thermal_hwmon.c @@ -284,4 +284,4 @@ int devm_thermal_add_hwmon_sysfs(struct device *dev, struct thermal_zone_device  }  EXPORT_SYMBOL_GPL(devm_thermal_add_hwmon_sysfs); -MODULE_IMPORT_NS(HWMON_THERMAL); +MODULE_IMPORT_NS("HWMON_THERMAL"); diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c index fab11b98ca49..5ab4ce4daaeb 100644 --- a/drivers/thermal/thermal_of.c +++ b/drivers/thermal/thermal_of.c @@ -160,6 +160,7 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int  				return ERR_PTR(ret);  			} +			of_node_put(sensor_specs.np);  			if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ?  								  sensor_specs.args[0] : 0)) {  				pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, child); diff --git a/drivers/thermal/thermal_thresholds.c b/drivers/thermal/thermal_thresholds.c index d9b2a0bb44fc..38f5fd0e8930 100644 --- a/drivers/thermal/thermal_thresholds.c +++ b/drivers/thermal/thermal_thresholds.c @@ -69,58 +69,60 @@ static struct user_threshold *__thermal_thresholds_find(const struct list_head *  	return NULL;  } -static bool __thermal_threshold_is_crossed(struct user_threshold *threshold, int temperature, -					   int last_temperature, int direction, -					   int *low, int *high) +static bool thermal_thresholds_handle_raising(struct list_head *thresholds, int temperature, +					      int last_temperature)  { +	struct user_threshold *t; -	if (temperature >= threshold->temperature) { -		if (threshold->temperature > *low && -		    THERMAL_THRESHOLD_WAY_DOWN & threshold->direction) -			*low = threshold->temperature; +	list_for_each_entry(t, thresholds, list_node) { -		if (last_temperature < threshold->temperature && -		    threshold->direction & direction) -			return true; -	} else { -		if (threshold->temperature < *high && THERMAL_THRESHOLD_WAY_UP -		    & threshold->direction) -			*high = threshold->temperature; +		if (!(t->direction & THERMAL_THRESHOLD_WAY_UP)) +		    continue; -		if (last_temperature >= threshold->temperature && -		    threshold->direction & direction) +		if (temperature >= t->temperature && +		    last_temperature < t->temperature)  			return true;  	}  	return false;  } -static bool thermal_thresholds_handle_raising(struct list_head *thresholds, int temperature, -					      int last_temperature, int *low, int *high) +static bool thermal_thresholds_handle_dropping(struct list_head *thresholds, int temperature, +					       int last_temperature)  {  	struct user_threshold *t; -	list_for_each_entry(t, thresholds, list_node) { -		if (__thermal_threshold_is_crossed(t, temperature, last_temperature, -						   THERMAL_THRESHOLD_WAY_UP, low, high)) +	list_for_each_entry_reverse(t, thresholds, list_node) { + +		if (!(t->direction & THERMAL_THRESHOLD_WAY_DOWN)) +		    continue; + +		if (temperature <= t->temperature && +		    last_temperature > t->temperature)  			return true;  	}  	return false;  } -static bool thermal_thresholds_handle_dropping(struct list_head *thresholds, int temperature, -					       int last_temperature, int *low, int *high) +static void thermal_threshold_find_boundaries(struct list_head *thresholds, int temperature, +					      int *low, int *high)  {  	struct user_threshold *t; -	list_for_each_entry_reverse(t, thresholds, list_node) { -		if (__thermal_threshold_is_crossed(t, temperature, last_temperature, -						   THERMAL_THRESHOLD_WAY_DOWN, low, high)) -			return true; +	list_for_each_entry(t, thresholds, list_node) { +		if (temperature < t->temperature && +		    (t->direction & THERMAL_THRESHOLD_WAY_UP) && +		    *high > t->temperature) +			*high = t->temperature;  	} -	return false; +	list_for_each_entry_reverse(t, thresholds, list_node) { +		if (temperature > t->temperature && +		    (t->direction & THERMAL_THRESHOLD_WAY_DOWN) && +		    *low < t->temperature) +			*low = t->temperature; +	}  }  void thermal_thresholds_handle(struct thermal_zone_device *tz, int *low, int *high) @@ -132,6 +134,8 @@ void thermal_thresholds_handle(struct thermal_zone_device *tz, int *low, int *hi  	lockdep_assert_held(&tz->lock); +	thermal_threshold_find_boundaries(thresholds, temperature, low, high); +  	/*  	 * We need a second update in order to detect a threshold being crossed  	 */ @@ -151,12 +155,12 @@ void thermal_thresholds_handle(struct thermal_zone_device *tz, int *low, int *hi  	 * - decreased : thresholds are crossed the way down  	 */  	if (temperature > last_temperature) { -		if (thermal_thresholds_handle_raising(thresholds, temperature, -						      last_temperature, low, high)) +		if (thermal_thresholds_handle_raising(thresholds, +						      temperature, last_temperature))  			thermal_notify_threshold_up(tz);  	} else { -		if (thermal_thresholds_handle_dropping(thresholds, temperature, -						       last_temperature, low, high)) +		if (thermal_thresholds_handle_dropping(thresholds, +						       temperature, last_temperature))  			thermal_notify_threshold_down(tz);  	}  } diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c index 1257dd3ce7e6..f3a2264e012b 100644 --- a/drivers/thunderbolt/nhi.c +++ b/drivers/thunderbolt/nhi.c @@ -1520,6 +1520,14 @@ static struct pci_device_id nhi_ids[] = {  	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1),  	  .driver_data = (kernel_ulong_t)&icl_nhi_ops }, +	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI0), +	  .driver_data = (kernel_ulong_t)&icl_nhi_ops }, +	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI1), +	  .driver_data = (kernel_ulong_t)&icl_nhi_ops }, +	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI0), +	  .driver_data = (kernel_ulong_t)&icl_nhi_ops }, +	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI1), +	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) },  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) }, diff --git a/drivers/thunderbolt/nhi.h b/drivers/thunderbolt/nhi.h index 7a07c7c1a9c2..16744f25a9a0 100644 --- a/drivers/thunderbolt/nhi.h +++ b/drivers/thunderbolt/nhi.h @@ -92,6 +92,10 @@ extern const struct tb_nhi_ops icl_nhi_ops;  #define PCI_DEVICE_ID_INTEL_RPL_NHI1			0xa76d  #define PCI_DEVICE_ID_INTEL_LNL_NHI0			0xa833  #define PCI_DEVICE_ID_INTEL_LNL_NHI1			0xa834 +#define PCI_DEVICE_ID_INTEL_PTL_M_NHI0			0xe333 +#define PCI_DEVICE_ID_INTEL_PTL_M_NHI1			0xe334 +#define PCI_DEVICE_ID_INTEL_PTL_P_NHI0			0xe433 +#define PCI_DEVICE_ID_INTEL_PTL_P_NHI1			0xe434  #define PCI_CLASS_SERIAL_USB_USB4			0x0c0340 diff --git a/drivers/thunderbolt/retimer.c b/drivers/thunderbolt/retimer.c index 89d2919d0193..eeb64433ebbc 100644 --- a/drivers/thunderbolt/retimer.c +++ b/drivers/thunderbolt/retimer.c @@ -103,6 +103,7 @@ static int tb_retimer_nvm_add(struct tb_retimer *rt)  err_nvm:  	dev_dbg(&rt->dev, "NVM upgrade disabled\n"); +	rt->no_nvm_upgrade = true;  	if (!IS_ERR(nvm))  		tb_nvm_free(nvm); @@ -182,8 +183,6 @@ static ssize_t nvm_authenticate_show(struct device *dev,  	if (!rt->nvm)  		ret = -EAGAIN; -	else if (rt->no_nvm_upgrade) -		ret = -EOPNOTSUPP;  	else  		ret = sysfs_emit(buf, "%#x\n", rt->auth_status); @@ -323,8 +322,6 @@ static ssize_t nvm_version_show(struct device *dev,  	if (!rt->nvm)  		ret = -EAGAIN; -	else if (rt->no_nvm_upgrade) -		ret = -EOPNOTSUPP;  	else  		ret = sysfs_emit(buf, "%x.%x\n", rt->nvm->major, rt->nvm->minor); @@ -342,6 +339,19 @@ static ssize_t vendor_show(struct device *dev, struct device_attribute *attr,  }  static DEVICE_ATTR_RO(vendor); +static umode_t retimer_is_visible(struct kobject *kobj, struct attribute *attr, +				  int n) +{ +	struct device *dev = kobj_to_dev(kobj); +	struct tb_retimer *rt = tb_to_retimer(dev); + +	if (attr == &dev_attr_nvm_authenticate.attr || +	    attr == &dev_attr_nvm_version.attr) +		return rt->no_nvm_upgrade ? 0 : attr->mode; + +	return attr->mode; +} +  static struct attribute *retimer_attrs[] = {  	&dev_attr_device.attr,  	&dev_attr_nvm_authenticate.attr, @@ -351,6 +361,7 @@ static struct attribute *retimer_attrs[] = {  };  static const struct attribute_group retimer_group = { +	.is_visible = retimer_is_visible,  	.attrs = retimer_attrs,  }; diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c index 4f777788e917..a7c6919fbf97 100644 --- a/drivers/thunderbolt/tb.c +++ b/drivers/thunderbolt/tb.c @@ -2059,6 +2059,37 @@ static void tb_exit_redrive(struct tb_port *port)  	}  } +static void tb_switch_enter_redrive(struct tb_switch *sw) +{ +	struct tb_port *port; + +	tb_switch_for_each_port(sw, port) +		tb_enter_redrive(port); +} + +/* + * Called during system and runtime suspend to forcefully exit redrive + * mode without querying whether the resource is available. + */ +static void tb_switch_exit_redrive(struct tb_switch *sw) +{ +	struct tb_port *port; + +	if (!(sw->quirks & QUIRK_KEEP_POWER_IN_DP_REDRIVE)) +		return; + +	tb_switch_for_each_port(sw, port) { +		if (!tb_port_is_dpin(port)) +			continue; + +		if (port->redrive) { +			port->redrive = false; +			pm_runtime_put(&sw->dev); +			tb_port_dbg(port, "exit redrive mode\n"); +		} +	} +} +  static void tb_dp_resource_unavailable(struct tb *tb, struct tb_port *port)  {  	struct tb_port *in, *out; @@ -2909,6 +2940,7 @@ static int tb_start(struct tb *tb, bool reset)  	tb_create_usb3_tunnels(tb->root_switch);  	/* Add DP IN resources for the root switch */  	tb_add_dp_resources(tb->root_switch); +	tb_switch_enter_redrive(tb->root_switch);  	/* Make the discovered switches available to the userspace */  	device_for_each_child(&tb->root_switch->dev, NULL,  			      tb_scan_finalize_switch); @@ -2924,6 +2956,7 @@ static int tb_suspend_noirq(struct tb *tb)  	tb_dbg(tb, "suspending...\n");  	tb_disconnect_and_release_dp(tb); +	tb_switch_exit_redrive(tb->root_switch);  	tb_switch_suspend(tb->root_switch, false);  	tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */  	tb_dbg(tb, "suspend finished\n"); @@ -3016,6 +3049,7 @@ static int tb_resume_noirq(struct tb *tb)  		tb_dbg(tb, "tunnels restarted, sleeping for 100ms\n");  		msleep(100);  	} +	tb_switch_enter_redrive(tb->root_switch);  	 /* Allow tb_handle_hotplug to progress events */  	tcm->hotplug_active = true;  	tb_dbg(tb, "resume finished\n"); @@ -3079,6 +3113,12 @@ static int tb_runtime_suspend(struct tb *tb)  	struct tb_cm *tcm = tb_priv(tb);  	mutex_lock(&tb->lock); +	/* +	 * The below call only releases DP resources to allow exiting and +	 * re-entering redrive mode. +	 */ +	tb_disconnect_and_release_dp(tb); +	tb_switch_exit_redrive(tb->root_switch);  	tb_switch_suspend(tb->root_switch, true);  	tcm->hotplug_active = false;  	mutex_unlock(&tb->lock); @@ -3110,6 +3150,7 @@ static int tb_runtime_resume(struct tb *tb)  	tb_restore_children(tb->root_switch);  	list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list)  		tb_tunnel_restart(tunnel); +	tb_switch_enter_redrive(tb->root_switch);  	tcm->hotplug_active = true;  	mutex_unlock(&tb->lock); diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c index 37164289277b..5af46442a792 100644 --- a/drivers/tty/amiserial.c +++ b/drivers/tty/amiserial.c @@ -1585,7 +1585,7 @@ static void __exit amiga_serial_remove(struct platform_device *pdev)   * triggering a section mismatch warning.   */  static struct platform_driver amiga_serial_driver __refdata = { -	.remove_new = __exit_p(amiga_serial_remove), +	.remove = __exit_p(amiga_serial_remove),  	.driver   = {  		.name	= "amiga-serial",  	}, diff --git a/drivers/tty/goldfish.c b/drivers/tty/goldfish.c index c60745f8e621..3a9582029005 100644 --- a/drivers/tty/goldfish.c +++ b/drivers/tty/goldfish.c @@ -461,7 +461,7 @@ MODULE_DEVICE_TABLE(of, goldfish_tty_of_match);  static struct platform_driver goldfish_tty_platform_driver = {  	.probe = goldfish_tty_probe, -	.remove_new = goldfish_tty_remove, +	.remove = goldfish_tty_remove,  	.driver = {  		.name = "goldfish_tty",  		.of_match_table = goldfish_tty_of_match, diff --git a/drivers/tty/hvc/hvc_opal.c b/drivers/tty/hvc/hvc_opal.c index 095c33ad10f8..b2ec1f6efa0a 100644 --- a/drivers/tty/hvc/hvc_opal.c +++ b/drivers/tty/hvc/hvc_opal.c @@ -247,7 +247,7 @@ static void hvc_opal_remove(struct platform_device *dev)  static struct platform_driver hvc_opal_driver = {  	.probe		= hvc_opal_probe, -	.remove_new	= hvc_opal_remove, +	.remove		= hvc_opal_remove,  	.driver		= {  		.name	= hvc_opal_name,  		.of_match_table	= hvc_opal_match, diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 5f9f06911795..68baf75bdadc 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -812,6 +812,9 @@ int serial8250_register_8250_port(const struct uart_8250_port *up)  			uart->dl_write = up->dl_write;  		if (uart->port.type != PORT_8250_CIR) { +			if (uart_console_registered(&uart->port)) +				pm_runtime_get_sync(uart->port.dev); +  			if (serial8250_isa_config != NULL)  				serial8250_isa_config(0, &uart->port,  						&uart->capabilities); diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c index fc5203446267..04a0cbab02c2 100644 --- a/drivers/tty/serial/8250/8250_exar.c +++ b/drivers/tty/serial/8250/8250_exar.c @@ -1730,7 +1730,7 @@ static struct pci_driver exar_pci_driver = {  };  module_pci_driver(exar_pci_driver); -MODULE_IMPORT_NS(SERIAL_8250_PCI); +MODULE_IMPORT_NS("SERIAL_8250_PCI");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Exar Serial Driver");  MODULE_AUTHOR("Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>"); diff --git a/drivers/tty/serial/8250/8250_men_mcb.c b/drivers/tty/serial/8250/8250_men_mcb.c index dc9e093b1cb3..a78ef35c8187 100644 --- a/drivers/tty/serial/8250/8250_men_mcb.c +++ b/drivers/tty/serial/8250/8250_men_mcb.c @@ -271,4 +271,4 @@ MODULE_AUTHOR("Michael Moese <michael.moese@men.de");  MODULE_ALIAS("mcb:16z125");  MODULE_ALIAS("mcb:16z025");  MODULE_ALIAS("mcb:16z057"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index 7d7a6d62c09c..3c3f7c926afb 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c @@ -6180,4 +6180,4 @@ module_pci_driver(serial_pci_driver);  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("Generic 8250/16x50 PCI serial probe module");  MODULE_DEVICE_TABLE(pci, serial_pci_tbl); -MODULE_IMPORT_NS(SERIAL_8250_PCI); +MODULE_IMPORT_NS("SERIAL_8250_PCI"); diff --git a/drivers/tty/serial/8250/8250_pci1xxxx.c b/drivers/tty/serial/8250/8250_pci1xxxx.c index d3930bf32fe4..838f181f929b 100644 --- a/drivers/tty/serial/8250/8250_pci1xxxx.c +++ b/drivers/tty/serial/8250/8250_pci1xxxx.c @@ -812,7 +812,7 @@ module_pci_driver(pci1xxxx_pci_driver);  static_assert((ARRAY_SIZE(logical_to_physical_port_idx) == PCI_SUBDEVICE_ID_EFAR_PCI1XXXX_1p3 + 1)); -MODULE_IMPORT_NS(SERIAL_8250_PCI); +MODULE_IMPORT_NS("SERIAL_8250_PCI");  MODULE_DESCRIPTION("Microchip Technology Inc. PCIe to UART module");  MODULE_AUTHOR("Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>");  MODULE_AUTHOR("Tharun Kumar P <tharunkumar.pasumarthi@microchip.com>"); diff --git a/drivers/tty/serial/8250/8250_pcilib.c b/drivers/tty/serial/8250/8250_pcilib.c index 3bdccf76f71d..d8d0ae0d7238 100644 --- a/drivers/tty/serial/8250/8250_pcilib.c +++ b/drivers/tty/serial/8250/8250_pcilib.c @@ -19,7 +19,7 @@ int serial_8250_warn_need_ioport(struct pci_dev *dev)  	return -ENXIO;  } -EXPORT_SYMBOL_NS_GPL(serial_8250_warn_need_ioport, SERIAL_8250_PCI); +EXPORT_SYMBOL_NS_GPL(serial_8250_warn_need_ioport, "SERIAL_8250_PCI");  int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port,  		   u8 bar, unsigned int offset, int regshift) @@ -47,6 +47,6 @@ int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port,  	}  	return 0;  } -EXPORT_SYMBOL_NS_GPL(serial8250_pci_setup_port, SERIAL_8250_PCI); +EXPORT_SYMBOL_NS_GPL(serial8250_pci_setup_port, "SERIAL_8250_PCI");  MODULE_DESCRIPTION("8250 PCI library");  MODULE_LICENSE("GPL"); diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 4d63d80e78a9..649e74e9b52f 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -467,7 +467,8 @@ static void set_io_from_upio(struct uart_port *p)  		break;  #endif  	default: -		WARN(1, "Unsupported UART type %x\n", p->iotype); +		WARN(p->iotype != UPIO_PORT || p->iobase, +		     "Unsupported UART type %x\n", p->iotype);  		p->serial_in = no_serial_in;  		p->serial_out = no_serial_out;  	} diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 17f70e4bee43..9c59ec128bb4 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -2692,7 +2692,7 @@ static void imx_uart_enable_wakeup(struct imx_port *sport, bool on)  {  	u32 ucr3; -	uart_port_lock(&sport->port); +	uart_port_lock_irq(&sport->port);  	ucr3 = imx_uart_readl(sport, UCR3);  	if (on) { @@ -2714,7 +2714,7 @@ static void imx_uart_enable_wakeup(struct imx_port *sport, bool on)  		imx_uart_writel(sport, ucr1, UCR1);  	} -	uart_port_unlock(&sport->port); +	uart_port_unlock_irq(&sport->port);  }  static int imx_uart_suspend_noirq(struct device *dev) diff --git a/drivers/tty/serial/men_z135_uart.c b/drivers/tty/serial/men_z135_uart.c index 4bff422bb1bc..9cc15449b673 100644 --- a/drivers/tty/serial/men_z135_uart.c +++ b/drivers/tty/serial/men_z135_uart.c @@ -920,4 +920,4 @@ MODULE_AUTHOR("Johannes Thumshirn <johannes.thumshirn@men.de>");  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("MEN 16z135 High Speed UART");  MODULE_ALIAS("mcb:16z135"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index 9d0c971e49f5..a3093e09309f 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c @@ -8,7 +8,7 @@   */  #undef DEFAULT_SYMBOL_NAMESPACE -#define DEFAULT_SYMBOL_NAMESPACE SERIAL_NXP_SC16IS7XX +#define DEFAULT_SYMBOL_NAMESPACE "SERIAL_NXP_SC16IS7XX"  #include <linux/bits.h>  #include <linux/clk.h> diff --git a/drivers/tty/serial/sc16is7xx_i2c.c b/drivers/tty/serial/sc16is7xx_i2c.c index 3ed47c306d85..cd7de9e057b8 100644 --- a/drivers/tty/serial/sc16is7xx_i2c.c +++ b/drivers/tty/serial/sc16is7xx_i2c.c @@ -64,4 +64,4 @@ module_i2c_driver(sc16is7xx_i2c_driver);  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("SC16IS7xx I2C interface driver"); -MODULE_IMPORT_NS(SERIAL_NXP_SC16IS7XX); +MODULE_IMPORT_NS("SERIAL_NXP_SC16IS7XX"); diff --git a/drivers/tty/serial/sc16is7xx_spi.c b/drivers/tty/serial/sc16is7xx_spi.c index 73df36f8a7fd..20d736b657b1 100644 --- a/drivers/tty/serial/sc16is7xx_spi.c +++ b/drivers/tty/serial/sc16is7xx_spi.c @@ -87,4 +87,4 @@ module_spi_driver(sc16is7xx_spi_driver);  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("SC16IS7xx SPI interface driver"); -MODULE_IMPORT_NS(SERIAL_NXP_SC16IS7XX); +MODULE_IMPORT_NS("SERIAL_NXP_SC16IS7XX"); diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index df523c744423..924b803af440 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -157,6 +157,7 @@ struct sci_port {  	bool has_rtscts;  	bool autorts; +	bool tx_occurred;  };  #define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTS @@ -850,6 +851,7 @@ static void sci_transmit_chars(struct uart_port *port)  {  	struct tty_port *tport = &port->state->port;  	unsigned int stopped = uart_tx_stopped(port); +	struct sci_port *s = to_sci_port(port);  	unsigned short status;  	unsigned short ctrl;  	int count; @@ -885,6 +887,7 @@ static void sci_transmit_chars(struct uart_port *port)  		}  		sci_serial_out(port, SCxTDR, c); +		s->tx_occurred = true;  		port->icount.tx++;  	} while (--count > 0); @@ -1241,6 +1244,8 @@ static void sci_dma_tx_complete(void *arg)  	if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS)  		uart_write_wakeup(port); +	s->tx_occurred = true; +  	if (!kfifo_is_empty(&tport->xmit_fifo)) {  		s->cookie_tx = 0;  		schedule_work(&s->work_tx); @@ -1731,6 +1736,19 @@ static void sci_flush_buffer(struct uart_port *port)  		s->cookie_tx = -EINVAL;  	}  } + +static void sci_dma_check_tx_occurred(struct sci_port *s) +{ +	struct dma_tx_state state; +	enum dma_status status; + +	if (!s->chan_tx) +		return; + +	status = dmaengine_tx_status(s->chan_tx, s->cookie_tx, &state); +	if (status == DMA_COMPLETE || status == DMA_IN_PROGRESS) +		s->tx_occurred = true; +}  #else /* !CONFIG_SERIAL_SH_SCI_DMA */  static inline void sci_request_dma(struct uart_port *port)  { @@ -1740,6 +1758,10 @@ static inline void sci_free_dma(struct uart_port *port)  {  } +static void sci_dma_check_tx_occurred(struct sci_port *s) +{ +} +  #define sci_flush_buffer	NULL  #endif /* !CONFIG_SERIAL_SH_SCI_DMA */ @@ -2076,6 +2098,12 @@ static unsigned int sci_tx_empty(struct uart_port *port)  {  	unsigned short status = sci_serial_in(port, SCxSR);  	unsigned short in_tx_fifo = sci_txfill(port); +	struct sci_port *s = to_sci_port(port); + +	sci_dma_check_tx_occurred(s); + +	if (!s->tx_occurred) +		return TIOCSER_TEMT;  	return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;  } @@ -2247,6 +2275,7 @@ static int sci_startup(struct uart_port *port)  	dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); +	s->tx_occurred = false;  	sci_request_dma(port);  	ret = sci_request_irq(s); diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c index 7dc254546075..1ec5d8c3aef8 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c @@ -1051,14 +1051,14 @@ static void stm32_usart_break_ctl(struct uart_port *port, int break_state)  	const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs;  	unsigned long flags; -	spin_lock_irqsave(&port->lock, flags); +	uart_port_lock_irqsave(port, &flags);  	if (break_state)  		stm32_usart_set_bits(port, ofs->rqr, USART_RQR_SBKRQ);  	else  		stm32_usart_clr_bits(port, ofs->rqr, USART_RQR_SBKRQ); -	spin_unlock_irqrestore(&port->lock, flags); +	uart_port_unlock_irqrestore(port, flags);  }  static int stm32_usart_startup(struct uart_port *port) diff --git a/drivers/ufs/core/ufs-sysfs.c b/drivers/ufs/core/ufs-sysfs.c index 265f21133b63..796e37a1d859 100644 --- a/drivers/ufs/core/ufs-sysfs.c +++ b/drivers/ufs/core/ufs-sysfs.c @@ -670,6 +670,9 @@ static ssize_t read_req_latency_avg_show(struct device *dev,  	struct ufs_hba *hba = dev_get_drvdata(dev);  	struct ufs_hba_monitor *m = &hba->monitor; +	if (!m->nr_req[READ]) +		return sysfs_emit(buf, "0\n"); +  	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[READ]),  						 m->nr_req[READ]));  } @@ -737,6 +740,9 @@ static ssize_t write_req_latency_avg_show(struct device *dev,  	struct ufs_hba *hba = dev_get_drvdata(dev);  	struct ufs_hba_monitor *m = &hba->monitor; +	if (!m->nr_req[WRITE]) +		return sysfs_emit(buf, "0\n"); +  	return sysfs_emit(buf, "%llu\n", div_u64(ktime_to_us(m->lat_sum[WRITE]),  						 m->nr_req[WRITE]));  } diff --git a/drivers/ufs/core/ufs_bsg.c b/drivers/ufs/core/ufs_bsg.c index 433d0480391e..6c09d97ae006 100644 --- a/drivers/ufs/core/ufs_bsg.c +++ b/drivers/ufs/core/ufs_bsg.c @@ -170,7 +170,7 @@ static int ufs_bsg_request(struct bsg_job *job)  		break;  	case UPIU_TRANSACTION_UIC_CMD:  		memcpy(&uc, &bsg_request->upiu_req.uc, UIC_CMD_SIZE); -		ret = ufshcd_send_uic_cmd(hba, &uc); +		ret = ufshcd_send_bsg_uic_cmd(hba, &uc);  		if (ret)  			dev_err(hba->dev, "send uic cmd: error code %d\n", ret); diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h index 7aea8fbaeee8..786f20ef2238 100644 --- a/drivers/ufs/core/ufshcd-priv.h +++ b/drivers/ufs/core/ufshcd-priv.h @@ -84,6 +84,7 @@ int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index,  			    u8 **buf, bool ascii);  int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd); +int ufshcd_send_bsg_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd);  int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,  			     struct utp_upiu_req *req_upiu, @@ -236,12 +237,6 @@ static inline void ufshcd_vops_config_scaling_param(struct ufs_hba *hba,  		hba->vops->config_scaling_param(hba, p, data);  } -static inline void ufshcd_vops_reinit_notify(struct ufs_hba *hba) -{ -	if (hba->vops && hba->vops->reinit_notify) -		hba->vops->reinit_notify(hba); -} -  static inline int ufshcd_vops_mcq_config_resource(struct ufs_hba *hba)  {  	if (hba->vops && hba->vops->mcq_config_resource) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 6a2685333076..9c26e8767515 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -4320,6 +4320,42 @@ out_unlock:  }  /** + * ufshcd_send_bsg_uic_cmd - Send UIC commands requested via BSG layer and retrieve the result + * @hba: per adapter instance + * @uic_cmd: UIC command + * + * Return: 0 only if success. + */ +int ufshcd_send_bsg_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) +{ +	int ret; + +	if (hba->quirks & UFSHCD_QUIRK_BROKEN_UIC_CMD) +		return 0; + +	ufshcd_hold(hba); + +	if (uic_cmd->argument1 == UIC_ARG_MIB(PA_PWRMODE) && +	    uic_cmd->command == UIC_CMD_DME_SET) { +		ret = ufshcd_uic_pwr_ctrl(hba, uic_cmd); +		goto out; +	} + +	mutex_lock(&hba->uic_cmd_mutex); +	ufshcd_add_delay_before_dme_cmd(hba); + +	ret = __ufshcd_send_uic_cmd(hba, uic_cmd); +	if (!ret) +		ret = ufshcd_wait_for_uic_cmd(hba, uic_cmd); + +	mutex_unlock(&hba->uic_cmd_mutex); + +out: +	ufshcd_release(hba); +	return ret; +} + +/**   * ufshcd_uic_change_pwr_mode - Perform the UIC power mode chage   *				using DME_SET primitives.   * @hba: per adapter instance @@ -4635,9 +4671,6 @@ static int ufshcd_change_power_mode(struct ufs_hba *hba,  		dev_err(hba->dev,  			"%s: power mode change failed %d\n", __func__, ret);  	} else { -		ufshcd_vops_pwr_change_notify(hba, POST_CHANGE, NULL, -								pwr_mode); -  		memcpy(&hba->pwr_info, pwr_mode,  			sizeof(struct ufs_pa_layer_attr));  	} @@ -4666,6 +4699,10 @@ int ufshcd_config_pwr_mode(struct ufs_hba *hba,  	ret = ufshcd_change_power_mode(hba, &final_params); +	if (!ret) +		ufshcd_vops_pwr_change_notify(hba, POST_CHANGE, NULL, +					&final_params); +  	return ret;  }  EXPORT_SYMBOL_GPL(ufshcd_config_pwr_mode); @@ -5519,6 +5556,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,  	lrbp = &hba->lrb[task_tag];  	lrbp->compl_time_stamp = ktime_get(); +	lrbp->compl_time_stamp_local_clock = local_clock();  	cmd = lrbp->cmd;  	if (cmd) {  		if (unlikely(ufshcd_should_inform_monitor(hba, lrbp))) @@ -8820,7 +8858,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params)  		ufshcd_device_reset(hba);  		ufs_put_device_desc(hba);  		ufshcd_hba_stop(hba); -		ufshcd_vops_reinit_notify(hba);  		ret = ufshcd_hba_enable(hba);  		if (ret) {  			dev_err(hba->dev, "Host controller enable failed\n"); @@ -10195,6 +10232,7 @@ void ufshcd_remove(struct ufs_hba *hba)  	ufs_hwmon_remove(hba);  	ufs_bsg_remove(hba);  	ufs_sysfs_remove_nodes(hba->dev); +	cancel_delayed_work_sync(&hba->ufs_rtc_update_work);  	blk_mq_destroy_queue(hba->tmf_queue);  	blk_put_queue(hba->tmf_queue);  	blk_mq_free_tag_set(&hba->tmf_tag_set); @@ -10552,14 +10590,17 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)  	}  	/* -	 * Set the default power management level for runtime and system PM. +	 * Set the default power management level for runtime and system PM if +	 * not set by the host controller drivers.  	 * Default power saving mode is to keep UFS link in Hibern8 state  	 * and UFS device in sleep state.  	 */ -	hba->rpm_lvl = ufs_get_desired_pm_lvl_for_dev_link_state( +	if (!hba->rpm_lvl) +		hba->rpm_lvl = ufs_get_desired_pm_lvl_for_dev_link_state(  						UFS_SLEEP_PWR_MODE,  						UIC_LINK_HIBERN8_STATE); -	hba->spm_lvl = ufs_get_desired_pm_lvl_for_dev_link_state( +	if (!hba->spm_lvl) +		hba->spm_lvl = ufs_get_desired_pm_lvl_for_dev_link_state(  						UFS_SLEEP_PWR_MODE,  						UIC_LINK_HIBERN8_STATE); diff --git a/drivers/ufs/host/cdns-pltfrm.c b/drivers/ufs/host/cdns-pltfrm.c index 66811d8d1929..e793e3538c48 100644 --- a/drivers/ufs/host/cdns-pltfrm.c +++ b/drivers/ufs/host/cdns-pltfrm.c @@ -307,9 +307,7 @@ static int cdns_ufs_pltfrm_probe(struct platform_device *pdev)   */  static void cdns_ufs_pltfrm_remove(struct platform_device *pdev)  { -	struct ufs_hba *hba =  platform_get_drvdata(pdev); - -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  }  static const struct dev_pm_ops cdns_ufs_dev_pm_ops = { @@ -321,7 +319,7 @@ static const struct dev_pm_ops cdns_ufs_dev_pm_ops = {  static struct platform_driver cdns_ufs_pltfrm_driver = {  	.probe	= cdns_ufs_pltfrm_probe, -	.remove_new = cdns_ufs_pltfrm_remove, +	.remove = cdns_ufs_pltfrm_remove,  	.driver	= {  		.name   = "cdns-ufshcd",  		.pm     = &cdns_ufs_dev_pm_ops, diff --git a/drivers/ufs/host/tc-dwc-g210-pltfrm.c b/drivers/ufs/host/tc-dwc-g210-pltfrm.c index a3877592604d..454ac88c357d 100644 --- a/drivers/ufs/host/tc-dwc-g210-pltfrm.c +++ b/drivers/ufs/host/tc-dwc-g210-pltfrm.c @@ -76,10 +76,7 @@ static int tc_dwc_g210_pltfm_probe(struct platform_device *pdev)   */  static void tc_dwc_g210_pltfm_remove(struct platform_device *pdev)  { -	struct ufs_hba *hba =  platform_get_drvdata(pdev); - -	pm_runtime_get_sync(&(pdev)->dev); -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  }  static const struct dev_pm_ops tc_dwc_g210_pltfm_pm_ops = { @@ -89,7 +86,7 @@ static const struct dev_pm_ops tc_dwc_g210_pltfm_pm_ops = {  static struct platform_driver tc_dwc_g210_pltfm_driver = {  	.probe		= tc_dwc_g210_pltfm_probe, -	.remove_new	= tc_dwc_g210_pltfm_remove, +	.remove		= tc_dwc_g210_pltfm_remove,  	.driver		= {  		.name	= "tc-dwc-g210-pltfm",  		.pm	= &tc_dwc_g210_pltfm_pm_ops, diff --git a/drivers/ufs/host/ti-j721e-ufs.c b/drivers/ufs/host/ti-j721e-ufs.c index 250c22df000d..21214e5d5896 100644 --- a/drivers/ufs/host/ti-j721e-ufs.c +++ b/drivers/ufs/host/ti-j721e-ufs.c @@ -83,7 +83,7 @@ MODULE_DEVICE_TABLE(of, ti_j721e_ufs_of_match);  static struct platform_driver ti_j721e_ufs_driver = {  	.probe	= ti_j721e_ufs_probe, -	.remove_new = ti_j721e_ufs_remove, +	.remove = ti_j721e_ufs_remove,  	.driver	= {  		.name   = "ti-j721e-ufs",  		.of_match_table = ti_j721e_ufs_of_match, diff --git a/drivers/ufs/host/ufs-exynos.c b/drivers/ufs/host/ufs-exynos.c index 6548f7a8562f..13dd5dfc03eb 100644 --- a/drivers/ufs/host/ufs-exynos.c +++ b/drivers/ufs/host/ufs-exynos.c @@ -1992,8 +1992,7 @@ static void exynos_ufs_remove(struct platform_device *pdev)  	struct ufs_hba *hba =  platform_get_drvdata(pdev);  	struct exynos_ufs *ufs = ufshcd_get_variant(hba); -	pm_runtime_get_sync(&(pdev)->dev); -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  	phy_power_off(ufs->phy);  	phy_exit(ufs->phy); @@ -2166,7 +2165,7 @@ static const struct dev_pm_ops exynos_ufs_pm_ops = {  static struct platform_driver exynos_ufs_pltform = {  	.probe	= exynos_ufs_probe, -	.remove_new = exynos_ufs_remove, +	.remove = exynos_ufs_remove,  	.driver	= {  		.name	= "exynos-ufshc",  		.pm	= &exynos_ufs_pm_ops, diff --git a/drivers/ufs/host/ufs-hisi.c b/drivers/ufs/host/ufs-hisi.c index 5ee73ff05251..6e6569de74d8 100644 --- a/drivers/ufs/host/ufs-hisi.c +++ b/drivers/ufs/host/ufs-hisi.c @@ -576,9 +576,7 @@ static int ufs_hisi_probe(struct platform_device *pdev)  static void ufs_hisi_remove(struct platform_device *pdev)  { -	struct ufs_hba *hba =  platform_get_drvdata(pdev); - -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  }  static const struct dev_pm_ops ufs_hisi_pm_ops = { @@ -590,7 +588,7 @@ static const struct dev_pm_ops ufs_hisi_pm_ops = {  static struct platform_driver ufs_hisi_pltform = {  	.probe	= ufs_hisi_probe, -	.remove_new = ufs_hisi_remove, +	.remove = ufs_hisi_remove,  	.driver	= {  		.name	= "ufshcd-hisi",  		.pm	= &ufs_hisi_pm_ops, diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c index 06ab1e5e8b6f..135cd78109e2 100644 --- a/drivers/ufs/host/ufs-mediatek.c +++ b/drivers/ufs/host/ufs-mediatek.c @@ -1879,10 +1879,7 @@ out:   */  static void ufs_mtk_remove(struct platform_device *pdev)  { -	struct ufs_hba *hba =  platform_get_drvdata(pdev); - -	pm_runtime_get_sync(&(pdev)->dev); -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  }  #ifdef CONFIG_PM_SLEEP @@ -1962,7 +1959,7 @@ static const struct dev_pm_ops ufs_mtk_pm_ops = {  static struct platform_driver ufs_mtk_pltform = {  	.probe      = ufs_mtk_probe, -	.remove_new = ufs_mtk_remove, +	.remove = ufs_mtk_remove,  	.driver = {  		.name   = "ufshcd-mtk",  		.pm     = &ufs_mtk_pm_ops, diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c index 3b592492e152..91e94fe990b4 100644 --- a/drivers/ufs/host/ufs-qcom.c +++ b/drivers/ufs/host/ufs-qcom.c @@ -368,6 +368,11 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)  	if (ret)  		return ret; +	if (phy->power_count) { +		phy_power_off(phy); +		phy_exit(phy); +	} +  	/* phy initialization - calibrate the phy */  	ret = phy_init(phy);  	if (ret) { @@ -866,6 +871,7 @@ static u32 ufs_qcom_get_ufs_hci_version(struct ufs_hba *hba)   */  static void ufs_qcom_advertise_quirks(struct ufs_hba *hba)  { +	const struct ufs_qcom_drvdata *drvdata = of_device_get_match_data(hba->dev);  	struct ufs_qcom_host *host = ufshcd_get_variant(hba);  	if (host->hw_ver.major == 0x2) @@ -874,9 +880,8 @@ static void ufs_qcom_advertise_quirks(struct ufs_hba *hba)  	if (host->hw_ver.major > 0x3)  		hba->quirks |= UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH; -	if (of_device_is_compatible(hba->dev->of_node, "qcom,sm8550-ufshc") || -	    of_device_is_compatible(hba->dev->of_node, "qcom,sm8650-ufshc")) -		hba->quirks |= UFSHCD_QUIRK_BROKEN_LSDBS_CAP; +	if (drvdata && drvdata->quirks) +		hba->quirks |= drvdata->quirks;  }  static void ufs_qcom_set_phy_gear(struct ufs_qcom_host *host) @@ -1064,6 +1069,7 @@ static int ufs_qcom_init(struct ufs_hba *hba)  	struct device *dev = hba->dev;  	struct ufs_qcom_host *host;  	struct ufs_clk_info *clki; +	const struct ufs_qcom_drvdata *drvdata = of_device_get_match_data(hba->dev);  	host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);  	if (!host) @@ -1143,6 +1149,9 @@ static int ufs_qcom_init(struct ufs_hba *hba)  		dev_warn(dev, "%s: failed to configure the testbus %d\n",  				__func__, err); +	if (drvdata && drvdata->no_phy_retention) +		hba->spm_lvl = UFS_PM_LVL_5; +  	return 0;  out_variant_clear: @@ -1579,13 +1588,6 @@ static void ufs_qcom_config_scaling_param(struct ufs_hba *hba,  }  #endif -static void ufs_qcom_reinit_notify(struct ufs_hba *hba) -{ -	struct ufs_qcom_host *host = ufshcd_get_variant(hba); - -	phy_power_off(host->generic_phy); -} -  /* Resources */  static const struct ufshcd_res_info ufs_res_info[RES_MAX] = {  	{.name = "ufs_mem",}, @@ -1825,7 +1827,6 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = {  	.device_reset		= ufs_qcom_device_reset,  	.config_scaling_param = ufs_qcom_config_scaling_param,  	.program_key		= ufs_qcom_ice_program_key, -	.reinit_notify		= ufs_qcom_reinit_notify,  	.mcq_config_resource	= ufs_qcom_mcq_config_resource,  	.get_hba_mac		= ufs_qcom_get_hba_mac,  	.op_runtime_config	= ufs_qcom_op_runtime_config, @@ -1861,15 +1862,22 @@ static int ufs_qcom_probe(struct platform_device *pdev)  static void ufs_qcom_remove(struct platform_device *pdev)  {  	struct ufs_hba *hba =  platform_get_drvdata(pdev); +	struct ufs_qcom_host *host = ufshcd_get_variant(hba); -	pm_runtime_get_sync(&(pdev)->dev); -	ufshcd_remove(hba); -	platform_device_msi_free_irqs_all(hba->dev); +	ufshcd_pltfrm_remove(pdev); +	if (host->esi_enabled) +		platform_device_msi_free_irqs_all(hba->dev);  } +static const struct ufs_qcom_drvdata ufs_qcom_sm8550_drvdata = { +	.quirks = UFSHCD_QUIRK_BROKEN_LSDBS_CAP, +	.no_phy_retention = true, +}; +  static const struct of_device_id ufs_qcom_of_match[] __maybe_unused = {  	{ .compatible = "qcom,ufshc" }, -	{ .compatible = "qcom,sm8550-ufshc" }, +	{ .compatible = "qcom,sm8550-ufshc", .data = &ufs_qcom_sm8550_drvdata }, +	{ .compatible = "qcom,sm8650-ufshc", .data = &ufs_qcom_sm8550_drvdata },  	{},  };  MODULE_DEVICE_TABLE(of, ufs_qcom_of_match); @@ -1897,7 +1905,7 @@ static const struct dev_pm_ops ufs_qcom_pm_ops = {  static struct platform_driver ufs_qcom_pltform = {  	.probe	= ufs_qcom_probe, -	.remove_new = ufs_qcom_remove, +	.remove = ufs_qcom_remove,  	.driver	= {  		.name	= "ufshcd-qcom",  		.pm	= &ufs_qcom_pm_ops, diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h index b9de170983c9..919f53682beb 100644 --- a/drivers/ufs/host/ufs-qcom.h +++ b/drivers/ufs/host/ufs-qcom.h @@ -217,6 +217,11 @@ struct ufs_qcom_host {  	bool esi_enabled;  }; +struct ufs_qcom_drvdata { +	enum ufshcd_quirks quirks; +	bool no_phy_retention; +}; +  static inline u32  ufs_qcom_get_debug_reg_offset(struct ufs_qcom_host *host, u32 reg)  { diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c index 3ff97112e1f6..03cd82db751b 100644 --- a/drivers/ufs/host/ufs-renesas.c +++ b/drivers/ufs/host/ufs-renesas.c @@ -397,14 +397,12 @@ static int ufs_renesas_probe(struct platform_device *pdev)  static void ufs_renesas_remove(struct platform_device *pdev)  { -	struct ufs_hba *hba = platform_get_drvdata(pdev); - -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  }  static struct platform_driver ufs_renesas_platform = {  	.probe	= ufs_renesas_probe, -	.remove_new = ufs_renesas_remove, +	.remove = ufs_renesas_remove,  	.driver	= {  		.name	= "ufshcd-renesas",  		.of_match_table	= of_match_ptr(ufs_renesas_of_match), diff --git a/drivers/ufs/host/ufs-sprd.c b/drivers/ufs/host/ufs-sprd.c index d8b165908809..b1d532363f9d 100644 --- a/drivers/ufs/host/ufs-sprd.c +++ b/drivers/ufs/host/ufs-sprd.c @@ -427,10 +427,7 @@ static int ufs_sprd_probe(struct platform_device *pdev)  static void ufs_sprd_remove(struct platform_device *pdev)  { -	struct ufs_hba *hba =  platform_get_drvdata(pdev); - -	pm_runtime_get_sync(&(pdev)->dev); -	ufshcd_remove(hba); +	ufshcd_pltfrm_remove(pdev);  }  static const struct dev_pm_ops ufs_sprd_pm_ops = { @@ -442,7 +439,7 @@ static const struct dev_pm_ops ufs_sprd_pm_ops = {  static struct platform_driver ufs_sprd_pltform = {  	.probe = ufs_sprd_probe, -	.remove_new = ufs_sprd_remove, +	.remove = ufs_sprd_remove,  	.driver = {  		.name = "ufshcd-sprd",  		.pm = &ufs_sprd_pm_ops, diff --git a/drivers/ufs/host/ufshcd-pltfrm.c b/drivers/ufs/host/ufshcd-pltfrm.c index 1f4f30d6cb42..505572d4fa87 100644 --- a/drivers/ufs/host/ufshcd-pltfrm.c +++ b/drivers/ufs/host/ufshcd-pltfrm.c @@ -524,6 +524,22 @@ out:  }  EXPORT_SYMBOL_GPL(ufshcd_pltfrm_init); +/** + * ufshcd_pltfrm_remove - Remove ufshcd platform + * @pdev: pointer to Platform device handle + */ +void ufshcd_pltfrm_remove(struct platform_device *pdev) +{ +	struct ufs_hba *hba =  platform_get_drvdata(pdev); + +	pm_runtime_get_sync(&pdev->dev); +	ufshcd_remove(hba); +	ufshcd_dealloc_host(hba); +	pm_runtime_disable(&pdev->dev); +	pm_runtime_put_noidle(&pdev->dev); +} +EXPORT_SYMBOL_GPL(ufshcd_pltfrm_remove); +  MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");  MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");  MODULE_DESCRIPTION("UFS host controller Platform bus based glue driver"); diff --git a/drivers/ufs/host/ufshcd-pltfrm.h b/drivers/ufs/host/ufshcd-pltfrm.h index df387be5216b..3017f8e8f93c 100644 --- a/drivers/ufs/host/ufshcd-pltfrm.h +++ b/drivers/ufs/host/ufshcd-pltfrm.h @@ -31,6 +31,7 @@ int ufshcd_negotiate_pwr_params(const struct ufs_host_params *host_params,  void ufshcd_init_host_params(struct ufs_host_params *host_params);  int ufshcd_pltfrm_init(struct platform_device *pdev,  		       const struct ufs_hba_variant_ops *vops); +void ufshcd_pltfrm_remove(struct platform_device *pdev);  int ufshcd_populate_vreg(struct device *dev, const char *name,  			 struct ufs_vreg **out_vreg, bool skip_current); diff --git a/drivers/uio/uio_fsl_elbc_gpcm.c b/drivers/uio/uio_fsl_elbc_gpcm.c index 496caff66e7e..81454c3e2484 100644 --- a/drivers/uio/uio_fsl_elbc_gpcm.c +++ b/drivers/uio/uio_fsl_elbc_gpcm.c @@ -453,7 +453,7 @@ static struct platform_driver uio_fsl_elbc_gpcm_driver = {  		.dev_groups = uio_fsl_elbc_gpcm_groups,  	},  	.probe = uio_fsl_elbc_gpcm_probe, -	.remove_new = uio_fsl_elbc_gpcm_remove, +	.remove = uio_fsl_elbc_gpcm_remove,  };  module_platform_driver(uio_fsl_elbc_gpcm_driver); diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c index f2801700be8e..1a7fc638213e 100644 --- a/drivers/usb/chipidea/ci_hdrc_imx.c +++ b/drivers/usb/chipidea/ci_hdrc_imx.c @@ -370,25 +370,29 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)  		data->pinctrl = devm_pinctrl_get(dev);  		if (PTR_ERR(data->pinctrl) == -ENODEV)  			data->pinctrl = NULL; -		else if (IS_ERR(data->pinctrl)) -			return dev_err_probe(dev, PTR_ERR(data->pinctrl), +		else if (IS_ERR(data->pinctrl)) { +			ret = dev_err_probe(dev, PTR_ERR(data->pinctrl),  					     "pinctrl get failed\n"); +			goto err_put; +		}  		data->hsic_pad_regulator =  				devm_regulator_get_optional(dev, "hsic");  		if (PTR_ERR(data->hsic_pad_regulator) == -ENODEV) {  			/* no pad regulator is needed */  			data->hsic_pad_regulator = NULL; -		} else if (IS_ERR(data->hsic_pad_regulator)) -			return dev_err_probe(dev, PTR_ERR(data->hsic_pad_regulator), +		} else if (IS_ERR(data->hsic_pad_regulator)) { +			ret = dev_err_probe(dev, PTR_ERR(data->hsic_pad_regulator),  					     "Get HSIC pad regulator error\n"); +			goto err_put; +		}  		if (data->hsic_pad_regulator) {  			ret = regulator_enable(data->hsic_pad_regulator);  			if (ret) {  				dev_err(dev,  					"Failed to enable HSIC pad regulator\n"); -				return ret; +				goto err_put;  			}  		}  	} @@ -402,13 +406,14 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)  			dev_err(dev,  				"pinctrl_hsic_idle lookup failed, err=%ld\n",  					PTR_ERR(pinctrl_hsic_idle)); -			return PTR_ERR(pinctrl_hsic_idle); +			ret = PTR_ERR(pinctrl_hsic_idle); +			goto err_put;  		}  		ret = pinctrl_select_state(data->pinctrl, pinctrl_hsic_idle);  		if (ret) {  			dev_err(dev, "hsic_idle select failed, err=%d\n", ret); -			return ret; +			goto err_put;  		}  		data->pinctrl_hsic_active = pinctrl_lookup_state(data->pinctrl, @@ -417,7 +422,8 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)  			dev_err(dev,  				"pinctrl_hsic_active lookup failed, err=%ld\n",  					PTR_ERR(data->pinctrl_hsic_active)); -			return PTR_ERR(data->pinctrl_hsic_active); +			ret = PTR_ERR(data->pinctrl_hsic_active); +			goto err_put;  		}  	} @@ -527,6 +533,8 @@ disable_hsic_regulator:  	if (pdata.flags & CI_HDRC_PMQOS)  		cpu_latency_qos_remove_request(&data->pm_qos_req);  	data->ci_pdev = NULL; +err_put: +	put_device(data->usbmisc_data->dev);  	return ret;  } @@ -551,6 +559,7 @@ static void ci_hdrc_imx_remove(struct platform_device *pdev)  		if (data->hsic_pad_regulator)  			regulator_disable(data->hsic_pad_regulator);  	} +	put_device(data->usbmisc_data->dev);  }  static void ci_hdrc_imx_shutdown(struct platform_device *pdev) diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 5a2e43331064..ff1a941fd2ed 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -1337,11 +1337,12 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)  	if (protocol < USBLP_FIRST_PROTOCOL || protocol > USBLP_LAST_PROTOCOL)  		return -EINVAL; +	alts = usblp->protocol[protocol].alt_setting; +	if (alts < 0) +		return -EINVAL; +  	/* Don't unnecessarily set the interface if there's a single alt. */  	if (usblp->intf->num_altsetting > 1) { -		alts = usblp->protocol[protocol].alt_setting; -		if (alts < 0) -			return -EINVAL;  		r = usb_set_interface(usblp->dev, usblp->ifnum, alts);  		if (r < 0) {  			printk(KERN_ERR "usblp: can't set desired altsetting %d on interface %d\n", diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 500dc35e6477..0b2490347b9f 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2794,8 +2794,14 @@ int usb_add_hcd(struct usb_hcd *hcd,  	int retval;  	struct usb_device *rhdev;  	struct usb_hcd *shared_hcd; +	int skip_phy_initialization; -	if (!hcd->skip_phy_initialization) { +	if (usb_hcd_is_primary_hcd(hcd)) +		skip_phy_initialization = hcd->skip_phy_initialization; +	else +		skip_phy_initialization = hcd->primary_hcd->skip_phy_initialization; + +	if (!skip_phy_initialization) {  		if (usb_hcd_is_primary_hcd(hcd)) {  			hcd->phy_roothub = usb_phy_roothub_alloc(hcd->self.sysdev);  			if (IS_ERR(hcd->phy_roothub)) diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 4b93c0bd1d4b..21ac9b464696 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -2663,13 +2663,13 @@ int usb_new_device(struct usb_device *udev)  		err = sysfs_create_link(&udev->dev.kobj,  				&port_dev->dev.kobj, "port");  		if (err) -			goto fail; +			goto out_del_dev;  		err = sysfs_create_link(&port_dev->dev.kobj,  				&udev->dev.kobj, "device");  		if (err) {  			sysfs_remove_link(&udev->dev.kobj, "port"); -			goto fail; +			goto out_del_dev;  		}  		if (!test_and_set_bit(port1, hub->child_usage_bits)) @@ -2683,6 +2683,8 @@ int usb_new_device(struct usb_device *udev)  	pm_runtime_put_sync_autosuspend(&udev->dev);  	return err; +out_del_dev: +	device_del(&udev->dev);  fail:  	usb_set_device_state(udev, USB_STATE_NOTATTACHED);  	pm_runtime_disable(&udev->dev); diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index 45d7af00f8d1..e857e532b35a 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c @@ -453,10 +453,11 @@ static int usb_port_runtime_suspend(struct device *dev)  static void usb_port_shutdown(struct device *dev)  {  	struct usb_port *port_dev = to_usb_port(dev); +	struct usb_device *udev = port_dev->child; -	if (port_dev->child) { -		usb_disable_usb2_hardware_lpm(port_dev->child); -		usb_unlocked_disable_lpm(port_dev->child); +	if (udev && !udev->port_is_suspended) { +		usb_disable_usb2_hardware_lpm(udev); +		usb_unlocked_disable_lpm(udev);  	}  } diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index cb54390e7de4..8c3941ecaaf5 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -3546,11 +3546,9 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,  			port_status |= USB_PORT_STAT_C_OVERCURRENT << 16;  		} -		if (!hsotg->flags.b.port_connect_status) { +		if (dwc2_is_device_mode(hsotg)) {  			/* -			 * The port is disconnected, which means the core is -			 * either in device mode or it soon will be. Just -			 * return 0's for the remainder of the port status +			 * Just return 0's for the remainder of the port status  			 * since the port register can't be read if the core  			 * is in device mode.  			 */ @@ -3620,13 +3618,11 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,  		if (wvalue != USB_PORT_FEAT_TEST && (!windex || windex > 1))  			goto error; -		if (!hsotg->flags.b.port_connect_status) { +		if (dwc2_is_device_mode(hsotg)) {  			/* -			 * The port is disconnected, which means the core is -			 * either in device mode or it soon will be. Just -			 * return without doing anything since the port -			 * register can't be written if the core is in device -			 * mode. +			 * Just return 0's for the remainder of the port status +			 * since the port register can't be read if the core +			 * is in device mode.  			 */  			break;  		} @@ -4349,7 +4345,7 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)  	if (hsotg->bus_suspended)  		goto skip_power_saving; -	if (hsotg->flags.b.port_connect_status == 0) +	if (!(dwc2_read_hprt0(hsotg) & HPRT0_CONNSTS))  		goto skip_power_saving;  	switch (hsotg->params.power_down) { @@ -4431,6 +4427,7 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd)  	 * Power Down mode.  	 */  	if (hprt0 & HPRT0_CONNSTS) { +		set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);  		hsotg->lx_state = DWC2_L0;  		goto unlock;  	} diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index ee73789326bc..f11570c8ffd0 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -464,6 +464,7 @@  #define DWC3_DCTL_TRGTULST_SS_INACT	(DWC3_DCTL_TRGTULST(6))  /* These apply for core versions 1.94a and later */ +#define DWC3_DCTL_NYET_THRES_MASK	(0xf << 20)  #define DWC3_DCTL_NYET_THRES(n)		(((n) & 0xf) << 20)  #define DWC3_DCTL_KEEP_CONNECT		BIT(19) diff --git a/drivers/usb/dwc3/dwc3-am62.c b/drivers/usb/dwc3/dwc3-am62.c index 5e3d1741701f..7d43da5f2897 100644 --- a/drivers/usb/dwc3/dwc3-am62.c +++ b/drivers/usb/dwc3/dwc3-am62.c @@ -309,6 +309,7 @@ static void dwc3_ti_remove(struct platform_device *pdev)  	pm_runtime_put_sync(dev);  	pm_runtime_disable(dev); +	pm_runtime_dont_use_autosuspend(dev);  	pm_runtime_set_suspended(dev);  } diff --git a/drivers/usb/dwc3/dwc3-imx8mp.c b/drivers/usb/dwc3/dwc3-imx8mp.c index 356812cbcd88..3edc5aca76f9 100644 --- a/drivers/usb/dwc3/dwc3-imx8mp.c +++ b/drivers/usb/dwc3/dwc3-imx8mp.c @@ -129,6 +129,16 @@ static void dwc3_imx8mp_wakeup_disable(struct dwc3_imx8mp *dwc3_imx)  	writel(val, dwc3_imx->hsio_blk_base + USB_WAKEUP_CTRL);  } +static const struct property_entry dwc3_imx8mp_properties[] = { +	PROPERTY_ENTRY_BOOL("xhci-missing-cas-quirk"), +	PROPERTY_ENTRY_BOOL("xhci-skip-phy-init-quirk"), +	{}, +}; + +static const struct software_node dwc3_imx8mp_swnode = { +	.properties = dwc3_imx8mp_properties, +}; +  static irqreturn_t dwc3_imx8mp_interrupt(int irq, void *_dwc3_imx)  {  	struct dwc3_imx8mp	*dwc3_imx = _dwc3_imx; @@ -148,17 +158,6 @@ static irqreturn_t dwc3_imx8mp_interrupt(int irq, void *_dwc3_imx)  	return IRQ_HANDLED;  } -static int dwc3_imx8mp_set_software_node(struct device *dev) -{ -	struct property_entry props[3] = { 0 }; -	int prop_idx = 0; - -	props[prop_idx++] = PROPERTY_ENTRY_BOOL("xhci-missing-cas-quirk"); -	props[prop_idx++] = PROPERTY_ENTRY_BOOL("xhci-skip-phy-init-quirk"); - -	return device_create_managed_software_node(dev, props, NULL); -} -  static int dwc3_imx8mp_probe(struct platform_device *pdev)  {  	struct device		*dev = &pdev->dev; @@ -221,17 +220,17 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev)  	if (err < 0)  		goto disable_rpm; -	err = dwc3_imx8mp_set_software_node(dev); +	err = device_add_software_node(dev, &dwc3_imx8mp_swnode);  	if (err) {  		err = -ENODEV; -		dev_err(dev, "failed to create software node\n"); +		dev_err(dev, "failed to add software node\n");  		goto disable_rpm;  	}  	err = of_platform_populate(node, NULL, NULL, dev);  	if (err) {  		dev_err(&pdev->dev, "failed to create dwc3 core\n"); -		goto disable_rpm; +		goto remove_swnode;  	}  	dwc3_imx->dwc3 = of_find_device_by_node(dwc3_np); @@ -255,6 +254,8 @@ static int dwc3_imx8mp_probe(struct platform_device *pdev)  depopulate:  	of_platform_depopulate(dev); +remove_swnode: +	device_remove_software_node(dev);  disable_rpm:  	pm_runtime_disable(dev);  	pm_runtime_put_noidle(dev); @@ -268,6 +269,7 @@ static void dwc3_imx8mp_remove(struct platform_device *pdev)  	pm_runtime_get_sync(dev);  	of_platform_depopulate(dev); +	device_remove_software_node(dev);  	pm_runtime_disable(dev);  	pm_runtime_put_noidle(dev); diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-xilinx.c index e3738e1610db..a33a42ba0249 100644 --- a/drivers/usb/dwc3/dwc3-xilinx.c +++ b/drivers/usb/dwc3/dwc3-xilinx.c @@ -121,8 +121,11 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx *priv_data)  	 * in use but the usb3-phy entry is missing from the device tree.  	 * Therefore, skip these operations in this case.  	 */ -	if (!priv_data->usb3_phy) +	if (!priv_data->usb3_phy) { +		/* Deselect the PIPE Clock Select bit in FPD PIPE Clock register */ +		writel(PIPE_CLK_DESELECT, priv_data->regs + XLNX_USB_FPD_PIPE_CLK);  		goto skip_usb3_phy; +	}  	crst = devm_reset_control_get_exclusive(dev, "usb_crst");  	if (IS_ERR(crst)) { diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 83dc7304d701..31a654c6f15b 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -4195,8 +4195,10 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)  		WARN_ONCE(DWC3_VER_IS_PRIOR(DWC3, 240A) && dwc->has_lpm_erratum,  				"LPM Erratum not available on dwc3 revisions < 2.40a\n"); -		if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) +		if (dwc->has_lpm_erratum && !DWC3_VER_IS_PRIOR(DWC3, 240A)) { +			reg &= ~DWC3_DCTL_NYET_THRES_MASK;  			reg |= DWC3_DCTL_NYET_THRES(dwc->lpm_nyet_threshold); +		}  		dwc3_gadget_dctl_write_safe(dwc, reg);  	} else { diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 566ff0b1282a..76521555e3c1 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -211,6 +211,8 @@ config USB_F_MIDI  config USB_F_MIDI2  	tristate +	select SND_UMP +	select SND_UMP_LEGACY_RAWMIDI  config USB_F_HID  	tristate @@ -445,8 +447,6 @@ config USB_CONFIGFS_F_MIDI2  	depends on USB_CONFIGFS  	depends on SND  	select USB_LIBCOMPOSITE -	select SND_UMP -	select SND_UMP_LEGACY_RAWMIDI  	select USB_F_MIDI2  	help  	  The MIDI 2.0 function driver provides the generic emulated diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 6499a88d346c..fba2a56dae97 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -827,11 +827,15 @@ static ssize_t gadget_string_s_store(struct config_item *item, const char *page,  {  	struct gadget_string *string = to_gadget_string(item);  	int size = min(sizeof(string->string), len + 1); +	ssize_t cpy_len;  	if (len > USB_MAX_STRING_LEN)  		return -EINVAL; -	return strscpy(string->string, page, size); +	cpy_len = strscpy(string->string, page, size); +	if (cpy_len > 0 && string->string[cpy_len - 1] == '\n') +		string->string[cpy_len - 1] = 0; +	return len;  }  CONFIGFS_ATTR(gadget_string_, s); diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 2ccf7f4e4db1..2dea9e42a0f8 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -49,7 +49,7 @@  #define DMABUF_ENQUEUE_TIMEOUT_MS 5000 -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  /* Reference counter handling */  static void ffs_data_get(struct ffs_data *ffs); @@ -2285,7 +2285,7 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev)  	struct usb_gadget_strings **lang;  	int first_id; -	if (WARN_ON(ffs->state != FFS_ACTIVE +	if ((ffs->state != FFS_ACTIVE  		 || test_and_set_bit(FFS_FL_BOUND, &ffs->flags)))  		return -EBADFD; diff --git a/drivers/usb/gadget/function/f_midi2.c b/drivers/usb/gadget/function/f_midi2.c index ee3d9e3578f7..12e866fb311d 100644 --- a/drivers/usb/gadget/function/f_midi2.c +++ b/drivers/usb/gadget/function/f_midi2.c @@ -1591,7 +1591,11 @@ static int f_midi2_create_card(struct f_midi2 *midi2)  			fb->info.midi_ci_version = b->midi_ci_version;  			fb->info.ui_hint = reverse_dir(b->ui_hint);  			fb->info.sysex8_streams = b->sysex8_streams; -			fb->info.flags |= b->is_midi1; +			if (b->is_midi1 < 2) +				fb->info.flags |= b->is_midi1; +			else +				fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1 | +					SNDRV_UMP_BLOCK_IS_LOWSPEED;  			strscpy(fb->info.name, ump_fb_name(b),  				sizeof(fb->info.name));  		} diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index ce5b77f89190..9b324821c93b 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -1185,6 +1185,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)  		uac2->as_in_alt = 0;  	} +	std_ac_if_desc.bNumEndpoints = 0;  	if (FUOUT_EN(uac2_opts) || FUIN_EN(uac2_opts)) {  		uac2->int_ep = usb_ep_autoconfig(gadget, &fs_ep_int_desc);  		if (!uac2->int_ep) { diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c index 0a8c05b2746b..bc143a86c2dd 100644 --- a/drivers/usb/gadget/function/u_serial.c +++ b/drivers/usb/gadget/function/u_serial.c @@ -579,9 +579,12 @@ static int gs_start_io(struct gs_port *port)  		 * we didn't in gs_start_tx() */  		tty_wakeup(port->port.tty);  	} else { -		gs_free_requests(ep, head, &port->read_allocated); -		gs_free_requests(port->port_usb->in, &port->write_pool, -			&port->write_allocated); +		/* Free reqs only if we are still connected */ +		if (port->port_usb) { +			gs_free_requests(ep, head, &port->read_allocated); +			gs_free_requests(port->port_usb->in, &port->write_pool, +				&port->write_allocated); +		}  		status = -EIO;  	} @@ -1417,6 +1420,10 @@ void gserial_disconnect(struct gserial *gser)  	/* REVISIT as above: how best to track this? */  	port->port_line_coding = gser->port_line_coding; +	/* disable endpoints, aborting down any active I/O */ +	usb_ep_disable(gser->out); +	usb_ep_disable(gser->in); +  	port->port_usb = NULL;  	gser->ioport = NULL;  	if (port->port.count > 0) { @@ -1428,10 +1435,6 @@ void gserial_disconnect(struct gserial *gser)  	spin_unlock(&port->port_lock);  	spin_unlock_irqrestore(&serial_port_lock, flags); -	/* disable endpoints, aborting down any active I/O */ -	usb_ep_disable(gser->out); -	usb_ep_disable(gser->in); -  	/* finally, free any unused/unusable I/O buffers */  	spin_lock_irqsave(&port->port_lock, flags);  	if (port->port.count == 0) diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index 5d0d972fb7b1..2d23690d72c5 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c @@ -119,8 +119,12 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev)  	if (IS_ERR(priv->iclk))  		priv->iclk = NULL; -	clk_enable(priv->fclk); -	clk_enable(priv->iclk); +	ret = clk_enable(priv->fclk); +	if (ret) +		goto fail_request_resource; +	ret = clk_enable(priv->iclk); +	if (ret) +		goto fail_iclk;  	ret = usb_add_hcd(hcd, irq, IRQF_SHARED);  	if (ret != 0) { @@ -136,6 +140,7 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev)  fail_add_hcd:  	clk_disable(priv->iclk); +fail_iclk:  	clk_disable(priv->fclk);  fail_request_resource: diff --git a/drivers/usb/host/max3421-hcd.c b/drivers/usb/host/max3421-hcd.c index 9fe4f48b1898..0881fdd1823e 100644 --- a/drivers/usb/host/max3421-hcd.c +++ b/drivers/usb/host/max3421-hcd.c @@ -779,11 +779,17 @@ max3421_check_unlink(struct usb_hcd *hcd)  				retval = 1;  				dev_dbg(&spi->dev, "%s: URB %p unlinked=%d",  					__func__, urb, urb->unlinked); -				usb_hcd_unlink_urb_from_ep(hcd, urb); -				spin_unlock_irqrestore(&max3421_hcd->lock, -						       flags); -				usb_hcd_giveback_urb(hcd, urb, 0); -				spin_lock_irqsave(&max3421_hcd->lock, flags); +				if (urb == max3421_hcd->curr_urb) { +					max3421_hcd->urb_done = 1; +					max3421_hcd->hien &= ~(BIT(MAX3421_HI_HXFRDN_BIT) | +							       BIT(MAX3421_HI_RCVDAV_BIT)); +				} else { +					usb_hcd_unlink_urb_from_ep(hcd, urb); +					spin_unlock_irqrestore(&max3421_hcd->lock, +							       flags); +					usb_hcd_giveback_urb(hcd, urb, 0); +					spin_lock_irqsave(&max3421_hcd->lock, flags); +				}  			}  		}  	} diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 15db90c54a45..92703efda1f7 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -436,7 +436,7 @@ int xhci_ring_expansion(struct xhci_hcd *xhci, struct xhci_ring *ring,  			goto free_segments;  	} -	xhci_link_rings(xhci, ring, &new_ring); +	xhci_link_rings(xhci, &new_ring, ring);  	trace_xhci_ring_expansion(ring);  	xhci_dbg_trace(xhci, trace_xhci_dbg_ring_expansion,  			"ring expansion succeed, now has %d segments", diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c index 65fc9319d5e7..620f8f0febb8 100644 --- a/drivers/usb/host/xhci-pci-renesas.c +++ b/drivers/usb/host/xhci-pci-renesas.c @@ -661,5 +661,5 @@ module_pci_driver(xhci_renesas_pci_driver);  MODULE_DESCRIPTION("Renesas xHCI PCI Host Controller Driver");  MODULE_FIRMWARE(RENESAS_FW_NAME); -MODULE_IMPORT_NS(xhci); +MODULE_IMPORT_NS("xhci");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index b21474e81482..2d1e205c14c6 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -651,7 +651,7 @@ put_runtime_pm:  	pm_runtime_put_noidle(&dev->dev);  	return retval;  } -EXPORT_SYMBOL_NS_GPL(xhci_pci_common_probe, xhci); +EXPORT_SYMBOL_NS_GPL(xhci_pci_common_probe, "xhci");  static const struct pci_device_id pci_ids_reject[] = {  	/* handled by xhci-pci-renesas */ @@ -695,7 +695,7 @@ void xhci_pci_remove(struct pci_dev *dev)  	if (set_power_d3)  		pci_set_power_state(dev, PCI_D3hot);  } -EXPORT_SYMBOL_NS_GPL(xhci_pci_remove, xhci); +EXPORT_SYMBOL_NS_GPL(xhci_pci_remove, "xhci");  /*   * In some Intel xHCI controllers, in order to get D3 working, diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index e6c9006bd568..db109b570c5c 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -290,7 +290,8 @@ int xhci_plat_probe(struct platform_device *pdev, struct device *sysdev, const s  	hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node); -	if (priv && (priv->quirks & XHCI_SKIP_PHY_INIT)) +	if ((priv && (priv->quirks & XHCI_SKIP_PHY_INIT)) || +	    (xhci->quirks & XHCI_SKIP_PHY_INIT))  		hcd->skip_phy_initialization = 1;  	if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK)) diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 4cf5363875c7..09b05a62375e 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -1199,8 +1199,6 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,  			 * Keep retrying until the EP starts and stops again, on  			 * chips where this is known to help. Wait for 100ms.  			 */ -			if (!(xhci->quirks & XHCI_NEC_HOST)) -				break;  			if (time_is_before_jiffies(ep->stop_time + msecs_to_jiffies(100)))  				break;  			fallthrough; diff --git a/drivers/usb/misc/onboard_usb_dev.c b/drivers/usb/misc/onboard_usb_dev.c index 36b11127280f..75ac3c6aa92d 100644 --- a/drivers/usb/misc/onboard_usb_dev.c +++ b/drivers/usb/misc/onboard_usb_dev.c @@ -407,8 +407,10 @@ static int onboard_dev_probe(struct platform_device *pdev)  		}  		if (of_device_is_compatible(pdev->dev.of_node, "usb424,2744") || -		    of_device_is_compatible(pdev->dev.of_node, "usb424,5744")) +		    of_device_is_compatible(pdev->dev.of_node, "usb424,5744")) {  			err = onboard_dev_5744_i2c_init(client); +			onboard_dev->always_powered_in_suspend = true; +		}  		put_device(&client->dev);  		if (err < 0) diff --git a/drivers/usb/misc/usb-ljca.c b/drivers/usb/misc/usb-ljca.c index d9c21f783055..c562630d862c 100644 --- a/drivers/usb/misc/usb-ljca.c +++ b/drivers/usb/misc/usb-ljca.c @@ -372,7 +372,7 @@ int ljca_transfer(struct ljca_client *client, u8 cmd, const u8 *obuf,  			 obuf, obuf_len, ibuf, ibuf_len, true,  			 LJCA_WRITE_ACK_TIMEOUT_MS);  } -EXPORT_SYMBOL_NS_GPL(ljca_transfer, LJCA); +EXPORT_SYMBOL_NS_GPL(ljca_transfer, "LJCA");  int ljca_transfer_noack(struct ljca_client *client, u8 cmd, const u8 *obuf,  			u8 obuf_len) @@ -380,7 +380,7 @@ int ljca_transfer_noack(struct ljca_client *client, u8 cmd, const u8 *obuf,  	return ljca_send(client->adapter, client->type, cmd, obuf,  			 obuf_len, NULL, 0, false, LJCA_WRITE_ACK_TIMEOUT_MS);  } -EXPORT_SYMBOL_NS_GPL(ljca_transfer_noack, LJCA); +EXPORT_SYMBOL_NS_GPL(ljca_transfer_noack, "LJCA");  int ljca_register_event_cb(struct ljca_client *client, ljca_event_cb_t event_cb,  			   void *context) @@ -404,7 +404,7 @@ int ljca_register_event_cb(struct ljca_client *client, ljca_event_cb_t event_cb,  	return 0;  } -EXPORT_SYMBOL_NS_GPL(ljca_register_event_cb, LJCA); +EXPORT_SYMBOL_NS_GPL(ljca_register_event_cb, "LJCA");  void ljca_unregister_event_cb(struct ljca_client *client)  { @@ -417,7 +417,7 @@ void ljca_unregister_event_cb(struct ljca_client *client)  	spin_unlock_irqrestore(&client->event_cb_lock, flags);  } -EXPORT_SYMBOL_NS_GPL(ljca_unregister_event_cb, LJCA); +EXPORT_SYMBOL_NS_GPL(ljca_unregister_event_cb, "LJCA");  static int ljca_match_device_ids(struct acpi_device *adev, void *data)  { diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index c24101f0a07a..9960ac2b10b7 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c @@ -223,6 +223,7 @@ static const struct usb_device_id id_table[] = {  	{ USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */  	{ USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */  	{ USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ +	{ USB_DEVICE(0x1B93, 0x1013) }, /* Phoenix Contact UPS Device */  	{ USB_DEVICE(0x1BA4, 0x0002) },	/* Silicon Labs 358x factory default */  	{ USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */  	{ USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */ diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9ba5584061c8..1e2ae0c6c41c 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -621,10 +621,12 @@ static void option_instat_callback(struct urb *urb);  /* MeiG Smart Technology products */  #define MEIGSMART_VENDOR_ID			0x2dee -/* MeiG Smart SRM825L based on Qualcomm 315 */ +/* MeiG Smart SRM815/SRM825L based on Qualcomm 315 */  #define MEIGSMART_PRODUCT_SRM825L		0x4d22  /* MeiG Smart SLM320 based on UNISOC UIS8910 */  #define MEIGSMART_PRODUCT_SLM320		0x4d41 +/* MeiG Smart SLM770A based on ASR1803 */ +#define MEIGSMART_PRODUCT_SLM770A		0x4d57  /* Device flags */ @@ -1395,6 +1397,12 @@ static const struct usb_device_id option_ids[] = {  	  .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },  	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10aa, 0xff),	/* Telit FN920C04 (MBIM) */  	  .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c0, 0xff),	/* Telit FE910C04 (rmnet) */ +	  .driver_info = RSVD(0) | NCTRL(3) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c4, 0xff),	/* Telit FE910C04 (rmnet) */ +	  .driver_info = RSVD(0) | NCTRL(3) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c8, 0xff),	/* Telit FE910C04 (rmnet) */ +	  .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },  	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),  	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },  	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), @@ -2247,6 +2255,8 @@ static const struct usb_device_id option_ids[] = {  	  .driver_info = NCTRL(2) },  	{ USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x7127, 0xff, 0x00, 0x00),  	  .driver_info = NCTRL(2) | NCTRL(3) | NCTRL(4) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x7129, 0xff, 0x00, 0x00),        /* MediaTek T7XX  */ +	  .driver_info = NCTRL(2) | NCTRL(3) | NCTRL(4) },  	{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) },  	{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MPL200),  	  .driver_info = RSVD(1) | RSVD(4) }, @@ -2375,6 +2385,18 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0xff, 0x30) },	/* NetPrisma LCUK54-WWD for Golbal EDU */  	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0x00, 0x40) },  	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0xff, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010a, 0xff, 0xff, 0x30) },	/* NetPrisma LCUK54-WRD for WWAN Ready */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010a, 0xff, 0x00, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010a, 0xff, 0xff, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010b, 0xff, 0xff, 0x30) },	/* NetPrisma LCUK54-WWD for WWAN Ready */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010b, 0xff, 0x00, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010b, 0xff, 0xff, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010c, 0xff, 0xff, 0x30) },	/* NetPrisma LCUK54-WRD for WWAN Ready */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010c, 0xff, 0x00, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010c, 0xff, 0xff, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010d, 0xff, 0xff, 0x30) },	/* NetPrisma LCUK54-WWD for WWAN Ready */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010d, 0xff, 0x00, 0x40) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010d, 0xff, 0xff, 0x40) },  	{ USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) },  	{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) },  	{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) }, @@ -2382,9 +2404,16 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) },  	{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, LUAT_PRODUCT_AIR720U, 0xff, 0, 0) },  	{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM320, 0xff, 0, 0) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM770A, 0xff, 0, 0) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0, 0) },  	{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x30) },  	{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x40) },  	{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x60) }, +	{ USB_DEVICE_INTERFACE_CLASS(0x1bbb, 0x0530, 0xff),			/* TCL IK512 MBIM */ +	  .driver_info = NCTRL(1) }, +	{ USB_DEVICE_INTERFACE_CLASS(0x1bbb, 0x0640, 0xff),			/* TCL IK512 ECM */ +	  .driver_info = NCTRL(3) }, +	{ USB_DEVICE_INTERFACE_CLASS(0x2949, 0x8700, 0xff) },			/* Neoway N723-EA */  	{ } /* Terminating entry */  };  MODULE_DEVICE_TABLE(usb, option_ids); diff --git a/drivers/usb/storage/Makefile b/drivers/usb/storage/Makefile index 46635fa4a340..28db337f190b 100644 --- a/drivers/usb/storage/Makefile +++ b/drivers/usb/storage/Makefile @@ -8,7 +8,7 @@  ccflags-y := -I $(srctree)/drivers/scsi -ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=USB_STORAGE +ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"USB_STORAGE"'  obj-$(CONFIG_USB_UAS)		+= uas.o  obj-$(CONFIG_USB_STORAGE)	+= usb-storage.o diff --git a/drivers/usb/storage/alauda.c b/drivers/usb/storage/alauda.c index a9d3c58ce7d9..6263c4e61678 100644 --- a/drivers/usb/storage/alauda.c +++ b/drivers/usb/storage/alauda.c @@ -36,7 +36,7 @@  MODULE_DESCRIPTION("Driver for Alauda-based card readers");  MODULE_AUTHOR("Daniel Drake <dsd@gentoo.org>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  /*   * Status bytes diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c index 30dfd0082474..2fce5f95be51 100644 --- a/drivers/usb/storage/cypress_atacb.c +++ b/drivers/usb/storage/cypress_atacb.c @@ -22,7 +22,7 @@  MODULE_DESCRIPTION("SAT support for Cypress USB/ATA bridges with ATACB");  MODULE_AUTHOR("Matthieu Castet <castet.matthieu@free.fr>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  /*   * The table of devices diff --git a/drivers/usb/storage/datafab.c b/drivers/usb/storage/datafab.c index 3ea5601d16b8..bbfa2398b170 100644 --- a/drivers/usb/storage/datafab.c +++ b/drivers/usb/storage/datafab.c @@ -54,7 +54,7 @@  MODULE_DESCRIPTION("Driver for Datafab USB Compact Flash reader");  MODULE_AUTHOR("Jimmie Mayfield <mayfield+datafab@sackheads.org>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  struct datafab_info {  	unsigned long   sectors;	/* total sector count */ diff --git a/drivers/usb/storage/ene_ub6250.c b/drivers/usb/storage/ene_ub6250.c index fd46e81388d2..ce91fb105975 100644 --- a/drivers/usb/storage/ene_ub6250.c +++ b/drivers/usb/storage/ene_ub6250.c @@ -26,7 +26,7 @@  MODULE_DESCRIPTION("Driver for ENE UB6250 reader");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  MODULE_FIRMWARE(SD_INIT1_FIRMWARE);  MODULE_FIRMWARE(SD_INIT2_FIRMWARE);  MODULE_FIRMWARE(SD_RW_FIRMWARE); diff --git a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c index cab27ba7a32a..a075620907b4 100644 --- a/drivers/usb/storage/freecom.c +++ b/drivers/usb/storage/freecom.c @@ -29,7 +29,7 @@  MODULE_DESCRIPTION("Driver for Freecom USB/IDE adaptor");  MODULE_AUTHOR("David Brown <usb-storage@davidb.org>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  #ifdef CONFIG_USB_STORAGE_DEBUG  static void pdump(struct us_data *us, void *ibuffer, int length); diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c index f2254eb3c0d7..a1669c35bad5 100644 --- a/drivers/usb/storage/isd200.c +++ b/drivers/usb/storage/isd200.c @@ -53,7 +53,7 @@  MODULE_DESCRIPTION("Driver for In-System Design, Inc. ISD200 ASIC");  MODULE_AUTHOR("Björn Stenberg <bjorn@haxx.se>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  static int isd200_Initialization(struct us_data *us); diff --git a/drivers/usb/storage/jumpshot.c b/drivers/usb/storage/jumpshot.c index 0e71a8f33c2b..39ca84d68591 100644 --- a/drivers/usb/storage/jumpshot.c +++ b/drivers/usb/storage/jumpshot.c @@ -51,7 +51,7 @@  MODULE_DESCRIPTION("Driver for Lexar \"Jumpshot\" Compact Flash reader");  MODULE_AUTHOR("Jimmie Mayfield <mayfield+usb@sackheads.org>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  /*   * The table of devices diff --git a/drivers/usb/storage/karma.c b/drivers/usb/storage/karma.c index d6a5e54f2ca8..341d6839548a 100644 --- a/drivers/usb/storage/karma.c +++ b/drivers/usb/storage/karma.c @@ -23,7 +23,7 @@  MODULE_DESCRIPTION("Driver for Rio Karma");  MODULE_AUTHOR("Bob Copeland <me@bobcopeland.com>, Keith Bennett <keith@mcs.st-and.ac.uk>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  #define RIO_PREFIX "RIOP\x00"  #define RIO_PREFIX_LEN 5 diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index f97cf6cadb8e..5a8a1ffda0ec 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c @@ -25,7 +25,7 @@  MODULE_DESCRIPTION("Maxtor USB OneTouch hard drive button driver");  MODULE_AUTHOR("Nick Sillik <n.sillik@temple.edu>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  #define ONETOUCH_PKT_LEN        0x02  #define ONETOUCH_BUTTON         KEY_PROG1 diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c index 54ffff86c6fa..2a82ed7b68ea 100644 --- a/drivers/usb/storage/realtek_cr.c +++ b/drivers/usb/storage/realtek_cr.c @@ -35,7 +35,7 @@  MODULE_DESCRIPTION("Driver for Realtek USB Card Reader");  MODULE_AUTHOR("wwang <wei_wang@realsil.com.cn>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  static int auto_delink_en = 1;  module_param(auto_delink_en, int, S_IRUGO | S_IWUSR); diff --git a/drivers/usb/storage/sddr09.c b/drivers/usb/storage/sddr09.c index 30ee76cfef05..d21ce3466e25 100644 --- a/drivers/usb/storage/sddr09.c +++ b/drivers/usb/storage/sddr09.c @@ -47,7 +47,7 @@  MODULE_DESCRIPTION("Driver for SanDisk SDDR-09 SmartMedia reader");  MODULE_AUTHOR("Andries Brouwer <aeb@cwi.nl>, Robert Baruch <autophile@starband.net>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  static int usb_stor_sddr09_dpcm_init(struct us_data *us);  static int sddr09_transport(struct scsi_cmnd *srb, struct us_data *us); diff --git a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c index a37fc505c57f..d5cdff30f6f3 100644 --- a/drivers/usb/storage/sddr55.c +++ b/drivers/usb/storage/sddr55.c @@ -29,7 +29,7 @@  MODULE_DESCRIPTION("Driver for SanDisk SDDR-55 SmartMedia reader");  MODULE_AUTHOR("Simon Munton");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  /*   * The table of devices diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c index e7c224b7c464..087c706bb315 100644 --- a/drivers/usb/storage/shuttle_usbat.c +++ b/drivers/usb/storage/shuttle_usbat.c @@ -48,7 +48,7 @@  MODULE_DESCRIPTION("Driver for SCM Microsystems (a.k.a. Shuttle) USB-ATAPI cable");  MODULE_AUTHOR("Daniel Drake <dsd@gentoo.org>, Robert Baruch <autophile@starband.net>");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  /* Supported device types */  #define USBAT_DEV_HP8200	0x01 diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 03043d567fa1..f9ad90ce7af4 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c @@ -1289,6 +1289,6 @@ module_exit(uas_exit);  MODULE_DESCRIPTION("USB Attached SCSI driver");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(USB_STORAGE); +MODULE_IMPORT_NS("USB_STORAGE");  MODULE_AUTHOR(  	"Hans de Goede <hdegoede@redhat.com>, Matthew Wilcox and Sarah Sharp"); diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index e5ad23d86833..54f0b1c83317 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -255,6 +255,13 @@ UNUSUAL_DEV(  0x0421, 0x06aa, 0x1110, 0x1110,  		USB_SC_DEVICE, USB_PR_DEVICE, NULL,  		US_FL_MAX_SECTORS_64 ), +/* Added by Lubomir Rintel <lkundrak@v3.sk>, a very fine chap */ +UNUSUAL_DEV(  0x0421, 0x06c2, 0x0000, 0x0406, +		"Nokia", +		"Nokia 208", +		USB_SC_DEVICE, USB_PR_DEVICE, NULL, +		US_FL_MAX_SECTORS_64 ), +  #ifdef NO_SDDR09  UNUSUAL_DEV(  0x0436, 0x0005, 0x0100, 0x0100,  		"Microtech", diff --git a/drivers/usb/typec/anx7411.c b/drivers/usb/typec/anx7411.c index d1e7c487ddfb..0ae0a5ee3fae 100644 --- a/drivers/usb/typec/anx7411.c +++ b/drivers/usb/typec/anx7411.c @@ -290,6 +290,8 @@ struct anx7411_data {  	struct power_supply *psy;  	struct power_supply_desc psy_desc;  	struct device *dev; +	struct fwnode_handle *switch_node; +	struct fwnode_handle *mux_node;  };  static u8 snk_identity[] = { @@ -1021,6 +1023,16 @@ static void anx7411_port_unregister_altmodes(struct typec_altmode **adev)  		}  } +static void anx7411_port_unregister(struct typec_params *typecp) +{ +	fwnode_handle_put(typecp->caps.fwnode); +	anx7411_port_unregister_altmodes(typecp->port_amode); +	if (typecp->port) +		typec_unregister_port(typecp->port); +	if (typecp->role_sw) +		usb_role_switch_put(typecp->role_sw); +} +  static int anx7411_usb_mux_set(struct typec_mux_dev *mux,  			       struct typec_mux_state *state)  { @@ -1089,6 +1101,7 @@ static void anx7411_unregister_mux(struct anx7411_data *ctx)  	if (ctx->typec.typec_mux) {  		typec_mux_unregister(ctx->typec.typec_mux);  		ctx->typec.typec_mux = NULL; +		fwnode_handle_put(ctx->mux_node);  	}  } @@ -1097,6 +1110,7 @@ static void anx7411_unregister_switch(struct anx7411_data *ctx)  	if (ctx->typec.typec_switch) {  		typec_switch_unregister(ctx->typec.typec_switch);  		ctx->typec.typec_switch = NULL; +		fwnode_handle_put(ctx->switch_node);  	}  } @@ -1104,28 +1118,29 @@ static int anx7411_typec_switch_probe(struct anx7411_data *ctx,  				      struct device *dev)  {  	int ret; -	struct device_node *node; -	node = of_get_child_by_name(dev->of_node, "orientation_switch"); -	if (!node) +	ctx->switch_node = device_get_named_child_node(dev, "orientation_switch"); +	if (!ctx->switch_node)  		return 0; -	ret = anx7411_register_switch(ctx, dev, &node->fwnode); +	ret = anx7411_register_switch(ctx, dev, ctx->switch_node);  	if (ret) {  		dev_err(dev, "failed register switch"); +		fwnode_handle_put(ctx->switch_node);  		return ret;  	} -	node = of_get_child_by_name(dev->of_node, "mode_switch"); -	if (!node) { +	ctx->mux_node = device_get_named_child_node(dev, "mode_switch"); +	if (!ctx->mux_node) {  		dev_err(dev, "no typec mux exist");  		ret = -ENODEV;  		goto unregister_switch;  	} -	ret = anx7411_register_mux(ctx, dev, &node->fwnode); +	ret = anx7411_register_mux(ctx, dev, ctx->mux_node);  	if (ret) {  		dev_err(dev, "failed register mode switch"); +		fwnode_handle_put(ctx->mux_node);  		ret = -ENODEV;  		goto unregister_switch;  	} @@ -1154,34 +1169,34 @@ static int anx7411_typec_port_probe(struct anx7411_data *ctx,  	ret = fwnode_property_read_string(fwnode, "power-role", &buf);  	if (ret) {  		dev_err(dev, "power-role not found: %d\n", ret); -		return ret; +		goto put_fwnode;  	}  	ret = typec_find_port_power_role(buf);  	if (ret < 0) -		return ret; +		goto put_fwnode;  	cap->type = ret;  	ret = fwnode_property_read_string(fwnode, "data-role", &buf);  	if (ret) {  		dev_err(dev, "data-role not found: %d\n", ret); -		return ret; +		goto put_fwnode;  	}  	ret = typec_find_port_data_role(buf);  	if (ret < 0) -		return ret; +		goto put_fwnode;  	cap->data = ret;  	ret = fwnode_property_read_string(fwnode, "try-power-role", &buf);  	if (ret) {  		dev_err(dev, "try-power-role not found: %d\n", ret); -		return ret; +		goto put_fwnode;  	}  	ret = typec_find_power_role(buf);  	if (ret < 0) -		return ret; +		goto put_fwnode;  	cap->prefer_role = ret;  	/* Get source pdos */ @@ -1193,7 +1208,7 @@ static int anx7411_typec_port_probe(struct anx7411_data *ctx,  						     typecp->src_pdo_nr);  		if (ret < 0) {  			dev_err(dev, "source cap validate failed: %d\n", ret); -			return -EINVAL; +			goto put_fwnode;  		}  		typecp->caps_flags |= HAS_SOURCE_CAP; @@ -1207,7 +1222,7 @@ static int anx7411_typec_port_probe(struct anx7411_data *ctx,  						     typecp->sink_pdo_nr);  		if (ret < 0) {  			dev_err(dev, "sink cap validate failed: %d\n", ret); -			return -EINVAL; +			goto put_fwnode;  		}  		for (i = 0; i < typecp->sink_pdo_nr; i++) { @@ -1251,13 +1266,21 @@ static int anx7411_typec_port_probe(struct anx7411_data *ctx,  		ret = PTR_ERR(ctx->typec.port);  		ctx->typec.port = NULL;  		dev_err(dev, "Failed to register type c port %d\n", ret); -		return ret; +		goto put_usb_role_switch;  	}  	typec_port_register_altmodes(ctx->typec.port, NULL, ctx,  				     ctx->typec.port_amode,  				     MAX_ALTMODE);  	return 0; + +put_usb_role_switch: +	if (ctx->typec.role_sw) +		usb_role_switch_put(ctx->typec.role_sw); +put_fwnode: +	fwnode_handle_put(fwnode); + +	return ret;  }  static int anx7411_typec_check_connection(struct anx7411_data *ctx) @@ -1523,8 +1546,7 @@ free_wq:  	destroy_workqueue(plat->workqueue);  free_typec_port: -	typec_unregister_port(plat->typec.port); -	anx7411_port_unregister_altmodes(plat->typec.port_amode); +	anx7411_port_unregister(&plat->typec);  free_typec_switch:  	anx7411_unregister_switch(plat); @@ -1548,17 +1570,11 @@ static void anx7411_i2c_remove(struct i2c_client *client)  	i2c_unregister_device(plat->spi_client); -	if (plat->typec.role_sw) -		usb_role_switch_put(plat->typec.role_sw); -  	anx7411_unregister_mux(plat);  	anx7411_unregister_switch(plat); -	if (plat->typec.port) -		typec_unregister_port(plat->typec.port); - -	anx7411_port_unregister_altmodes(plat->typec.port_amode); +	anx7411_port_unregister(&plat->typec);  }  static const struct i2c_device_id anx7411_id[] = { diff --git a/drivers/usb/typec/tcpm/maxim_contaminant.c b/drivers/usb/typec/tcpm/maxim_contaminant.c index 22163d8f9eb0..0cdda06592fd 100644 --- a/drivers/usb/typec/tcpm/maxim_contaminant.c +++ b/drivers/usb/typec/tcpm/maxim_contaminant.c @@ -135,7 +135,7 @@ static int max_contaminant_read_resistance_kohm(struct max_tcpci_chip *chip,  		mv = max_contaminant_read_adc_mv(chip, channel, sleep_msec, raw, true);  		if (mv < 0) -			return ret; +			return mv;  		/* OVP enable */  		ret = regmap_update_bits(regmap, TCPC_VENDOR_CC_CTRL2, CCOVPDIS, 0); @@ -157,7 +157,7 @@ static int max_contaminant_read_resistance_kohm(struct max_tcpci_chip *chip,  	mv = max_contaminant_read_adc_mv(chip, channel, sleep_msec, raw, true);  	if (mv < 0) -		return ret; +		return mv;  	/* Disable current source */  	ret = regmap_update_bits(regmap, TCPC_VENDOR_CC_CTRL2, SBURPCTRL, 0);  	if (ret < 0) diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c index ed32583829be..24a6a4354df8 100644 --- a/drivers/usb/typec/tcpm/tcpci.c +++ b/drivers/usb/typec/tcpm/tcpci.c @@ -700,7 +700,7 @@ static int tcpci_init(struct tcpc_dev *tcpc)  	tcpci->alert_mask = reg; -	return tcpci_write16(tcpci, TCPC_ALERT_MASK, reg); +	return 0;  }  irqreturn_t tcpci_irq(struct tcpci *tcpci) @@ -923,22 +923,27 @@ static int tcpci_probe(struct i2c_client *client)  	chip->data.set_orientation = err; +	chip->tcpci = tcpci_register_port(&client->dev, &chip->data); +	if (IS_ERR(chip->tcpci)) +		return PTR_ERR(chip->tcpci); +  	err = devm_request_threaded_irq(&client->dev, client->irq, NULL,  					_tcpci_irq,  					IRQF_SHARED | IRQF_ONESHOT,  					dev_name(&client->dev), chip);  	if (err < 0) -		return err; +		goto unregister_port; -	/* -	 * Disable irq while registering port. If irq is configured as an edge -	 * irq this allow to keep track and process the irq as soon as it is enabled. -	 */ -	disable_irq(client->irq); -	chip->tcpci = tcpci_register_port(&client->dev, &chip->data); -	enable_irq(client->irq); +	/* Enable chip interrupts at last */ +	err = tcpci_write16(chip->tcpci, TCPC_ALERT_MASK, chip->tcpci->alert_mask); +	if (err < 0) +		goto unregister_port; -	return PTR_ERR_OR_ZERO(chip->tcpci); +	return 0; + +unregister_port: +	tcpci_unregister_port(chip->tcpci); +	return err;  }  static void tcpci_remove(struct i2c_client *client) diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c index c435c0835744..fcf499cc9458 100644 --- a/drivers/usb/typec/ucsi/ucsi.c +++ b/drivers/usb/typec/ucsi/ucsi.c @@ -46,11 +46,11 @@ void ucsi_notify_common(struct ucsi *ucsi, u32 cci)  		ucsi_connector_change(ucsi, UCSI_CCI_CONNECTOR(cci));  	if (cci & UCSI_CCI_ACK_COMPLETE && -	    test_bit(ACK_PENDING, &ucsi->flags)) +	    test_and_clear_bit(ACK_PENDING, &ucsi->flags))  		complete(&ucsi->complete);  	if (cci & UCSI_CCI_COMMAND_COMPLETE && -	    test_bit(COMMAND_PENDING, &ucsi->flags)) +	    test_and_clear_bit(COMMAND_PENDING, &ucsi->flags))  		complete(&ucsi->complete);  }  EXPORT_SYMBOL_GPL(ucsi_notify_common); @@ -65,6 +65,8 @@ int ucsi_sync_control_common(struct ucsi *ucsi, u64 command)  	else  		set_bit(COMMAND_PENDING, &ucsi->flags); +	reinit_completion(&ucsi->complete); +  	ret = ucsi->ops->async_control(ucsi, command);  	if (ret)  		goto out_clear_bit; @@ -651,7 +653,8 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)  static int ucsi_get_connector_status(struct ucsi_connector *con, bool conn_ack)  {  	u64 command = UCSI_GET_CONNECTOR_STATUS | UCSI_CONNECTOR_NUMBER(con->num); -	size_t size = min(UCSI_GET_CONNECTOR_STATUS_SIZE, UCSI_MAX_DATA_LENGTH(con->ucsi)); +	size_t size = min(sizeof(con->status), +			  UCSI_MAX_DATA_LENGTH(con->ucsi));  	int ret;  	ret = ucsi_send_command_common(con->ucsi, command, &con->status, size, conn_ack); diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c index fcb8e61136cf..740171f24ef9 100644 --- a/drivers/usb/typec/ucsi/ucsi_ccg.c +++ b/drivers/usb/typec/ucsi/ucsi_ccg.c @@ -646,7 +646,7 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command)  			UCSI_CMD_CONNECTOR_MASK;  		if (con_index == 0) {  			ret = -EINVAL; -			goto unlock; +			goto err_put;  		}  		con = &uc->ucsi->connector[con_index - 1];  		ucsi_ccg_update_set_new_cam_cmd(uc, con, &command); @@ -654,8 +654,8 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64 command)  	ret = ucsi_sync_control_common(ucsi, command); +err_put:  	pm_runtime_put_sync(uc->dev); -unlock:  	mutex_unlock(&uc->lock);  	return ret; diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/ucsi_glink.c index 90948cd6d297..fed39d458090 100644 --- a/drivers/usb/typec/ucsi/ucsi_glink.c +++ b/drivers/usb/typec/ucsi/ucsi_glink.c @@ -185,6 +185,11 @@ static void pmic_glink_ucsi_connector_status(struct ucsi_connector *con)  	struct pmic_glink_ucsi *ucsi = ucsi_get_drvdata(con->ucsi);  	int orientation; +	if (!UCSI_CONSTAT(con, CONNECTED)) { +		typec_set_orientation(con->port, TYPEC_ORIENTATION_NONE); +		return; +	} +  	if (con->num > PMIC_GLINK_MAX_PORTS ||  	    !ucsi->port_orientation[con->num - 1])  		return; diff --git a/drivers/vfio/cdx/main.c b/drivers/vfio/cdx/main.c index 67465fad5b4b..5dd5f5ad7686 100644 --- a/drivers/vfio/cdx/main.c +++ b/drivers/vfio/cdx/main.c @@ -347,4 +347,4 @@ module_driver(vfio_cdx_driver, cdx_driver_register, cdx_driver_unregister);  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("VFIO for CDX devices - User Level meta-driver"); -MODULE_IMPORT_NS(CDX_BUS); +MODULE_IMPORT_NS("CDX_BUS"); diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c index 82eba6966fa5..516294fd901b 100644 --- a/drivers/vfio/iommufd.c +++ b/drivers/vfio/iommufd.c @@ -7,8 +7,8 @@  #include "vfio.h" -MODULE_IMPORT_NS(IOMMUFD); -MODULE_IMPORT_NS(IOMMUFD_VFIO); +MODULE_IMPORT_NS("IOMMUFD"); +MODULE_IMPORT_NS("IOMMUFD_VFIO");  bool vfio_iommufd_device_has_compat_ioas(struct vfio_device *vdev,  					 struct iommufd_ctx *ictx) diff --git a/drivers/vfio/pci/mlx5/cmd.c b/drivers/vfio/pci/mlx5/cmd.c index 7527e277c898..eb7387ee6ebd 100644 --- a/drivers/vfio/pci/mlx5/cmd.c +++ b/drivers/vfio/pci/mlx5/cmd.c @@ -1517,7 +1517,8 @@ int mlx5vf_start_page_tracker(struct vfio_device *vdev,  	struct mlx5_vhca_qp *host_qp;  	struct mlx5_vhca_qp *fw_qp;  	struct mlx5_core_dev *mdev; -	u32 max_msg_size = PAGE_SIZE; +	u32 log_max_msg_size; +	u32 max_msg_size;  	u64 rq_size = SZ_2M;  	u32 max_recv_wr;  	int err; @@ -1534,6 +1535,12 @@ int mlx5vf_start_page_tracker(struct vfio_device *vdev,  	}  	mdev = mvdev->mdev; +	log_max_msg_size = MLX5_CAP_ADV_VIRTUALIZATION(mdev, pg_track_log_max_msg_size); +	max_msg_size = (1ULL << log_max_msg_size); +	/* The RQ must hold at least 4 WQEs/messages for successful QP creation */ +	if (rq_size < 4 * max_msg_size) +		rq_size = 4 * max_msg_size; +  	memset(tracker, 0, sizeof(*tracker));  	tracker->uar = mlx5_get_uars_page(mdev);  	if (IS_ERR(tracker->uar)) { @@ -1623,25 +1630,41 @@ set_report_output(u32 size, int index, struct mlx5_vhca_qp *qp,  {  	u32 entry_size = MLX5_ST_SZ_BYTES(page_track_report_entry);  	u32 nent = size / entry_size; +	u32 nent_in_page; +	u32 nent_to_set;  	struct page *page; +	u32 page_offset; +	u32 page_index; +	u32 buf_offset; +	void *kaddr;  	u64 addr;  	u64 *buf;  	int i; -	if (WARN_ON(index >= qp->recv_buf.npages || +	buf_offset = index * qp->max_msg_size; +	if (WARN_ON(buf_offset + size >= qp->recv_buf.npages * PAGE_SIZE ||  		    (nent > qp->max_msg_size / entry_size)))  		return; -	page = qp->recv_buf.page_list[index]; -	buf = kmap_local_page(page); -	for (i = 0; i < nent; i++) { -		addr = MLX5_GET(page_track_report_entry, buf + i, -				dirty_address_low); -		addr |= (u64)MLX5_GET(page_track_report_entry, buf + i, -				      dirty_address_high) << 32; -		iova_bitmap_set(dirty, addr, qp->tracked_page_size); -	} -	kunmap_local(buf); +	do { +		page_index = buf_offset / PAGE_SIZE; +		page_offset = buf_offset % PAGE_SIZE; +		nent_in_page = (PAGE_SIZE - page_offset) / entry_size; +		page = qp->recv_buf.page_list[page_index]; +		kaddr = kmap_local_page(page); +		buf = kaddr + page_offset; +		nent_to_set = min(nent, nent_in_page); +		for (i = 0; i < nent_to_set; i++) { +			addr = MLX5_GET(page_track_report_entry, buf + i, +					dirty_address_low); +			addr |= (u64)MLX5_GET(page_track_report_entry, buf + i, +					      dirty_address_high) << 32; +			iova_bitmap_set(dirty, addr, qp->tracked_page_size); +		} +		kunmap_local(kaddr); +		buf_offset += (nent_to_set * entry_size); +		nent -= nent_to_set; +	} while (nent);  }  static void diff --git a/drivers/vfio/pci/mlx5/main.c b/drivers/vfio/pci/mlx5/main.c index 8833e60d42f5..709543e7eb04 100644 --- a/drivers/vfio/pci/mlx5/main.c +++ b/drivers/vfio/pci/mlx5/main.c @@ -1446,7 +1446,7 @@ static struct pci_driver mlx5vf_pci_driver = {  module_pci_driver(mlx5vf_pci_driver); -MODULE_IMPORT_NS(IOMMUFD); +MODULE_IMPORT_NS("IOMMUFD");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Max Gurtovoy <mgurtovoy@nvidia.com>");  MODULE_AUTHOR("Yishai Hadas <yishaih@nvidia.com>"); diff --git a/drivers/vfio/pci/pds/pci_drv.c b/drivers/vfio/pci/pds/pci_drv.c index 16e93b11ab1b..4923f1823126 100644 --- a/drivers/vfio/pci/pds/pci_drv.c +++ b/drivers/vfio/pci/pds/pci_drv.c @@ -187,7 +187,7 @@ static struct pci_driver pds_vfio_pci_driver = {  module_pci_driver(pds_vfio_pci_driver); -MODULE_IMPORT_NS(IOMMUFD); +MODULE_IMPORT_NS("IOMMUFD");  MODULE_DESCRIPTION(PDS_VFIO_DRV_DESCRIPTION);  MODULE_AUTHOR("Brett Creeley <brett.creeley@amd.com>");  MODULE_LICENSE("GPL"); diff --git a/drivers/vfio/pci/qat/main.c b/drivers/vfio/pci/qat/main.c index c78cb6de9390..845ed15b6771 100644 --- a/drivers/vfio/pci/qat/main.c +++ b/drivers/vfio/pci/qat/main.c @@ -697,4 +697,4 @@ module_pci_driver(qat_vf_vfio_pci_driver);  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Xin Zeng <xin.zeng@intel.com>");  MODULE_DESCRIPTION("QAT VFIO PCI - VFIO PCI driver with live migration support for Intel(R) QAT GEN4 device family"); -MODULE_IMPORT_NS(CRYPTO_QAT); +MODULE_IMPORT_NS("CRYPTO_QAT"); diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c index 1ab58da9f38a..1a4ed5a357d3 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -1661,14 +1661,15 @@ static vm_fault_t vfio_pci_mmap_huge_fault(struct vm_fault *vmf,  	unsigned long pfn, pgoff = vmf->pgoff - vma->vm_pgoff;  	vm_fault_t ret = VM_FAULT_SIGBUS; -	if (order && (vmf->address & ((PAGE_SIZE << order) - 1) || +	pfn = vma_to_pfn(vma) + pgoff; + +	if (order && (pfn & ((1 << order) - 1) || +		      vmf->address & ((PAGE_SIZE << order) - 1) ||  		      vmf->address + (PAGE_SIZE << order) > vma->vm_end)) {  		ret = VM_FAULT_FALLBACK;  		goto out;  	} -	pfn = vma_to_pfn(vma); -  	down_read(&vdev->memory_lock);  	if (vdev->pm_runtime_engaged || !__vfio_pci_memory_enabled(vdev)) @@ -1676,18 +1677,18 @@ static vm_fault_t vfio_pci_mmap_huge_fault(struct vm_fault *vmf,  	switch (order) {  	case 0: -		ret = vmf_insert_pfn(vma, vmf->address, pfn + pgoff); +		ret = vmf_insert_pfn(vma, vmf->address, pfn);  		break;  #ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP  	case PMD_ORDER: -		ret = vmf_insert_pfn_pmd(vmf, __pfn_to_pfn_t(pfn + pgoff, -							     PFN_DEV), false); +		ret = vmf_insert_pfn_pmd(vmf, +					 __pfn_to_pfn_t(pfn, PFN_DEV), false);  		break;  #endif  #ifdef CONFIG_ARCH_SUPPORTS_PUD_PFNMAP  	case PUD_ORDER: -		ret = vmf_insert_pfn_pud(vmf, __pfn_to_pfn_t(pfn + pgoff, -							     PFN_DEV), false); +		ret = vmf_insert_pfn_pud(vmf, +					 __pfn_to_pfn_t(pfn, PFN_DEV), false);  		break;  #endif  	default: diff --git a/drivers/vfio/platform/vfio_platform.c b/drivers/vfio/platform/vfio_platform.c index 42d1462c5e19..512533501eb7 100644 --- a/drivers/vfio/platform/vfio_platform.c +++ b/drivers/vfio/platform/vfio_platform.c @@ -112,7 +112,7 @@ static const struct vfio_device_ops vfio_platform_ops = {  static struct platform_driver vfio_platform_driver = {  	.probe		= vfio_platform_probe, -	.remove_new	= vfio_platform_remove, +	.remove		= vfio_platform_remove,  	.driver	= {  		.name	= "vfio-platform",  	}, diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index a5a62d9d963f..1fd261efc582 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -1751,7 +1751,7 @@ static void __exit vfio_cleanup(void)  module_init(vfio_init);  module_exit(vfio_cleanup); -MODULE_IMPORT_NS(IOMMUFD); +MODULE_IMPORT_NS("IOMMUFD");  MODULE_VERSION(DRIVER_VERSION);  MODULE_LICENSE("GPL v2");  MODULE_AUTHOR(DRIVER_AUTHOR); diff --git a/drivers/video/backlight/aat2870_bl.c b/drivers/video/backlight/aat2870_bl.c index 68d327ee4b2e..8b790df1e842 100644 --- a/drivers/video/backlight/aat2870_bl.c +++ b/drivers/video/backlight/aat2870_bl.c @@ -186,7 +186,7 @@ static struct platform_driver aat2870_bl_driver = {  		.name	= "aat2870-backlight",  	},  	.probe		= aat2870_bl_probe, -	.remove_new	= aat2870_bl_remove, +	.remove		= aat2870_bl_remove,  };  static int __init aat2870_bl_init(void) diff --git a/drivers/video/backlight/adp5520_bl.c b/drivers/video/backlight/adp5520_bl.c index 8e0e9cfe5fe9..aa5c15e8db86 100644 --- a/drivers/video/backlight/adp5520_bl.c +++ b/drivers/video/backlight/adp5520_bl.c @@ -375,7 +375,7 @@ static struct platform_driver adp5520_bl_driver = {  		.pm	= &adp5520_bl_pm_ops,  	},  	.probe		= adp5520_bl_probe, -	.remove_new	= adp5520_bl_remove, +	.remove		= adp5520_bl_remove,  };  module_platform_driver(adp5520_bl_driver); diff --git a/drivers/video/backlight/da9052_bl.c b/drivers/video/backlight/da9052_bl.c index b8ff7046510e..5e13ef96b717 100644 --- a/drivers/video/backlight/da9052_bl.c +++ b/drivers/video/backlight/da9052_bl.c @@ -165,7 +165,7 @@ MODULE_DEVICE_TABLE(platform, da9052_wled_ids);  static struct platform_driver da9052_wled_driver = {  	.probe		= da9052_backlight_probe, -	.remove_new	= da9052_backlight_remove, +	.remove		= da9052_backlight_remove,  	.id_table	= da9052_wled_ids,  	.driver	= {  		.name	= "da9052-wled", diff --git a/drivers/video/backlight/hp680_bl.c b/drivers/video/backlight/hp680_bl.c index ddb7ab4df77e..fa9a983533b2 100644 --- a/drivers/video/backlight/hp680_bl.c +++ b/drivers/video/backlight/hp680_bl.c @@ -130,7 +130,7 @@ static void hp680bl_remove(struct platform_device *pdev)  static struct platform_driver hp680bl_driver = {  	.probe		= hp680bl_probe, -	.remove_new	= hp680bl_remove, +	.remove		= hp680bl_remove,  	.driver		= {  		.name	= "hp680-bl",  		.pm	= &hp680bl_pm_ops, diff --git a/drivers/video/backlight/ktd2801-backlight.c b/drivers/video/backlight/ktd2801-backlight.c index d295c2766025..0489b0615ceb 100644 --- a/drivers/video/backlight/ktd2801-backlight.c +++ b/drivers/video/backlight/ktd2801-backlight.c @@ -122,7 +122,7 @@ static struct platform_driver ktd2801_backlight_driver = {  };  module_platform_driver(ktd2801_backlight_driver); -MODULE_IMPORT_NS(EXPRESSWIRE); +MODULE_IMPORT_NS("EXPRESSWIRE");  MODULE_AUTHOR("Duje Mihanović <duje.mihanovic@skole.hr>");  MODULE_DESCRIPTION("Kinetic KTD2801 Backlight Driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c index c7aefcd6e4e3..ae34d1ecbfbe 100644 --- a/drivers/video/backlight/led_bl.c +++ b/drivers/video/backlight/led_bl.c @@ -246,7 +246,7 @@ static struct platform_driver led_bl_driver = {  		.of_match_table	= led_bl_of_match,  	},  	.probe		= led_bl_probe, -	.remove_new	= led_bl_remove, +	.remove		= led_bl_remove,  };  module_platform_driver(led_bl_driver); diff --git a/drivers/video/backlight/lm3533_bl.c b/drivers/video/backlight/lm3533_bl.c index 5d06f8ca976c..babfd3ceec86 100644 --- a/drivers/video/backlight/lm3533_bl.c +++ b/drivers/video/backlight/lm3533_bl.c @@ -387,7 +387,7 @@ static struct platform_driver lm3533_bl_driver = {  		.pm	= &lm3533_bl_pm_ops,  	},  	.probe		= lm3533_bl_probe, -	.remove_new	= lm3533_bl_remove, +	.remove		= lm3533_bl_remove,  	.shutdown	= lm3533_bl_shutdown,  };  module_platform_driver(lm3533_bl_driver); diff --git a/drivers/video/backlight/lp8788_bl.c b/drivers/video/backlight/lp8788_bl.c index 0b7663519fa5..f61a64905a02 100644 --- a/drivers/video/backlight/lp8788_bl.c +++ b/drivers/video/backlight/lp8788_bl.c @@ -177,7 +177,7 @@ static void lp8788_backlight_remove(struct platform_device *pdev)  static struct platform_driver lp8788_bl_driver = {  	.probe = lp8788_backlight_probe, -	.remove_new = lp8788_backlight_remove, +	.remove = lp8788_backlight_remove,  	.driver = {  		.name = LP8788_DEV_BACKLIGHT,  	}, diff --git a/drivers/video/backlight/mt6370-backlight.c b/drivers/video/backlight/mt6370-backlight.c index 94422c956453..e55f26888d0f 100644 --- a/drivers/video/backlight/mt6370-backlight.c +++ b/drivers/video/backlight/mt6370-backlight.c @@ -340,7 +340,7 @@ static struct platform_driver mt6370_bl_driver = {  		.of_match_table = mt6370_bl_of_match,  	},  	.probe = mt6370_bl_probe, -	.remove_new = mt6370_bl_remove, +	.remove = mt6370_bl_remove,  };  module_platform_driver(mt6370_bl_driver); diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index e942908d1275..237d3d3f3bb1 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c @@ -697,7 +697,7 @@ static struct platform_driver pwm_backlight_driver = {  		.of_match_table	= of_match_ptr(pwm_backlight_of_match),  	},  	.probe		= pwm_backlight_probe, -	.remove_new	= pwm_backlight_remove, +	.remove		= pwm_backlight_remove,  	.shutdown	= pwm_backlight_shutdown,  }; diff --git a/drivers/video/backlight/qcom-wled.c b/drivers/video/backlight/qcom-wled.c index 10129095a4c1..9afe701b2a1b 100644 --- a/drivers/video/backlight/qcom-wled.c +++ b/drivers/video/backlight/qcom-wled.c @@ -1741,7 +1741,7 @@ MODULE_DEVICE_TABLE(of, wled_match_table);  static struct platform_driver wled_driver = {  	.probe = wled_probe, -	.remove_new = wled_remove, +	.remove = wled_remove,  	.driver	= {  		.name = "qcom,wled",  		.of_match_table	= wled_match_table, diff --git a/drivers/video/backlight/rt4831-backlight.c b/drivers/video/backlight/rt4831-backlight.c index c2f6fb29e1d0..7ead75929a43 100644 --- a/drivers/video/backlight/rt4831-backlight.c +++ b/drivers/video/backlight/rt4831-backlight.c @@ -224,7 +224,7 @@ static struct platform_driver rt4831_bl_driver = {  		.of_match_table = rt4831_bl_of_match,  	},  	.probe = rt4831_bl_probe, -	.remove_new = rt4831_bl_remove, +	.remove = rt4831_bl_remove,  };  module_platform_driver(rt4831_bl_driver); diff --git a/drivers/video/backlight/sky81452-backlight.c b/drivers/video/backlight/sky81452-backlight.c index 935043b67786..2749231f0385 100644 --- a/drivers/video/backlight/sky81452-backlight.c +++ b/drivers/video/backlight/sky81452-backlight.c @@ -337,7 +337,7 @@ static struct platform_driver sky81452_bl_driver = {  		.of_match_table = of_match_ptr(sky81452_bl_of_match),  	},  	.probe = sky81452_bl_probe, -	.remove_new = sky81452_bl_remove, +	.remove = sky81452_bl_remove,  };  module_platform_driver(sky81452_bl_driver); diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig index de035071fedb..55c6686f091e 100644 --- a/drivers/video/fbdev/Kconfig +++ b/drivers/video/fbdev/Kconfig @@ -649,6 +649,7 @@ config FB_S1D13XXX  config FB_ATMEL  	tristate "AT91 LCD Controller support"  	depends on FB && OF && HAVE_CLK && HAS_IOMEM +	depends on BACKLIGHT_CLASS_DEVICE  	depends on HAVE_FB_ATMEL || COMPILE_TEST  	select FB_BACKLIGHT  	select FB_IOMEM_HELPERS @@ -660,7 +661,6 @@ config FB_ATMEL  config FB_NVIDIA  	tristate "nVidia Framebuffer Support"  	depends on FB && PCI -	select FB_BACKLIGHT if FB_NVIDIA_BACKLIGHT  	select FB_CFB_FILLRECT  	select FB_CFB_COPYAREA  	select FB_CFB_IMAGEBLIT @@ -700,6 +700,8 @@ config FB_NVIDIA_DEBUG  config FB_NVIDIA_BACKLIGHT  	bool "Support for backlight control"  	depends on FB_NVIDIA +	depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_NVIDIA +	select FB_BACKLIGHT  	default y  	help  	  Say Y here if you want to control the backlight of your display. @@ -707,7 +709,6 @@ config FB_NVIDIA_BACKLIGHT  config FB_RIVA  	tristate "nVidia Riva support"  	depends on FB && PCI -	select FB_BACKLIGHT if FB_RIVA_BACKLIGHT  	select FB_CFB_FILLRECT  	select FB_CFB_COPYAREA  	select FB_CFB_IMAGEBLIT @@ -747,6 +748,8 @@ config FB_RIVA_DEBUG  config FB_RIVA_BACKLIGHT  	bool "Support for backlight control"  	depends on FB_RIVA +	depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_RIVA +	select FB_BACKLIGHT  	default y  	help  	  Say Y here if you want to control the backlight of your display. @@ -934,7 +937,6 @@ config FB_MATROX_MAVEN  config FB_RADEON  	tristate "ATI Radeon display support"  	depends on FB && PCI -	select FB_BACKLIGHT if FB_RADEON_BACKLIGHT  	select FB_CFB_FILLRECT  	select FB_CFB_COPYAREA  	select FB_CFB_IMAGEBLIT @@ -960,6 +962,8 @@ config FB_RADEON_I2C  config FB_RADEON_BACKLIGHT  	bool "Support for backlight control"  	depends on FB_RADEON +	depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_RADEON +	select FB_BACKLIGHT  	default y  	help  	  Say Y here if you want to control the backlight of your display. @@ -975,7 +979,6 @@ config FB_RADEON_DEBUG  config FB_ATY128  	tristate "ATI Rage128 display support"  	depends on FB && PCI -	select FB_BACKLIGHT if FB_ATY128_BACKLIGHT  	select FB_IOMEM_HELPERS  	select FB_MACMODES if PPC_PMAC  	help @@ -989,6 +992,8 @@ config FB_ATY128  config FB_ATY128_BACKLIGHT  	bool "Support for backlight control"  	depends on FB_ATY128 +	depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_ATY128 +	select FB_BACKLIGHT  	default y  	help  	  Say Y here if you want to control the backlight of your display. @@ -999,7 +1004,6 @@ config FB_ATY  	select FB_CFB_FILLRECT  	select FB_CFB_COPYAREA  	select FB_CFB_IMAGEBLIT -	select FB_BACKLIGHT if FB_ATY_BACKLIGHT  	select FB_IOMEM_FOPS  	select FB_MACMODES if PPC  	select FB_ATY_CT if SPARC64 && PCI @@ -1040,6 +1044,8 @@ config FB_ATY_GX  config FB_ATY_BACKLIGHT  	bool "Support for backlight control"  	depends on FB_ATY +	depends on BACKLIGHT_CLASS_DEVICE=y || BACKLIGHT_CLASS_DEVICE=FB_ATY +	select FB_BACKLIGHT  	default y  	help  	  Say Y here if you want to control the backlight of your display. @@ -1528,6 +1534,7 @@ config FB_SH_MOBILE_LCDC  	depends on FB && HAVE_CLK && HAS_IOMEM  	depends on SUPERH || COMPILE_TEST  	depends on FB_DEVICE +	depends on BACKLIGHT_CLASS_DEVICE  	select FB_BACKLIGHT  	select FB_DEFERRED_IO  	select FB_DMAMEM_HELPERS @@ -1793,6 +1800,7 @@ config FB_SSD1307  	tristate "Solomon SSD1307 framebuffer support"  	depends on FB && I2C  	depends on GPIOLIB || COMPILE_TEST +	depends on BACKLIGHT_CLASS_DEVICE  	select FB_BACKLIGHT  	select FB_SYSMEM_HELPERS_DEFERRED  	help diff --git a/drivers/video/fbdev/core/Kconfig b/drivers/video/fbdev/core/Kconfig index 0ab8848ba2f1..d554d8c543d4 100644 --- a/drivers/video/fbdev/core/Kconfig +++ b/drivers/video/fbdev/core/Kconfig @@ -183,9 +183,8 @@ config FB_SYSMEM_HELPERS_DEFERRED  	select FB_SYSMEM_HELPERS  config FB_BACKLIGHT -	tristate +	bool  	depends on FB -	select BACKLIGHT_CLASS_DEVICE  config FB_MODE_HELPERS  	bool "Enable Video Mode Handling Helpers" diff --git a/drivers/virt/coco/arm-cca-guest/Kconfig b/drivers/virt/coco/arm-cca-guest/Kconfig index 9dd27c3ee215..3f0f013f03f1 100644 --- a/drivers/virt/coco/arm-cca-guest/Kconfig +++ b/drivers/virt/coco/arm-cca-guest/Kconfig @@ -1,7 +1,6 @@  config ARM_CCA_GUEST  	tristate "Arm CCA Guest driver"  	depends on ARM64 -	default m  	select TSM_REPORTS  	help  	  The driver provides userspace interface to request and diff --git a/drivers/virt/coco/efi_secret/efi_secret.c b/drivers/virt/coco/efi_secret/efi_secret.c index cd29e66b1543..1864f9f80617 100644 --- a/drivers/virt/coco/efi_secret/efi_secret.c +++ b/drivers/virt/coco/efi_secret/efi_secret.c @@ -334,7 +334,7 @@ static void efi_secret_remove(struct platform_device *dev)  static struct platform_driver efi_secret_driver = {  	.probe = efi_secret_probe, -	.remove_new = efi_secret_remove, +	.remove = efi_secret_remove,  	.driver = {  		.name = "efi_secret",  	}, diff --git a/drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c b/drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c index 56a3859dda8a..4230b817a80b 100644 --- a/drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c +++ b/drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c @@ -87,12 +87,8 @@ static int mmio_guard_ioremap_hook(phys_addr_t phys, size_t size,  	while (phys < end) {  		const int func_id = ARM_SMCCC_VENDOR_HYP_KVM_MMIO_GUARD_FUNC_ID; -		int err; - -		err = arm_smccc_do_one_page(func_id, phys); -		if (err) -			return err; +		WARN_ON_ONCE(arm_smccc_do_one_page(func_id, phys));  		phys += PAGE_SIZE;  	} diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c index fca5c45ed5cd..b699771be029 100644 --- a/drivers/virt/coco/sev-guest/sev-guest.c +++ b/drivers/virt/coco/sev-guest/sev-guest.c @@ -1116,7 +1116,7 @@ static void __exit sev_guest_remove(struct platform_device *pdev)   * triggering a section mismatch warning.   */  static struct platform_driver sev_guest_driver __refdata = { -	.remove_new	= __exit_p(sev_guest_remove), +	.remove		= __exit_p(sev_guest_remove),  	.driver		= {  		.name = "sev-guest",  	}, diff --git a/drivers/virt/coco/tdx-guest/tdx-guest.c b/drivers/virt/coco/tdx-guest/tdx-guest.c index d7db6c824e13..224e7dde9cde 100644 --- a/drivers/virt/coco/tdx-guest/tdx-guest.c +++ b/drivers/virt/coco/tdx-guest/tdx-guest.c @@ -124,10 +124,8 @@ static void *alloc_quote_buf(void)  	if (!addr)  		return NULL; -	if (set_memory_decrypted((unsigned long)addr, count)) { -		free_pages_exact(addr, len); +	if (set_memory_decrypted((unsigned long)addr, count))  		return NULL; -	}  	return addr;  } diff --git a/drivers/virt/vboxguest/Kconfig b/drivers/virt/vboxguest/Kconfig index cc329887bfae..11b153e7454e 100644 --- a/drivers/virt/vboxguest/Kconfig +++ b/drivers/virt/vboxguest/Kconfig @@ -1,7 +1,7 @@  # SPDX-License-Identifier: GPL-2.0-only  config VBOXGUEST  	tristate "Virtual Box Guest integration support" -	depends on X86 && PCI && INPUT +	depends on (ARM64 || X86) && PCI && INPUT  	help  	  This is a driver for the Virtual Box Guest PCI device used in  	  Virtual Box virtual machines. Enabling this driver will add diff --git a/drivers/virtio/virtio_dma_buf.c b/drivers/virtio/virtio_dma_buf.c index 3034a2f605c8..3fe1d03b0645 100644 --- a/drivers/virtio/virtio_dma_buf.c +++ b/drivers/virtio/virtio_dma_buf.c @@ -87,4 +87,4 @@ EXPORT_SYMBOL(virtio_dma_buf_get_uuid);  MODULE_DESCRIPTION("dma-bufs for virtio exported objects");  MODULE_LICENSE("GPL"); -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF"); diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c index 90e784e7b721..5d78c2d572ab 100644 --- a/drivers/virtio/virtio_mmio.c +++ b/drivers/virtio/virtio_mmio.c @@ -845,7 +845,7 @@ MODULE_DEVICE_TABLE(acpi, virtio_mmio_acpi_match);  static struct platform_driver virtio_mmio_driver = {  	.probe		= virtio_mmio_probe, -	.remove_new	= virtio_mmio_remove, +	.remove		= virtio_mmio_remove,  	.driver		= {  		.name	= "virtio-mmio",  		.of_match_table	= virtio_mmio_match, diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 82a7d2cbc704..fdd2d2b07b5a 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c @@ -2772,6 +2772,7 @@ EXPORT_SYMBOL_GPL(vring_create_virtqueue_dma);   * @_vq: the struct virtqueue we're talking about.   * @num: new ring num   * @recycle: callback to recycle unused buffers + * @recycle_done: callback to be invoked when recycle for all unused buffers done   *   * When it is really necessary to create a new vring, it will set the current vq   * into the reset state. Then call the passed callback to recycle the buffer @@ -2792,7 +2793,8 @@ EXPORT_SYMBOL_GPL(vring_create_virtqueue_dma);   *   */  int virtqueue_resize(struct virtqueue *_vq, u32 num, -		     void (*recycle)(struct virtqueue *vq, void *buf)) +		     void (*recycle)(struct virtqueue *vq, void *buf), +		     void (*recycle_done)(struct virtqueue *vq))  {  	struct vring_virtqueue *vq = to_vvq(_vq);  	int err; @@ -2809,6 +2811,8 @@ int virtqueue_resize(struct virtqueue *_vq, u32 num,  	err = virtqueue_disable_and_recycle(_vq, recycle);  	if (err)  		return err; +	if (recycle_done) +		recycle_done(_vq);  	if (vq->packed_ring)  		err = virtqueue_resize_packed(_vq, num); @@ -2823,6 +2827,7 @@ EXPORT_SYMBOL_GPL(virtqueue_resize);   * virtqueue_reset - detach and recycle all unused buffers   * @_vq: the struct virtqueue we're talking about.   * @recycle: callback to recycle unused buffers + * @recycle_done: callback to be invoked when recycle for all unused buffers done   *   * Caller must ensure we don't call this with other virtqueue operations   * at the same time (except where noted). @@ -2834,7 +2839,8 @@ EXPORT_SYMBOL_GPL(virtqueue_resize);   * -EPERM: Operation not permitted   */  int virtqueue_reset(struct virtqueue *_vq, -		    void (*recycle)(struct virtqueue *vq, void *buf)) +		    void (*recycle)(struct virtqueue *vq, void *buf), +		    void (*recycle_done)(struct virtqueue *vq))  {  	struct vring_virtqueue *vq = to_vvq(_vq);  	int err; @@ -2842,6 +2848,8 @@ int virtqueue_reset(struct virtqueue *_vq,  	err = virtqueue_disable_and_recycle(_vq, recycle);  	if (err)  		return err; +	if (recycle_done) +		recycle_done(_vq);  	if (vq->packed_ring)  		virtqueue_reinit_packed(vq); diff --git a/drivers/w1/masters/amd_axi_w1.c b/drivers/w1/masters/amd_axi_w1.c index 4d3a68ca9263..5da8b8d86811 100644 --- a/drivers/w1/masters/amd_axi_w1.c +++ b/drivers/w1/masters/amd_axi_w1.c @@ -383,7 +383,7 @@ MODULE_DEVICE_TABLE(of, amd_axi_w1_of_match);  static struct platform_driver amd_axi_w1_driver = {  	.probe = amd_axi_w1_probe, -	.remove_new = amd_axi_w1_remove, +	.remove = amd_axi_w1_remove,  	.driver = {  		.name = DRIVER_NAME,  		.of_match_table = amd_axi_w1_of_match, diff --git a/drivers/w1/masters/mxc_w1.c b/drivers/w1/masters/mxc_w1.c index ba1d0866d1c4..30a190ce4298 100644 --- a/drivers/w1/masters/mxc_w1.c +++ b/drivers/w1/masters/mxc_w1.c @@ -172,7 +172,7 @@ static struct platform_driver mxc_w1_driver = {  		.of_match_table = mxc_w1_dt_ids,  	},  	.probe = mxc_w1_probe, -	.remove_new = mxc_w1_remove, +	.remove = mxc_w1_remove,  };  module_platform_driver(mxc_w1_driver); diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c index d1cb5190445a..69b1d145657a 100644 --- a/drivers/w1/masters/omap_hdq.c +++ b/drivers/w1/masters/omap_hdq.c @@ -672,7 +672,7 @@ MODULE_DEVICE_TABLE(of, omap_hdq_dt_ids);  static struct platform_driver omap_hdq_driver = {  	.probe = omap_hdq_probe, -	.remove_new = omap_hdq_remove, +	.remove = omap_hdq_remove,  	.driver = {  		.name =	"omap_hdq",  		.of_match_table = omap_hdq_dt_ids, diff --git a/drivers/w1/masters/sgi_w1.c b/drivers/w1/masters/sgi_w1.c index 7bb7876aa70e..af6b1186b763 100644 --- a/drivers/w1/masters/sgi_w1.c +++ b/drivers/w1/masters/sgi_w1.c @@ -117,7 +117,7 @@ static struct platform_driver sgi_w1_driver = {  		.name = "sgi_w1",  	},  	.probe = sgi_w1_probe, -	.remove_new = sgi_w1_remove, +	.remove = sgi_w1_remove,  };  module_platform_driver(sgi_w1_driver); diff --git a/drivers/w1/masters/w1-gpio.c b/drivers/w1/masters/w1-gpio.c index a39fa8bf866a..a579f95be8f1 100644 --- a/drivers/w1/masters/w1-gpio.c +++ b/drivers/w1/masters/w1-gpio.c @@ -146,7 +146,7 @@ static struct platform_driver w1_gpio_driver = {  		.of_match_table = w1_gpio_dt_ids,  	},  	.probe = w1_gpio_probe, -	.remove_new = w1_gpio_remove, +	.remove = w1_gpio_remove,  };  module_platform_driver(w1_gpio_driver); diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 2333476a42c0..f81705f8539a 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -408,6 +408,14 @@ config SL28CPLD_WATCHDOG  # ARM Architecture +config AIROHA_WATCHDOG +	tristate "Airoha EN7581 Watchdog" +	depends on ARCH_AIROHA || COMPILE_TEST +	select WATCHDOG_CORE +	help +	  Watchdog timer embedded into Airoha SoC. This will reboot your +	  system when the timeout is reached. +  config ARM_SP805_WATCHDOG  	tristate "ARM SP805 Watchdog"  	depends on (ARM || ARM64 || COMPILE_TEST) && ARM_AMBA @@ -549,6 +557,7 @@ config S3C2410_WATCHDOG  	tristate "S3C6410/S5Pv210/Exynos Watchdog"  	depends on ARCH_S3C64XX || ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST  	select WATCHDOG_CORE +	select MFD_SYSCON if ARCH_EXYNOS  	help  	  Watchdog timer block in the Samsung S3C64xx, S5Pv210 and Exynos  	  SoCs. This will reboot the system when the timer expires with @@ -1543,14 +1552,6 @@ config SBC7240_WDT  	  To compile this driver as a module, choose M here: the  	  module will be called sbc7240_wdt. -config CPU5_WDT -	tristate "SMA CPU5 Watchdog" -	depends on (X86 || COMPILE_TEST) && HAS_IOPORT -	help -	  TBD. -	  To compile this driver as a module, choose M here: the -	  module will be called cpu5wdt. -  config SMSC_SCH311X_WDT  	tristate "SMSC SCH311X Watchdog Timer"  	depends on (X86 || COMPILE_TEST) && HAS_IOPORT diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index 386d88d89fe5..8411626fa162 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -40,6 +40,7 @@ obj-$(CONFIG_USBPCWATCHDOG) += pcwd_usb.o  obj-$(CONFIG_ARM_SP805_WATCHDOG) += sp805_wdt.o  obj-$(CONFIG_ARM_SBSA_WATCHDOG) += sbsa_gwdt.o  obj-$(CONFIG_ARMADA_37XX_WATCHDOG) += armada_37xx_wdt.o +obj-$(CONFIG_AIROHA_WATCHDOG) += airoha_wdt.o  obj-$(CONFIG_ASM9260_WATCHDOG) += asm9260_wdt.o  obj-$(CONFIG_AT91RM9200_WATCHDOG) += at91rm9200_wdt.o  obj-$(CONFIG_AT91SAM9X_WATCHDOG) += at91sam9_wdt.o @@ -138,7 +139,6 @@ obj-$(CONFIG_RDC321X_WDT) += rdc321x_wdt.o  obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o  obj-$(CONFIG_SBC8360_WDT) += sbc8360.o  obj-$(CONFIG_SBC7240_WDT) += sbc7240_wdt.o -obj-$(CONFIG_CPU5_WDT) += cpu5wdt.o  obj-$(CONFIG_SMSC_SCH311X_WDT) += sch311x_wdt.o  obj-$(CONFIG_SMSC37B787_WDT) += smsc37b787_wdt.o  obj-$(CONFIG_TQMX86_WDT) += tqmx86_wdt.o diff --git a/drivers/watchdog/acquirewdt.c b/drivers/watchdog/acquirewdt.c index 08ca18e91124..052f65c48a70 100644 --- a/drivers/watchdog/acquirewdt.c +++ b/drivers/watchdog/acquirewdt.c @@ -285,7 +285,7 @@ static void acq_shutdown(struct platform_device *dev)  }  static struct platform_driver acquirewdt_driver = { -	.remove_new	= acq_remove, +	.remove		= acq_remove,  	.shutdown	= acq_shutdown,  	.driver		= {  		.name	= DRV_NAME, diff --git a/drivers/watchdog/advantechwdt.c b/drivers/watchdog/advantechwdt.c index e41cd3ba4e0e..42d3f3771781 100644 --- a/drivers/watchdog/advantechwdt.c +++ b/drivers/watchdog/advantechwdt.c @@ -293,7 +293,7 @@ static void advwdt_shutdown(struct platform_device *dev)  }  static struct platform_driver advwdt_driver = { -	.remove_new	= advwdt_remove, +	.remove		= advwdt_remove,  	.shutdown	= advwdt_shutdown,  	.driver		= {  		.name	= DRV_NAME, diff --git a/drivers/watchdog/airoha_wdt.c b/drivers/watchdog/airoha_wdt.c new file mode 100644 index 000000000000..dc8ca11c14d8 --- /dev/null +++ b/drivers/watchdog/airoha_wdt.c @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + *	Airoha Watchdog Driver + * + *	Copyright (c) 2024, AIROHA  All rights reserved. + * + *	Mayur Kumar <mayur.kumar@airoha.com> + *	Christian Marangi <ansuelsmth@gmail.com> + * + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/moduleparam.h> +#include <linux/types.h> +#include <linux/bitfield.h> +#include <linux/clk.h> +#include <linux/io.h> +#include <linux/math.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/watchdog.h> + +/* Base address of timer and watchdog registers */ +#define TIMER_CTRL			0x0 +#define   WDT_ENABLE			BIT(25) +#define   WDT_TIMER_INTERRUPT		BIT(21) +/* Timer3 is used as Watchdog Timer */ +#define   WDT_TIMER_ENABLE		BIT(5) +#define WDT_TIMER_LOAD_VALUE		0x2c +#define WDT_TIMER_CUR_VALUE		0x30 +#define  WDT_TIMER_VAL			GENMASK(31, 0) +#define WDT_RELOAD			0x38 +#define   WDT_RLD			BIT(0) + +/* Airoha watchdog structure description */ +struct airoha_wdt_desc { +	struct watchdog_device wdog_dev; +	unsigned int wdt_freq; +	void __iomem *base; +}; + +#define WDT_HEARTBEAT			24 +static int heartbeat = WDT_HEARTBEAT; +module_param(heartbeat, int, 0); +MODULE_PARM_DESC(heartbeat, "Watchdog heartbeats in seconds. (default=" +		 __MODULE_STRING(WDT_HEARTBEAT) ")"); + +static bool nowayout = WATCHDOG_NOWAYOUT; +module_param(nowayout, bool, 0); +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" +		 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); + +static int airoha_wdt_start(struct watchdog_device *wdog_dev) +{ +	struct airoha_wdt_desc *airoha_wdt = watchdog_get_drvdata(wdog_dev); +	u32 val; + +	val = readl(airoha_wdt->base + TIMER_CTRL); +	val |= (WDT_TIMER_ENABLE | WDT_ENABLE | WDT_TIMER_INTERRUPT); +	writel(val, airoha_wdt->base + TIMER_CTRL); +	val = wdog_dev->timeout * airoha_wdt->wdt_freq; +	writel(val, airoha_wdt->base + WDT_TIMER_LOAD_VALUE); + +	return 0; +} + +static int airoha_wdt_stop(struct watchdog_device *wdog_dev) +{ +	struct airoha_wdt_desc *airoha_wdt = watchdog_get_drvdata(wdog_dev); +	u32 val; + +	val = readl(airoha_wdt->base + TIMER_CTRL); +	val &= (~WDT_ENABLE & ~WDT_TIMER_ENABLE); +	writel(val, airoha_wdt->base + TIMER_CTRL); + +	return 0; +} + +static int airoha_wdt_ping(struct watchdog_device *wdog_dev) +{ +	struct airoha_wdt_desc *airoha_wdt = watchdog_get_drvdata(wdog_dev); +	u32 val; + +	val = readl(airoha_wdt->base + WDT_RELOAD); +	val |= WDT_RLD; +	writel(val, airoha_wdt->base + WDT_RELOAD); + +	return 0; +} + +static int airoha_wdt_set_timeout(struct watchdog_device *wdog_dev, unsigned int timeout) +{ +	wdog_dev->timeout = timeout; + +	if (watchdog_active(wdog_dev)) { +		airoha_wdt_stop(wdog_dev); +		return airoha_wdt_start(wdog_dev); +	} + +	return 0; +} + +static unsigned int airoha_wdt_get_timeleft(struct watchdog_device *wdog_dev) +{ +	struct airoha_wdt_desc *airoha_wdt = watchdog_get_drvdata(wdog_dev); +	u32 val; + +	val = readl(airoha_wdt->base + WDT_TIMER_CUR_VALUE); +	return DIV_ROUND_UP(val, airoha_wdt->wdt_freq); +} + +static const struct watchdog_info airoha_wdt_info = { +	.options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING, +	.identity = "Airoha Watchdog", +}; + +static const struct watchdog_ops airoha_wdt_ops = { +	.owner = THIS_MODULE, +	.start = airoha_wdt_start, +	.stop = airoha_wdt_stop, +	.ping = airoha_wdt_ping, +	.set_timeout = airoha_wdt_set_timeout, +	.get_timeleft = airoha_wdt_get_timeleft, +}; + +static int airoha_wdt_probe(struct platform_device *pdev) +{ +	struct airoha_wdt_desc *airoha_wdt; +	struct watchdog_device *wdog_dev; +	struct device *dev = &pdev->dev; +	struct clk *bus_clk; +	int ret; + +	airoha_wdt = devm_kzalloc(dev, sizeof(*airoha_wdt), GFP_KERNEL); +	if (!airoha_wdt) +		return -ENOMEM; + +	airoha_wdt->base = devm_platform_ioremap_resource(pdev, 0); +	if (IS_ERR(airoha_wdt->base)) +		return PTR_ERR(airoha_wdt->base); + +	bus_clk = devm_clk_get_enabled(dev, "bus"); +	if (IS_ERR(bus_clk)) +		return dev_err_probe(dev, PTR_ERR(bus_clk), +				     "failed to enable bus clock\n"); + +	/* Watchdog ticks at half the bus rate */ +	airoha_wdt->wdt_freq = clk_get_rate(bus_clk) / 2; + +	/* Initialize struct watchdog device */ +	wdog_dev = &airoha_wdt->wdog_dev; +	wdog_dev->timeout = heartbeat; +	wdog_dev->info = &airoha_wdt_info; +	wdog_dev->ops = &airoha_wdt_ops; +	/* Bus 300MHz, watchdog 150MHz, 28 seconds */ +	wdog_dev->max_timeout = FIELD_MAX(WDT_TIMER_VAL) / airoha_wdt->wdt_freq; +	wdog_dev->parent = dev; + +	watchdog_set_drvdata(wdog_dev, airoha_wdt); +	watchdog_set_nowayout(wdog_dev, nowayout); +	watchdog_stop_on_unregister(wdog_dev); + +	ret = devm_watchdog_register_device(dev, wdog_dev); +	if (ret) +		return ret; + +	platform_set_drvdata(pdev, airoha_wdt); +	return 0; +} + +static int airoha_wdt_suspend(struct device *dev) +{ +	struct airoha_wdt_desc *airoha_wdt = dev_get_drvdata(dev); + +	if (watchdog_active(&airoha_wdt->wdog_dev)) +		airoha_wdt_stop(&airoha_wdt->wdog_dev); + +	return 0; +} + +static int airoha_wdt_resume(struct device *dev) +{ +	struct airoha_wdt_desc *airoha_wdt = dev_get_drvdata(dev); + +	if (watchdog_active(&airoha_wdt->wdog_dev)) { +		airoha_wdt_start(&airoha_wdt->wdog_dev); +		airoha_wdt_ping(&airoha_wdt->wdog_dev); +	} +	return 0; +} + +static const struct of_device_id airoha_wdt_of_match[] = { +	{ .compatible = "airoha,en7581-wdt", }, +	{ }, +}; + +MODULE_DEVICE_TABLE(of, airoha_wdt_of_match); + +static DEFINE_SIMPLE_DEV_PM_OPS(airoha_wdt_pm_ops, airoha_wdt_suspend, airoha_wdt_resume); + +static struct platform_driver airoha_wdt_driver = { +	.probe = airoha_wdt_probe, +	.driver = { +		.name = "airoha-wdt", +		.pm = pm_sleep_ptr(&airoha_wdt_pm_ops), +		.of_match_table = airoha_wdt_of_match, +	}, +}; + +module_platform_driver(airoha_wdt_driver); + +MODULE_AUTHOR("Mayur Kumar <mayur.kumar@airoha.com>"); +MODULE_AUTHOR("Christian Marangi <ansuelsmth@gmail.com>"); +MODULE_DESCRIPTION("Airoha EN7581 Watchdog Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/watchdog/apple_wdt.c b/drivers/watchdog/apple_wdt.c index d4f739932f0b..95d9e37df41c 100644 --- a/drivers/watchdog/apple_wdt.c +++ b/drivers/watchdog/apple_wdt.c @@ -127,11 +127,11 @@ static int apple_wdt_restart(struct watchdog_device *wdd, unsigned long mode,  	/*  	 * Flush writes and then wait for the SoC to reset. Even though the  	 * reset is queued almost immediately experiments have shown that it -	 * can take up to ~20-25ms until the SoC is actually reset. Just wait -	 * 50ms here to be safe. +	 * can take up to ~120-125ms until the SoC is actually reset. Just +	 * wait 150ms here to be safe.  	 */ -	(void)readl_relaxed(wdt->regs + APPLE_WDT_WD1_CUR_TIME); -	mdelay(50); +	(void)readl(wdt->regs + APPLE_WDT_WD1_CUR_TIME); +	mdelay(150);  	return 0;  } diff --git a/drivers/watchdog/armada_37xx_wdt.c b/drivers/watchdog/armada_37xx_wdt.c index 8133a5d05647..a17a7911771a 100644 --- a/drivers/watchdog/armada_37xx_wdt.c +++ b/drivers/watchdog/armada_37xx_wdt.c @@ -248,7 +248,6 @@ static const struct watchdog_ops armada_37xx_wdt_ops = {  static int armada_37xx_wdt_probe(struct platform_device *pdev)  {  	struct armada_37xx_watchdog *dev; -	struct resource *res;  	struct regmap *regmap;  	int ret; @@ -266,12 +265,9 @@ static int armada_37xx_wdt_probe(struct platform_device *pdev)  		return PTR_ERR(regmap);  	dev->cpu_misc = regmap; -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!res) -		return -ENODEV; -	dev->reg = devm_ioremap(&pdev->dev, res->start, resource_size(res)); -	if (!dev->reg) -		return -ENOMEM; +	dev->reg = devm_platform_ioremap_resource(pdev, 0); +	if (IS_ERR(dev->reg)) +		return PTR_ERR(dev->reg);  	/* init clock */  	dev->clk = devm_clk_get_enabled(&pdev->dev, NULL); diff --git a/drivers/watchdog/at91rm9200_wdt.c b/drivers/watchdog/at91rm9200_wdt.c index 17382512a609..1795aaf1ec45 100644 --- a/drivers/watchdog/at91rm9200_wdt.c +++ b/drivers/watchdog/at91rm9200_wdt.c @@ -295,7 +295,7 @@ MODULE_DEVICE_TABLE(of, at91_wdt_dt_ids);  static struct platform_driver at91wdt_driver = {  	.probe		= at91wdt_probe, -	.remove_new	= at91wdt_remove, +	.remove		= at91wdt_remove,  	.shutdown	= at91wdt_shutdown,  	.suspend	= pm_ptr(at91wdt_suspend),  	.resume		= pm_ptr(at91wdt_resume), diff --git a/drivers/watchdog/at91sam9_wdt.c b/drivers/watchdog/at91sam9_wdt.c index 2c6474cb858b..7be70b98d091 100644 --- a/drivers/watchdog/at91sam9_wdt.c +++ b/drivers/watchdog/at91sam9_wdt.c @@ -392,7 +392,7 @@ MODULE_DEVICE_TABLE(of, at91_wdt_dt_ids);  static struct platform_driver at91wdt_driver = {  	.probe		= at91wdt_probe, -	.remove_new	= at91wdt_remove, +	.remove		= at91wdt_remove,  	.driver		= {  		.name	= "at91_wdt",  		.of_match_table = of_match_ptr(at91_wdt_dt_ids), diff --git a/drivers/watchdog/ath79_wdt.c b/drivers/watchdog/ath79_wdt.c index d16b2c583fa4..7df703e9852a 100644 --- a/drivers/watchdog/ath79_wdt.c +++ b/drivers/watchdog/ath79_wdt.c @@ -305,7 +305,7 @@ MODULE_DEVICE_TABLE(of, ath79_wdt_match);  static struct platform_driver ath79_wdt_driver = {  	.probe		= ath79_wdt_probe, -	.remove_new	= ath79_wdt_remove, +	.remove		= ath79_wdt_remove,  	.shutdown	= ath79_wdt_shutdown,  	.driver		= {  		.name	= DRIVER_NAME, diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c index bb001c5d7f17..9fcfee63905b 100644 --- a/drivers/watchdog/bcm2835_wdt.c +++ b/drivers/watchdog/bcm2835_wdt.c @@ -227,7 +227,7 @@ static void bcm2835_wdt_remove(struct platform_device *pdev)  static struct platform_driver bcm2835_wdt_driver = {  	.probe		= bcm2835_wdt_probe, -	.remove_new	= bcm2835_wdt_remove, +	.remove		= bcm2835_wdt_remove,  	.driver = {  		.name =		"bcm2835-wdt",  	}, diff --git a/drivers/watchdog/bcm_kona_wdt.c b/drivers/watchdog/bcm_kona_wdt.c index 49e12d47b073..66bd0324fd68 100644 --- a/drivers/watchdog/bcm_kona_wdt.c +++ b/drivers/watchdog/bcm_kona_wdt.c @@ -328,7 +328,7 @@ static struct platform_driver bcm_kona_wdt_driver = {  			.of_match_table = bcm_kona_wdt_of_match,  		  },  	.probe = bcm_kona_wdt_probe, -	.remove_new = bcm_kona_wdt_remove, +	.remove = bcm_kona_wdt_remove,  };  module_platform_driver(bcm_kona_wdt_driver); diff --git a/drivers/watchdog/cpu5wdt.c b/drivers/watchdog/cpu5wdt.c deleted file mode 100644 index f94b84048612..000000000000 --- a/drivers/watchdog/cpu5wdt.c +++ /dev/null @@ -1,284 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * sma cpu5 watchdog driver - * - * Copyright (C) 2003 Heiko Ronsdorf <hero@ihg.uni-duisburg.de> - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/types.h> -#include <linux/errno.h> -#include <linux/miscdevice.h> -#include <linux/fs.h> -#include <linux/ioport.h> -#include <linux/timer.h> -#include <linux/completion.h> -#include <linux/jiffies.h> -#include <linux/io.h> -#include <linux/uaccess.h> -#include <linux/watchdog.h> - -/* adjustable parameters */ - -static int verbose; -static int port = 0x91; -static int ticks = 10000; -static DEFINE_SPINLOCK(cpu5wdt_lock); - -#define PFX			"cpu5wdt: " - -#define CPU5WDT_EXTENT          0x0A - -#define CPU5WDT_STATUS_REG      0x00 -#define CPU5WDT_TIME_A_REG      0x02 -#define CPU5WDT_TIME_B_REG      0x03 -#define CPU5WDT_MODE_REG        0x04 -#define CPU5WDT_TRIGGER_REG     0x07 -#define CPU5WDT_ENABLE_REG      0x08 -#define CPU5WDT_RESET_REG       0x09 - -#define CPU5WDT_INTERVAL	(HZ/10+1) - -/* some device data */ - -static struct { -	struct completion stop; -	int running; -	struct timer_list timer; -	int queue; -	int default_ticks; -	unsigned long inuse; -} cpu5wdt_device; - -/* generic helper functions */ - -static void cpu5wdt_trigger(struct timer_list *unused) -{ -	if (verbose > 2) -		pr_debug("trigger at %i ticks\n", ticks); - -	if (cpu5wdt_device.running) -		ticks--; - -	spin_lock(&cpu5wdt_lock); -	/* keep watchdog alive */ -	outb(1, port + CPU5WDT_TRIGGER_REG); - -	/* requeue?? */ -	if (cpu5wdt_device.queue && ticks) -		mod_timer(&cpu5wdt_device.timer, jiffies + CPU5WDT_INTERVAL); -	else { -		/* ticks doesn't matter anyway */ -		complete(&cpu5wdt_device.stop); -	} -	spin_unlock(&cpu5wdt_lock); - -} - -static void cpu5wdt_reset(void) -{ -	ticks = cpu5wdt_device.default_ticks; - -	if (verbose) -		pr_debug("reset (%i ticks)\n", (int) ticks); - -} - -static void cpu5wdt_start(void) -{ -	unsigned long flags; - -	spin_lock_irqsave(&cpu5wdt_lock, flags); -	if (!cpu5wdt_device.queue) { -		cpu5wdt_device.queue = 1; -		outb(0, port + CPU5WDT_TIME_A_REG); -		outb(0, port + CPU5WDT_TIME_B_REG); -		outb(1, port + CPU5WDT_MODE_REG); -		outb(0, port + CPU5WDT_RESET_REG); -		outb(0, port + CPU5WDT_ENABLE_REG); -		mod_timer(&cpu5wdt_device.timer, jiffies + CPU5WDT_INTERVAL); -	} -	/* if process dies, counter is not decremented */ -	cpu5wdt_device.running++; -	spin_unlock_irqrestore(&cpu5wdt_lock, flags); -} - -static int cpu5wdt_stop(void) -{ -	unsigned long flags; - -	spin_lock_irqsave(&cpu5wdt_lock, flags); -	if (cpu5wdt_device.running) -		cpu5wdt_device.running = 0; -	ticks = cpu5wdt_device.default_ticks; -	spin_unlock_irqrestore(&cpu5wdt_lock, flags); -	if (verbose) -		pr_crit("stop not possible\n"); -	return -EIO; -} - -/* filesystem operations */ - -static int cpu5wdt_open(struct inode *inode, struct file *file) -{ -	if (test_and_set_bit(0, &cpu5wdt_device.inuse)) -		return -EBUSY; -	return stream_open(inode, file); -} - -static int cpu5wdt_release(struct inode *inode, struct file *file) -{ -	clear_bit(0, &cpu5wdt_device.inuse); -	return 0; -} - -static long cpu5wdt_ioctl(struct file *file, unsigned int cmd, -						unsigned long arg) -{ -	void __user *argp = (void __user *)arg; -	int __user *p = argp; -	unsigned int value; -	static const struct watchdog_info ident = { -		.options = WDIOF_CARDRESET, -		.identity = "CPU5 WDT", -	}; - -	switch (cmd) { -	case WDIOC_GETSUPPORT: -		if (copy_to_user(argp, &ident, sizeof(ident))) -			return -EFAULT; -		break; -	case WDIOC_GETSTATUS: -		value = inb(port + CPU5WDT_STATUS_REG); -		value = (value >> 2) & 1; -		return put_user(value, p); -	case WDIOC_GETBOOTSTATUS: -		return put_user(0, p); -	case WDIOC_SETOPTIONS: -		if (get_user(value, p)) -			return -EFAULT; -		if (value & WDIOS_ENABLECARD) -			cpu5wdt_start(); -		if (value & WDIOS_DISABLECARD) -			cpu5wdt_stop(); -		break; -	case WDIOC_KEEPALIVE: -		cpu5wdt_reset(); -		break; -	default: -		return -ENOTTY; -	} -	return 0; -} - -static ssize_t cpu5wdt_write(struct file *file, const char __user *buf, -						size_t count, loff_t *ppos) -{ -	if (!count) -		return -EIO; -	cpu5wdt_reset(); -	return count; -} - -static const struct file_operations cpu5wdt_fops = { -	.owner		= THIS_MODULE, -	.unlocked_ioctl	= cpu5wdt_ioctl, -	.compat_ioctl	= compat_ptr_ioctl, -	.open		= cpu5wdt_open, -	.write		= cpu5wdt_write, -	.release	= cpu5wdt_release, -}; - -static struct miscdevice cpu5wdt_misc = { -	.minor	= WATCHDOG_MINOR, -	.name	= "watchdog", -	.fops	= &cpu5wdt_fops, -}; - -/* init/exit function */ - -static int cpu5wdt_init(void) -{ -	unsigned int val; -	int err; - -	if (verbose) -		pr_debug("port=0x%x, verbose=%i\n", port, verbose); - -	init_completion(&cpu5wdt_device.stop); -	cpu5wdt_device.queue = 0; -	timer_setup(&cpu5wdt_device.timer, cpu5wdt_trigger, 0); -	cpu5wdt_device.default_ticks = ticks; - -	if (!request_region(port, CPU5WDT_EXTENT, PFX)) { -		pr_err("request_region failed\n"); -		err = -EBUSY; -		goto no_port; -	} - -	/* watchdog reboot? */ -	val = inb(port + CPU5WDT_STATUS_REG); -	val = (val >> 2) & 1; -	if (!val) -		pr_info("sorry, was my fault\n"); - -	err = misc_register(&cpu5wdt_misc); -	if (err < 0) { -		pr_err("misc_register failed\n"); -		goto no_misc; -	} - - -	pr_info("init success\n"); -	return 0; - -no_misc: -	release_region(port, CPU5WDT_EXTENT); -no_port: -	return err; -} - -static int cpu5wdt_init_module(void) -{ -	return cpu5wdt_init(); -} - -static void cpu5wdt_exit(void) -{ -	if (cpu5wdt_device.queue) { -		cpu5wdt_device.queue = 0; -		wait_for_completion(&cpu5wdt_device.stop); -		timer_shutdown_sync(&cpu5wdt_device.timer); -	} - -	misc_deregister(&cpu5wdt_misc); - -	release_region(port, CPU5WDT_EXTENT); - -} - -static void cpu5wdt_exit_module(void) -{ -	cpu5wdt_exit(); -} - -/* module entry points */ - -module_init(cpu5wdt_init_module); -module_exit(cpu5wdt_exit_module); - -MODULE_AUTHOR("Heiko Ronsdorf <hero@ihg.uni-duisburg.de>"); -MODULE_DESCRIPTION("sma cpu5 watchdog driver"); -MODULE_LICENSE("GPL"); - -module_param_hw(port, int, ioport, 0); -MODULE_PARM_DESC(port, "base address of watchdog card, default is 0x91"); - -module_param(verbose, int, 0); -MODULE_PARM_DESC(verbose, "be verbose, default is 0 (no)"); - -module_param(ticks, int, 0); -MODULE_PARM_DESC(ticks, "count down ticks, default is 10000"); diff --git a/drivers/watchdog/cpwd.c b/drivers/watchdog/cpwd.c index 8ee81f018dda..4fb92c9e046a 100644 --- a/drivers/watchdog/cpwd.c +++ b/drivers/watchdog/cpwd.c @@ -653,7 +653,7 @@ static struct platform_driver cpwd_driver = {  		.of_match_table = cpwd_match,  	},  	.probe		= cpwd_probe, -	.remove_new	= cpwd_remove, +	.remove		= cpwd_remove,  };  module_platform_driver(cpwd_driver); diff --git a/drivers/watchdog/da9055_wdt.c b/drivers/watchdog/da9055_wdt.c index 389a4bdd208c..9d5a2009466f 100644 --- a/drivers/watchdog/da9055_wdt.c +++ b/drivers/watchdog/da9055_wdt.c @@ -146,12 +146,7 @@ static int da9055_wdt_probe(struct platform_device *pdev)  		return ret;  	} -	ret = devm_watchdog_register_device(dev, &driver_data->wdt); -	if (ret != 0) -		dev_err(da9055->dev, "watchdog_register_device() failed: %d\n", -			ret); - -	return ret; +	return devm_watchdog_register_device(dev, &driver_data->wdt);  }  static struct platform_driver da9055_wdt_driver = { diff --git a/drivers/watchdog/da9063_wdt.c b/drivers/watchdog/da9063_wdt.c index 684667469b10..92e1b78ff481 100644 --- a/drivers/watchdog/da9063_wdt.c +++ b/drivers/watchdog/da9063_wdt.c @@ -27,7 +27,6 @@   *   others: timeout = 2048 ms * 2^(TWDSCALE-1).   */  static const unsigned int wdt_timeout[] = { 0, 2, 4, 8, 16, 32, 65, 131 }; -static bool use_sw_pm;  #define DA9063_TWDSCALE_DISABLE		0  #define DA9063_TWDSCALE_MIN		1 @@ -230,7 +229,7 @@ static int da9063_wdt_probe(struct platform_device *pdev)  	if (!wdd)  		return -ENOMEM; -	use_sw_pm = device_property_present(dev, "dlg,use-sw-pm"); +	da9063->use_sw_pm = device_property_present(dev, "dlg,use-sw-pm");  	wdd->info = &da9063_watchdog_info;  	wdd->ops = &da9063_watchdog_ops; @@ -264,11 +263,12 @@ static int da9063_wdt_probe(struct platform_device *pdev)  	return devm_watchdog_register_device(dev, wdd);  } -static int __maybe_unused da9063_wdt_suspend(struct device *dev) +static int da9063_wdt_suspend(struct device *dev)  {  	struct watchdog_device *wdd = dev_get_drvdata(dev); +	struct da9063 *da9063 = watchdog_get_drvdata(wdd); -	if (!use_sw_pm) +	if (!da9063->use_sw_pm)  		return 0;  	if (watchdog_active(wdd)) @@ -277,11 +277,12 @@ static int __maybe_unused da9063_wdt_suspend(struct device *dev)  	return 0;  } -static int __maybe_unused da9063_wdt_resume(struct device *dev) +static int da9063_wdt_resume(struct device *dev)  {  	struct watchdog_device *wdd = dev_get_drvdata(dev); +	struct da9063 *da9063 = watchdog_get_drvdata(wdd); -	if (!use_sw_pm) +	if (!da9063->use_sw_pm)  		return 0;  	if (watchdog_active(wdd)) @@ -290,14 +291,14 @@ static int __maybe_unused da9063_wdt_resume(struct device *dev)  	return 0;  } -static SIMPLE_DEV_PM_OPS(da9063_wdt_pm_ops, -			da9063_wdt_suspend, da9063_wdt_resume); +static DEFINE_SIMPLE_DEV_PM_OPS(da9063_wdt_pm_ops, da9063_wdt_suspend, +				da9063_wdt_resume);  static struct platform_driver da9063_wdt_driver = {  	.probe = da9063_wdt_probe,  	.driver = {  		.name = DA9063_DRVNAME_WATCHDOG, -		.pm = &da9063_wdt_pm_ops, +		.pm = pm_sleep_ptr(&da9063_wdt_pm_ops),  	},  };  module_platform_driver(da9063_wdt_driver); diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c index 84dca3695f86..26efca9ae0e7 100644 --- a/drivers/watchdog/dw_wdt.c +++ b/drivers/watchdog/dw_wdt.c @@ -684,7 +684,7 @@ MODULE_DEVICE_TABLE(of, dw_wdt_of_match);  static struct platform_driver dw_wdt_driver = {  	.probe		= dw_wdt_drv_probe, -	.remove_new	= dw_wdt_drv_remove, +	.remove		= dw_wdt_drv_remove,  	.driver		= {  		.name	= "dw_wdt",  		.of_match_table = of_match_ptr(dw_wdt_of_match), diff --git a/drivers/watchdog/gef_wdt.c b/drivers/watchdog/gef_wdt.c index d854fcfbfa5b..bf6f733dfb5f 100644 --- a/drivers/watchdog/gef_wdt.c +++ b/drivers/watchdog/gef_wdt.c @@ -305,7 +305,7 @@ static struct platform_driver gef_wdt_driver = {  		.of_match_table = gef_wdt_ids,  	},  	.probe		= gef_wdt_probe, -	.remove_new	= gef_wdt_remove, +	.remove		= gef_wdt_remove,  };  static int __init gef_wdt_init(void) diff --git a/drivers/watchdog/geodewdt.c b/drivers/watchdog/geodewdt.c index 4ed6d139320b..5b80ade1c681 100644 --- a/drivers/watchdog/geodewdt.c +++ b/drivers/watchdog/geodewdt.c @@ -248,7 +248,7 @@ static void geodewdt_shutdown(struct platform_device *dev)  }  static struct platform_driver geodewdt_driver = { -	.remove_new	= geodewdt_remove, +	.remove		= geodewdt_remove,  	.shutdown	= geodewdt_shutdown,  	.driver		= {  		.name	= DRV_NAME, diff --git a/drivers/watchdog/gxp-wdt.c b/drivers/watchdog/gxp-wdt.c index 2fd85be88278..f2c236160266 100644 --- a/drivers/watchdog/gxp-wdt.c +++ b/drivers/watchdog/gxp-wdt.c @@ -151,10 +151,8 @@ static int gxp_wdt_probe(struct platform_device *pdev)  	watchdog_stop_on_reboot(&drvdata->wdd);  	err = devm_watchdog_register_device(dev, &drvdata->wdd); -	if (err) { -		dev_err(dev, "Failed to register watchdog device"); +	if (err)  		return err; -	}  	dev_info(dev, "HPE GXP watchdog timer"); diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c index 35b358bcf94c..7672582fa407 100644 --- a/drivers/watchdog/iTCO_wdt.c +++ b/drivers/watchdog/iTCO_wdt.c @@ -82,6 +82,13 @@  #define TCO2_CNT(p)	(TCOBASE(p) + 0x0a) /* TCO2 Control Register	*/  #define TCOv2_TMR(p)	(TCOBASE(p) + 0x12) /* TCOv2 Timer Initial Value*/ +/* + * NMI_NOW is bit 8 of TCO1_CNT register + * Read/Write + * This bit is implemented as RW but has no effect on HW. + */ +#define NMI_NOW		BIT(8) +  /* internal variables */  struct iTCO_wdt_private {  	struct watchdog_device wddev; @@ -219,13 +226,23 @@ static int update_no_reboot_bit_cnt(void *priv, bool set)  	struct iTCO_wdt_private *p = priv;  	u16 val, newval; -	val = inw(TCO1_CNT(p)); +	/* +	 * writing back 1b1 to NMI_NOW of TCO1_CNT register +	 * causes NMI_NOW bit inversion what consequently does +	 * not allow to perform the register's value comparison +	 * properly. +	 * +	 * NMI_NOW bit masking for TCO1_CNT register values +	 * helps to avoid possible NMI_NOW bit inversions on +	 * following write operation. +	 */ +	val = inw(TCO1_CNT(p)) & ~NMI_NOW;  	if (set)  		val |= BIT(0);  	else  		val &= ~BIT(0);  	outw(val, TCO1_CNT(p)); -	newval = inw(TCO1_CNT(p)); +	newval = inw(TCO1_CNT(p)) & ~NMI_NOW;  	/* make sure the update is successful */  	return val != newval ? -EIO : 0; @@ -592,10 +609,8 @@ static int iTCO_wdt_probe(struct platform_device *pdev)  	watchdog_stop_on_reboot(&p->wddev);  	watchdog_stop_on_unregister(&p->wddev);  	ret = devm_watchdog_register_device(dev, &p->wddev); -	if (ret != 0) { -		dev_err(dev, "cannot register watchdog device (err=%d)\n", ret); +	if (ret != 0)  		return ret; -	}  	dev_info(dev, "initialized. heartbeat=%d sec (nowayout=%d)\n",  		heartbeat, nowayout); diff --git a/drivers/watchdog/ib700wdt.c b/drivers/watchdog/ib700wdt.c index b041ad90a62c..5ce6101d236d 100644 --- a/drivers/watchdog/ib700wdt.c +++ b/drivers/watchdog/ib700wdt.c @@ -331,7 +331,7 @@ static void ibwdt_shutdown(struct platform_device *dev)  }  static struct platform_driver ibwdt_driver = { -	.remove_new	= ibwdt_remove, +	.remove		= ibwdt_remove,  	.shutdown	= ibwdt_shutdown,  	.driver		= {  		.name	= DRV_NAME, diff --git a/drivers/watchdog/ie6xx_wdt.c b/drivers/watchdog/ie6xx_wdt.c index e5cbb409df25..5a7bb7e84653 100644 --- a/drivers/watchdog/ie6xx_wdt.c +++ b/drivers/watchdog/ie6xx_wdt.c @@ -280,7 +280,7 @@ static void ie6xx_wdt_remove(struct platform_device *pdev)  static struct platform_driver ie6xx_wdt_driver = {  	.probe		= ie6xx_wdt_probe, -	.remove_new	= ie6xx_wdt_remove, +	.remove		= ie6xx_wdt_remove,  	.driver		= {  		.name	= DRIVER_NAME,  	}, diff --git a/drivers/watchdog/it87_wdt.c b/drivers/watchdog/it87_wdt.c index 3e8c15138edd..a1e23dce8810 100644 --- a/drivers/watchdog/it87_wdt.c +++ b/drivers/watchdog/it87_wdt.c @@ -20,6 +20,8 @@  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include <linux/bits.h> +#include <linux/dmi.h>  #include <linux/init.h>  #include <linux/io.h>  #include <linux/kernel.h> @@ -40,6 +42,7 @@  #define VAL		0x2f  /* Logical device Numbers LDN */ +#define EC		0x04  #define GPIO		0x07  /* Configuration Registers and Functions */ @@ -73,6 +76,12 @@  #define IT8784_ID	0x8784  #define IT8786_ID	0x8786 +/* Environment Controller Configuration Registers LDN=0x04 */ +#define SCR1		0xfa + +/* Environment Controller Bits SCR1 */ +#define WDT_PWRGD	0x20 +  /* GPIO Configuration Registers LDN=0x07 */  #define WDTCTRL		0x71  #define WDTCFG		0x72 @@ -240,6 +249,21 @@ static int wdt_set_timeout(struct watchdog_device *wdd, unsigned int t)  	return ret;  } +enum { +	IT87_WDT_OUTPUT_THROUGH_PWRGD	= BIT(0), +}; + +static const struct dmi_system_id it87_quirks[] = { +	{ +		/* Qotom Q30900P (IT8786) */ +		.matches = { +			DMI_EXACT_MATCH(DMI_BOARD_NAME, "QCML04"), +		}, +		.driver_data = (void *)IT87_WDT_OUTPUT_THROUGH_PWRGD, +	}, +	{} +}; +  static const struct watchdog_info ident = {  	.options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING,  	.firmware_version = 1, @@ -261,8 +285,10 @@ static struct watchdog_device wdt_dev = {  static int __init it87_wdt_init(void)  { +	const struct dmi_system_id *dmi_id;  	u8  chip_rev;  	u8 ctrl; +	int quirks = 0;  	int rc;  	rc = superio_enter(); @@ -273,6 +299,10 @@ static int __init it87_wdt_init(void)  	chip_rev  = superio_inb(CHIPREV) & 0x0f;  	superio_exit(); +	dmi_id = dmi_first_match(it87_quirks); +	if (dmi_id) +		quirks = (long)dmi_id->driver_data; +  	switch (chip_type) {  	case IT8702_ID:  		max_units = 255; @@ -333,6 +363,15 @@ static int __init it87_wdt_init(void)  		superio_outb(0x00, WDTCTRL);  	} +	if (quirks & IT87_WDT_OUTPUT_THROUGH_PWRGD) { +		superio_select(EC); +		ctrl = superio_inb(SCR1); +		if (!(ctrl & WDT_PWRGD)) { +			ctrl |= WDT_PWRGD; +			superio_outb(ctrl, SCR1); +		} +	} +  	superio_exit();  	if (timeout < 1 || timeout > max_units * 60) { @@ -349,10 +388,8 @@ static int __init it87_wdt_init(void)  	watchdog_stop_on_reboot(&wdt_dev);  	rc = watchdog_register_device(&wdt_dev); -	if (rc) { -		pr_err("Cannot register watchdog device (err=%d)\n", rc); +	if (rc)  		return rc; -	}  	pr_info("Chip IT%04x revision %d initialized. timeout=%d sec (nowayout=%d testmode=%d)\n",  		chip_type, chip_rev, timeout, nowayout, testmode); diff --git a/drivers/watchdog/lpc18xx_wdt.c b/drivers/watchdog/lpc18xx_wdt.c index 19535f4a2fd2..f19580e1b318 100644 --- a/drivers/watchdog/lpc18xx_wdt.c +++ b/drivers/watchdog/lpc18xx_wdt.c @@ -281,7 +281,7 @@ static struct platform_driver lpc18xx_wdt_driver = {  		.of_match_table	= lpc18xx_wdt_match,  	},  	.probe = lpc18xx_wdt_probe, -	.remove_new = lpc18xx_wdt_remove, +	.remove = lpc18xx_wdt_remove,  };  module_platform_driver(lpc18xx_wdt_driver); diff --git a/drivers/watchdog/menz69_wdt.c b/drivers/watchdog/menz69_wdt.c index 0508a65acfa6..6e5e4e5c0b56 100644 --- a/drivers/watchdog/menz69_wdt.c +++ b/drivers/watchdog/menz69_wdt.c @@ -164,4 +164,4 @@ MODULE_AUTHOR("Johannes Thumshirn <jth@kernel.org>");  MODULE_DESCRIPTION("Watchdog driver for the MEN z069 IP-Core");  MODULE_LICENSE("GPL v2");  MODULE_ALIAS("mcb:16z069"); -MODULE_IMPORT_NS(MCB); +MODULE_IMPORT_NS("MCB"); diff --git a/drivers/watchdog/mtk_wdt.c b/drivers/watchdog/mtk_wdt.c index c35f85ce8d69..91d110646e16 100644 --- a/drivers/watchdog/mtk_wdt.c +++ b/drivers/watchdog/mtk_wdt.c @@ -10,6 +10,7 @@   */  #include <dt-bindings/reset/mt2712-resets.h> +#include <dt-bindings/reset/mediatek,mt6735-wdt.h>  #include <dt-bindings/reset/mediatek,mt6795-resets.h>  #include <dt-bindings/reset/mt7986-resets.h>  #include <dt-bindings/reset/mt8183-resets.h> @@ -87,6 +88,10 @@ static const struct mtk_wdt_data mt2712_data = {  	.toprgu_sw_rst_num = MT2712_TOPRGU_SW_RST_NUM,  }; +static const struct mtk_wdt_data mt6735_data = { +	.toprgu_sw_rst_num = MT6735_TOPRGU_RST_NUM, +}; +  static const struct mtk_wdt_data mt6795_data = {  	.toprgu_sw_rst_num = MT6795_TOPRGU_SW_RST_NUM,  }; @@ -225,9 +230,15 @@ static int mtk_wdt_restart(struct watchdog_device *wdt_dev,  {  	struct mtk_wdt_dev *mtk_wdt = watchdog_get_drvdata(wdt_dev);  	void __iomem *wdt_base; +	u32 reg;  	wdt_base = mtk_wdt->wdt_base; +	/* Enable reset in order to issue a system reset instead of an IRQ */ +	reg = readl(wdt_base + WDT_MODE); +	reg &= ~WDT_MODE_IRQ_EN; +	writel(reg | WDT_MODE_KEY, wdt_base + WDT_MODE); +  	while (1) {  		writel(WDT_SWRST_KEY, wdt_base + WDT_SWRST);  		mdelay(5); @@ -483,6 +494,7 @@ static int mtk_wdt_resume(struct device *dev)  static const struct of_device_id mtk_wdt_dt_ids[] = {  	{ .compatible = "mediatek,mt2712-wdt", .data = &mt2712_data },  	{ .compatible = "mediatek,mt6589-wdt" }, +	{ .compatible = "mediatek,mt6735-wdt", .data = &mt6735_data },  	{ .compatible = "mediatek,mt6795-wdt", .data = &mt6795_data },  	{ .compatible = "mediatek,mt7986-wdt", .data = &mt7986_data },  	{ .compatible = "mediatek,mt7988-wdt", .data = &mt7988_data }, diff --git a/drivers/watchdog/mtx-1_wdt.c b/drivers/watchdog/mtx-1_wdt.c index 11f05024a181..f75426cfa425 100644 --- a/drivers/watchdog/mtx-1_wdt.c +++ b/drivers/watchdog/mtx-1_wdt.c @@ -233,7 +233,7 @@ static void mtx1_wdt_remove(struct platform_device *pdev)  static struct platform_driver mtx1_wdt_driver = {  	.probe = mtx1_wdt_probe, -	.remove_new = mtx1_wdt_remove, +	.remove = mtx1_wdt_remove,  	.driver.name = "mtx1-wdt",  }; diff --git a/drivers/watchdog/nic7018_wdt.c b/drivers/watchdog/nic7018_wdt.c index c3f0a4926667..44982b37ba6f 100644 --- a/drivers/watchdog/nic7018_wdt.c +++ b/drivers/watchdog/nic7018_wdt.c @@ -236,7 +236,7 @@ MODULE_DEVICE_TABLE(acpi, nic7018_device_ids);  static struct platform_driver watchdog_driver = {  	.probe = nic7018_probe, -	.remove_new = nic7018_remove, +	.remove = nic7018_remove,  	.driver = {  		.name = KBUILD_MODNAME,  		.acpi_match_table = ACPI_PTR(nic7018_device_ids), diff --git a/drivers/watchdog/nv_tco.c b/drivers/watchdog/nv_tco.c index f8eb1f65a59e..f16cee5173d5 100644 --- a/drivers/watchdog/nv_tco.c +++ b/drivers/watchdog/nv_tco.c @@ -466,7 +466,7 @@ static void nv_tco_shutdown(struct platform_device *dev)  static struct platform_driver nv_tco_driver = {  	.probe		= nv_tco_init, -	.remove_new	= nv_tco_remove, +	.remove		= nv_tco_remove,  	.shutdown	= nv_tco_shutdown,  	.driver		= {  		.name	= TCO_MODULE_NAME, diff --git a/drivers/watchdog/octeon-wdt-main.c b/drivers/watchdog/octeon-wdt-main.c index 52d49e4e35a0..0615bb816082 100644 --- a/drivers/watchdog/octeon-wdt-main.c +++ b/drivers/watchdog/octeon-wdt-main.c @@ -559,10 +559,8 @@ static int __init octeon_wdt_init(void)  	watchdog_set_nowayout(&octeon_wdt, nowayout);  	ret = watchdog_register_device(&octeon_wdt); -	if (ret) { -		pr_err("watchdog_register_device() failed: %d\n", ret); +	if (ret)  		return ret; -	}  	if (disable) {  		pr_notice("disabled\n"); diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index b6e0236509bb..d523428a8d22 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c @@ -357,7 +357,7 @@ MODULE_DEVICE_TABLE(of, omap_wdt_of_match);  static struct platform_driver omap_wdt_driver = {  	.probe		= omap_wdt_probe, -	.remove_new	= omap_wdt_remove, +	.remove		= omap_wdt_remove,  	.shutdown	= omap_wdt_shutdown,  	.suspend	= pm_ptr(omap_wdt_suspend),  	.resume		= pm_ptr(omap_wdt_resume), diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c index 1fe583e8a95b..0e145f762f6f 100644 --- a/drivers/watchdog/orion_wdt.c +++ b/drivers/watchdog/orion_wdt.c @@ -665,7 +665,7 @@ static void orion_wdt_shutdown(struct platform_device *pdev)  static struct platform_driver orion_wdt_driver = {  	.probe		= orion_wdt_probe, -	.remove_new	= orion_wdt_remove, +	.remove		= orion_wdt_remove,  	.shutdown	= orion_wdt_shutdown,  	.driver		= {  		.name	= "orion_wdt", diff --git a/drivers/watchdog/pcwd.c b/drivers/watchdog/pcwd.c index 1a4282235aac..31d3dcbf815e 100644 --- a/drivers/watchdog/pcwd.c +++ b/drivers/watchdog/pcwd.c @@ -833,7 +833,7 @@ static int pcwd_isa_match(struct device *dev, unsigned int id)  			port0 = inb_p(base_addr);  			port1 = inb_p(base_addr + 1); -			/* Has either hearbeat bit changed?  */ +			/* Has either heartbeat bit changed?  */  			if ((port0 ^ last_port0) & WD_HRTBT ||  			    (port1 ^ last_port1) & WD_REVC_HRBT) {  				retval = 1; diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c index efadbb9d7ce7..0e5c5c96af58 100644 --- a/drivers/watchdog/rc32434_wdt.c +++ b/drivers/watchdog/rc32434_wdt.c @@ -309,7 +309,7 @@ static void rc32434_wdt_shutdown(struct platform_device *pdev)  static struct platform_driver rc32434_wdt_driver = {  	.probe		= rc32434_wdt_probe, -	.remove_new	= rc32434_wdt_remove, +	.remove		= rc32434_wdt_remove,  	.shutdown	= rc32434_wdt_shutdown,  	.driver		= {  			.name = "rc32434_wdt", diff --git a/drivers/watchdog/rdc321x_wdt.c b/drivers/watchdog/rdc321x_wdt.c index 80490316a27f..8955177072fa 100644 --- a/drivers/watchdog/rdc321x_wdt.c +++ b/drivers/watchdog/rdc321x_wdt.c @@ -268,7 +268,7 @@ static void rdc321x_wdt_remove(struct platform_device *pdev)  static struct platform_driver rdc321x_wdt_driver = {  	.probe = rdc321x_wdt_probe, -	.remove_new = rdc321x_wdt_remove, +	.remove = rdc321x_wdt_remove,  	.driver = {  		.name = "rdc321x-wdt",  	}, diff --git a/drivers/watchdog/renesas_wdt.c b/drivers/watchdog/renesas_wdt.c index 12c41d6e5cd6..c0b2a9c5250d 100644 --- a/drivers/watchdog/renesas_wdt.c +++ b/drivers/watchdog/renesas_wdt.c @@ -337,7 +337,7 @@ static struct platform_driver rwdt_driver = {  		.pm = &rwdt_pm_ops,  	},  	.probe = rwdt_probe, -	.remove_new = rwdt_remove, +	.remove = rwdt_remove,  };  module_platform_driver(rwdt_driver); diff --git a/drivers/watchdog/riowd.c b/drivers/watchdog/riowd.c index f47d90d01c19..83806ccf06d1 100644 --- a/drivers/watchdog/riowd.c +++ b/drivers/watchdog/riowd.c @@ -238,7 +238,7 @@ static struct platform_driver riowd_driver = {  		.of_match_table = riowd_match,  	},  	.probe		= riowd_probe, -	.remove_new	= riowd_remove, +	.remove		= riowd_remove,  };  module_platform_driver(riowd_driver); diff --git a/drivers/watchdog/rti_wdt.c b/drivers/watchdog/rti_wdt.c index 4895a69015a8..58c9445c0f88 100644 --- a/drivers/watchdog/rti_wdt.c +++ b/drivers/watchdog/rti_wdt.c @@ -61,7 +61,7 @@  #define MAX_HW_ERROR		250 -static int heartbeat = DEFAULT_HEARTBEAT; +static int heartbeat;  /*   * struct to hold data for each WDT device @@ -252,6 +252,7 @@ static int rti_wdt_probe(struct platform_device *pdev)  	wdd->min_timeout = 1;  	wdd->max_hw_heartbeat_ms = (WDT_PRELOAD_MAX << WDT_PRELOAD_SHIFT) /  		wdt->freq * 1000; +	wdd->timeout = DEFAULT_HEARTBEAT;  	wdd->parent = dev;  	watchdog_set_drvdata(wdd, wdt); @@ -336,10 +337,8 @@ static int rti_wdt_probe(struct platform_device *pdev)  	watchdog_init_timeout(wdd, heartbeat, dev);  	ret = watchdog_register_device(wdd); -	if (ret) { -		dev_err(dev, "cannot register watchdog device\n"); +	if (ret)  		goto err_iomap; -	}  	if (last_ping)  		watchdog_set_last_hw_keepalive(wdd, last_ping); @@ -380,7 +379,7 @@ static struct platform_driver rti_wdt_driver = {  		.of_match_table = rti_wdt_of_match,  	},  	.probe = rti_wdt_probe, -	.remove_new = rti_wdt_remove, +	.remove = rti_wdt_remove,  };  module_platform_driver(rti_wdt_driver); diff --git a/drivers/watchdog/rza_wdt.c b/drivers/watchdog/rza_wdt.c index cb4901b3f777..9334255a37e9 100644 --- a/drivers/watchdog/rza_wdt.c +++ b/drivers/watchdog/rza_wdt.c @@ -169,7 +169,6 @@ static int rza_wdt_probe(struct platform_device *pdev)  	struct device *dev = &pdev->dev;  	struct rza_wdt *priv;  	unsigned long rate; -	int ret;  	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);  	if (!priv) @@ -218,11 +217,7 @@ static int rza_wdt_probe(struct platform_device *pdev)  	watchdog_init_timeout(&priv->wdev, 0, dev);  	watchdog_set_drvdata(&priv->wdev, priv); -	ret = devm_watchdog_register_device(dev, &priv->wdev); -	if (ret) -		dev_err(dev, "Cannot register watchdog device\n"); - -	return ret; +	return devm_watchdog_register_device(dev, &priv->wdev);  }  static const struct of_device_id rza_wdt_of_match[] = { diff --git a/drivers/watchdog/rzg2l_wdt.c b/drivers/watchdog/rzg2l_wdt.c index 2a35f890a288..11bbe48160ec 100644 --- a/drivers/watchdog/rzg2l_wdt.c +++ b/drivers/watchdog/rzg2l_wdt.c @@ -12,6 +12,7 @@  #include <linux/module.h>  #include <linux/of.h>  #include <linux/platform_device.h> +#include <linux/pm_domain.h>  #include <linux/pm_runtime.h>  #include <linux/reset.h>  #include <linux/units.h> @@ -166,8 +167,22 @@ static int rzg2l_wdt_restart(struct watchdog_device *wdev,  	struct rzg2l_wdt_priv *priv = watchdog_get_drvdata(wdev);  	int ret; -	clk_prepare_enable(priv->pclk); -	clk_prepare_enable(priv->osc_clk); +	/* +	 * In case of RZ/G3S the watchdog device may be part of an IRQ safe power +	 * domain that is currently powered off. In this case we need to power +	 * it on before accessing registers. Along with this the clocks will be +	 * enabled. We don't undo the pm_runtime_resume_and_get() as the device +	 * need to be on for the reboot to happen. +	 * +	 * For the rest of SoCs not registering a watchdog IRQ safe power +	 * domain it is safe to call pm_runtime_resume_and_get() as the +	 * irq_safe_dev_in_sleep_domain() call in genpd_runtime_resume() +	 * returns non zero value and the genpd_lock() is avoided, thus, there +	 * will be no invalid wait context reported by lockdep. +	 */ +	ret = pm_runtime_resume_and_get(wdev->parent); +	if (ret) +		return ret;  	if (priv->devtype == WDT_RZG2L) {  		ret = reset_control_deassert(priv->rstc); @@ -275,6 +290,7 @@ static int rzg2l_wdt_probe(struct platform_device *pdev)  	priv->devtype = (uintptr_t)of_device_get_match_data(dev); +	pm_runtime_irq_safe(&pdev->dev);  	pm_runtime_enable(&pdev->dev);  	priv->wdev.info = &rzg2l_wdt_ident; diff --git a/drivers/watchdog/rzn1_wdt.c b/drivers/watchdog/rzn1_wdt.c index 7d3192d34afd..96fd04fbc2a2 100644 --- a/drivers/watchdog/rzn1_wdt.c +++ b/drivers/watchdog/rzn1_wdt.c @@ -52,7 +52,7 @@ static int rzn1_wdt_ping(struct watchdog_device *w)  {  	struct rzn1_watchdog *wdt = watchdog_get_drvdata(w); -	/* Any value retrigggers the watchdog */ +	/* Any value retriggers the watchdog */  	writel(0, wdt->base + RZN1_WDT_RETRIGGER);  	return 0; diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 686cf544d0ae..30450e99e5e9 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c @@ -24,9 +24,9 @@  #include <linux/slab.h>  #include <linux/err.h>  #include <linux/of.h> +#include <linux/mfd/syscon.h>  #include <linux/regmap.h>  #include <linux/delay.h> -#include <linux/soc/samsung/exynos-pmu.h>  #define S3C2410_WTCON		0x00  #define S3C2410_WTDAT		0x04 @@ -63,6 +63,10 @@  #define EXYNOS850_CLUSTER1_NONCPU_INT_EN	0x1644  #define EXYNOSAUTOV9_CLUSTER1_NONCPU_OUT	0x1520  #define EXYNOSAUTOV9_CLUSTER1_NONCPU_INT_EN	0x1544 +#define EXYNOSAUTOV920_CLUSTER0_NONCPU_OUT	0x1420 +#define EXYNOSAUTOV920_CLUSTER0_NONCPU_INT_EN	0x1444 +#define EXYNOSAUTOV920_CLUSTER1_NONCPU_OUT	0x1720 +#define EXYNOSAUTOV920_CLUSTER1_NONCPU_INT_EN	0x1744  #define EXYNOS850_CLUSTER0_WDTRESET_BIT		24  #define EXYNOS850_CLUSTER1_WDTRESET_BIT		23 @@ -303,6 +307,32 @@ static const struct s3c2410_wdt_variant drv_data_gs101_cl1 = {  		  QUIRK_HAS_DBGACK_BIT,  }; +static const struct s3c2410_wdt_variant drv_data_exynosautov920_cl0 = { +	.mask_reset_reg = EXYNOSAUTOV920_CLUSTER0_NONCPU_INT_EN, +	.mask_bit = 2, +	.mask_reset_inv = true, +	.rst_stat_reg = EXYNOS5_RST_STAT_REG_OFFSET, +	.rst_stat_bit = EXYNOSAUTOV9_CLUSTER0_WDTRESET_BIT, +	.cnt_en_reg = EXYNOSAUTOV920_CLUSTER0_NONCPU_OUT, +	.cnt_en_bit = 7, +	.quirks = QUIRK_HAS_WTCLRINT_REG | QUIRK_HAS_PMU_MASK_RESET | +		  QUIRK_HAS_PMU_RST_STAT | QUIRK_HAS_PMU_CNT_EN | +		  QUIRK_HAS_DBGACK_BIT, +}; + +static const struct s3c2410_wdt_variant drv_data_exynosautov920_cl1 = { +	.mask_reset_reg = EXYNOSAUTOV920_CLUSTER1_NONCPU_INT_EN, +	.mask_bit = 2, +	.mask_reset_inv = true, +	.rst_stat_reg = EXYNOS5_RST_STAT_REG_OFFSET, +	.rst_stat_bit = EXYNOSAUTOV9_CLUSTER1_WDTRESET_BIT, +	.cnt_en_reg = EXYNOSAUTOV920_CLUSTER1_NONCPU_OUT, +	.cnt_en_bit = 7, +	.quirks = QUIRK_HAS_WTCLRINT_REG | QUIRK_HAS_PMU_MASK_RESET | +		  QUIRK_HAS_PMU_RST_STAT | QUIRK_HAS_PMU_CNT_EN | +		  QUIRK_HAS_DBGACK_BIT, +}; +  static const struct of_device_id s3c2410_wdt_match[] = {  	{ .compatible = "google,gs101-wdt",  	  .data = &drv_data_gs101_cl0 }, @@ -320,6 +350,8 @@ static const struct of_device_id s3c2410_wdt_match[] = {  	  .data = &drv_data_exynos850_cl0 },  	{ .compatible = "samsung,exynosautov9-wdt",  	  .data = &drv_data_exynosautov9_cl0 }, +	{ .compatible = "samsung,exynosautov920-wdt", +	  .data = &drv_data_exynosautov920_cl0 },  	{},  };  MODULE_DEVICE_TABLE(of, s3c2410_wdt_match); @@ -643,7 +675,8 @@ s3c2410_get_wdt_drv_data(struct platform_device *pdev, struct s3c2410_wdt *wdt)  	/* Choose Exynos850/ExynosAutov9 driver data w.r.t. cluster index */  	if (variant == &drv_data_exynos850_cl0 ||  	    variant == &drv_data_exynosautov9_cl0 || -	    variant == &drv_data_gs101_cl0) { +	    variant == &drv_data_gs101_cl0 || +	    variant == &drv_data_exynosautov920_cl0) {  		u32 index;  		int err; @@ -662,6 +695,8 @@ s3c2410_get_wdt_drv_data(struct platform_device *pdev, struct s3c2410_wdt *wdt)  				variant = &drv_data_exynosautov9_cl1;  			else if (variant == &drv_data_gs101_cl0)  				variant = &drv_data_gs101_cl1; +			else if (variant == &drv_data_exynosautov920_cl0) +				variant = &drv_data_exynosautov920_cl1;  			break;  		default:  			return dev_err_probe(dev, -EINVAL, "wrong cluster index: %u\n", index); @@ -699,11 +734,11 @@ static int s3c2410wdt_probe(struct platform_device *pdev)  		return ret;  	if (wdt->drv_data->quirks & QUIRKS_HAVE_PMUREG) { -		wdt->pmureg = exynos_get_pmu_regmap_by_phandle(dev->of_node, -						 "samsung,syscon-phandle"); +		wdt->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node, +						"samsung,syscon-phandle");  		if (IS_ERR(wdt->pmureg))  			return dev_err_probe(dev, PTR_ERR(wdt->pmureg), -					     "PMU regmap lookup failed.\n"); +					     "syscon regmap lookup failed.\n");  	}  	wdt_irq = platform_get_irq(pdev, 0); diff --git a/drivers/watchdog/sa1100_wdt.c b/drivers/watchdog/sa1100_wdt.c index 6e91ee3fbfb5..729a8508b31d 100644 --- a/drivers/watchdog/sa1100_wdt.c +++ b/drivers/watchdog/sa1100_wdt.c @@ -236,8 +236,8 @@ static void sa1100dog_remove(struct platform_device *pdev)  static struct platform_driver sa1100dog_driver = {  	.driver.name = "sa1100_wdt", -	.probe	  = sa1100dog_probe, -	.remove_new	  = sa1100dog_remove, +	.probe = sa1100dog_probe, +	.remove = sa1100dog_remove,  };  module_platform_driver(sa1100dog_driver); diff --git a/drivers/watchdog/sch311x_wdt.c b/drivers/watchdog/sch311x_wdt.c index 76053158d259..9670a1ea57cb 100644 --- a/drivers/watchdog/sch311x_wdt.c +++ b/drivers/watchdog/sch311x_wdt.c @@ -445,7 +445,7 @@ static void sch311x_wdt_shutdown(struct platform_device *dev)  static struct platform_driver sch311x_wdt_driver = {  	.probe		= sch311x_wdt_probe, -	.remove_new	= sch311x_wdt_remove, +	.remove		= sch311x_wdt_remove,  	.shutdown	= sch311x_wdt_shutdown,  	.driver		= {  		.name = DRV_NAME, diff --git a/drivers/watchdog/shwdt.c b/drivers/watchdog/shwdt.c index 10f1fba78ec2..7f0150c39421 100644 --- a/drivers/watchdog/shwdt.c +++ b/drivers/watchdog/shwdt.c @@ -297,7 +297,7 @@ static struct platform_driver sh_wdt_driver = {  	},  	.probe		= sh_wdt_probe, -	.remove_new	= sh_wdt_remove, +	.remove		= sh_wdt_remove,  	.shutdown	= sh_wdt_shutdown,  }; diff --git a/drivers/watchdog/sl28cpld_wdt.c b/drivers/watchdog/sl28cpld_wdt.c index 9ce456f09f73..8630c29818f2 100644 --- a/drivers/watchdog/sl28cpld_wdt.c +++ b/drivers/watchdog/sl28cpld_wdt.c @@ -198,10 +198,8 @@ static int sl28cpld_wdt_probe(struct platform_device *pdev)  	}  	ret = devm_watchdog_register_device(&pdev->dev, wdd); -	if (ret < 0) { -		dev_err(&pdev->dev, "failed to register watchdog device\n"); +	if (ret < 0)  		return ret; -	}  	dev_info(&pdev->dev, "initial timeout %d sec%s\n",  		 wdd->timeout, nowayout ? ", nowayout" : ""); diff --git a/drivers/watchdog/smsc37b787_wdt.c b/drivers/watchdog/smsc37b787_wdt.c index 97ca500ec8a8..3011e1af00f9 100644 --- a/drivers/watchdog/smsc37b787_wdt.c +++ b/drivers/watchdog/smsc37b787_wdt.c @@ -485,7 +485,7 @@ static long wb_smsc_wdt_ioctl(struct file *file,  	}  } -/* -- Notifier funtions -----------------------------------------*/ +/* -- Notifier functions -----------------------------------------*/  static int wb_smsc_wdt_notify_sys(struct notifier_block *this,  					unsigned long code, void *unused) diff --git a/drivers/watchdog/st_lpc_wdt.c b/drivers/watchdog/st_lpc_wdt.c index 4c5b8d98a4f3..d206452072ae 100644 --- a/drivers/watchdog/st_lpc_wdt.c +++ b/drivers/watchdog/st_lpc_wdt.c @@ -286,7 +286,7 @@ static struct platform_driver st_wdog_driver = {  		.of_match_table = st_wdog_match,  	},  	.probe = st_wdog_probe, -	.remove_new = st_wdog_remove, +	.remove = st_wdog_remove,  };  module_platform_driver(st_wdog_driver); diff --git a/drivers/watchdog/starfive-wdt.c b/drivers/watchdog/starfive-wdt.c index 19a2620d3d38..355918d62f63 100644 --- a/drivers/watchdog/starfive-wdt.c +++ b/drivers/watchdog/starfive-wdt.c @@ -80,7 +80,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="  		 __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");  struct starfive_wdt_variant { -	unsigned int control;		/* Watchdog Control Resgister for reset enable */ +	unsigned int control;		/* Watchdog Control Register for reset enable */  	unsigned int load;		/* Watchdog Load register */  	unsigned int reload;		/* Watchdog Reload Control register */  	unsigned int enable;		/* Watchdog Enable Register */ @@ -597,7 +597,7 @@ MODULE_DEVICE_TABLE(of, starfive_wdt_match);  static struct platform_driver starfive_wdt_driver = {  	.probe = starfive_wdt_probe, -	.remove_new = starfive_wdt_remove, +	.remove = starfive_wdt_remove,  	.shutdown = starfive_wdt_shutdown,  	.driver = {  		.name = "starfive-wdt", diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c index 5404e0387620..8ad06b54c5ad 100644 --- a/drivers/watchdog/stm32_iwdg.c +++ b/drivers/watchdog/stm32_iwdg.c @@ -18,6 +18,7 @@  #include <linux/module.h>  #include <linux/of.h>  #include <linux/platform_device.h> +#include <linux/pm_wakeirq.h>  #include <linux/watchdog.h>  #define DEFAULT_TIMEOUT 10 @@ -28,6 +29,7 @@  #define IWDG_RLR	0x08 /* ReLoad Register */  #define IWDG_SR		0x0C /* Status Register */  #define IWDG_WINR	0x10 /* Windows Register */ +#define IWDG_EWCR	0x14 /* Early Wake-up Register */  /* IWDG_KR register bit mask */  #define KR_KEY_RELOAD	0xAAAA /* reload counter enable */ @@ -47,22 +49,29 @@  #define SR_PVU	BIT(0) /* Watchdog prescaler value update */  #define SR_RVU	BIT(1) /* Watchdog counter reload value update */ +#define EWCR_EWIT	GENMASK(11, 0) /* Watchdog counter window value */ +#define EWCR_EWIC	BIT(14) /* Watchdog early interrupt acknowledge */ +#define EWCR_EWIE	BIT(15) /* Watchdog early interrupt enable */ +  /* set timeout to 100000 us */  #define TIMEOUT_US	100000  #define SLEEP_US	1000  struct stm32_iwdg_data {  	bool has_pclk; +	bool has_early_wakeup;  	u32 max_prescaler;  };  static const struct stm32_iwdg_data stm32_iwdg_data = {  	.has_pclk = false, +	.has_early_wakeup = false,  	.max_prescaler = 256,  };  static const struct stm32_iwdg_data stm32mp1_iwdg_data = {  	.has_pclk = true, +	.has_early_wakeup = true,  	.max_prescaler = 1024,  }; @@ -88,13 +97,18 @@ static inline void reg_write(void __iomem *base, u32 reg, u32 val)  static int stm32_iwdg_start(struct watchdog_device *wdd)  {  	struct stm32_iwdg *wdt = watchdog_get_drvdata(wdd); -	u32 tout, presc, iwdg_rlr, iwdg_pr, iwdg_sr; +	u32 tout, ptot, presc, iwdg_rlr, iwdg_ewcr, iwdg_pr, iwdg_sr;  	int ret;  	dev_dbg(wdd->parent, "%s\n", __func__); +	if (!wdd->pretimeout) +		wdd->pretimeout = 3 * wdd->timeout / 4; +  	tout = clamp_t(unsigned int, wdd->timeout,  		       wdd->min_timeout, wdd->max_hw_heartbeat_ms / 1000); +	ptot = clamp_t(unsigned int, tout - wdd->pretimeout, +		       wdd->min_timeout, tout);  	presc = DIV_ROUND_UP(tout * wdt->rate, RLR_MAX + 1); @@ -102,6 +116,7 @@ static int stm32_iwdg_start(struct watchdog_device *wdd)  	presc = roundup_pow_of_two(presc);  	iwdg_pr = presc <= 1 << PR_SHIFT ? 0 : ilog2(presc) - PR_SHIFT;  	iwdg_rlr = ((tout * wdt->rate) / presc) - 1; +	iwdg_ewcr = ((ptot * wdt->rate) / presc) - 1;  	/* enable write access */  	reg_write(wdt->regs, IWDG_KR, KR_KEY_EWA); @@ -109,6 +124,8 @@ static int stm32_iwdg_start(struct watchdog_device *wdd)  	/* set prescaler & reload registers */  	reg_write(wdt->regs, IWDG_PR, iwdg_pr);  	reg_write(wdt->regs, IWDG_RLR, iwdg_rlr); +	if (wdt->data->has_early_wakeup) +		reg_write(wdt->regs, IWDG_EWCR, iwdg_ewcr | EWCR_EWIE);  	reg_write(wdt->regs, IWDG_KR, KR_KEY_ENABLE);  	/* wait for the registers to be updated (max 100ms) */ @@ -151,6 +168,34 @@ static int stm32_iwdg_set_timeout(struct watchdog_device *wdd,  	return 0;  } +static int stm32_iwdg_set_pretimeout(struct watchdog_device *wdd, +				     unsigned int pretimeout) +{ +	dev_dbg(wdd->parent, "%s pretimeout: %d sec\n", __func__, pretimeout); + +	wdd->pretimeout = pretimeout; + +	if (watchdog_active(wdd)) +		return stm32_iwdg_start(wdd); + +	return 0; +} + +static irqreturn_t stm32_iwdg_isr(int irq, void *wdog_arg) +{ +	struct watchdog_device *wdd = wdog_arg; +	struct stm32_iwdg *wdt = watchdog_get_drvdata(wdd); +	u32 reg; + +	reg = reg_read(wdt->regs, IWDG_EWCR); +	reg |= EWCR_EWIC; +	reg_write(wdt->regs, IWDG_EWCR, reg); + +	watchdog_notify_pretimeout(wdd); + +	return IRQ_HANDLED; +} +  static void stm32_clk_disable_unprepare(void *data)  {  	clk_disable_unprepare(data); @@ -207,11 +252,20 @@ static const struct watchdog_info stm32_iwdg_info = {  	.identity	= "STM32 Independent Watchdog",  }; +static const struct watchdog_info stm32_iwdg_preinfo = { +	.options	= WDIOF_SETTIMEOUT | +			  WDIOF_MAGICCLOSE | +			  WDIOF_KEEPALIVEPING | +			  WDIOF_PRETIMEOUT, +	.identity	= "STM32 Independent Watchdog", +}; +  static const struct watchdog_ops stm32_iwdg_ops = {  	.owner		= THIS_MODULE,  	.start		= stm32_iwdg_start,  	.ping		= stm32_iwdg_ping,  	.set_timeout	= stm32_iwdg_set_timeout, +	.set_pretimeout	= stm32_iwdg_set_pretimeout,  };  static const struct of_device_id stm32_iwdg_of_match[] = { @@ -221,6 +275,40 @@ static const struct of_device_id stm32_iwdg_of_match[] = {  };  MODULE_DEVICE_TABLE(of, stm32_iwdg_of_match); +static int stm32_iwdg_irq_init(struct platform_device *pdev, +			       struct stm32_iwdg *wdt) +{ +	struct device_node *np = pdev->dev.of_node; +	struct watchdog_device *wdd = &wdt->wdd; +	struct device *dev = &pdev->dev; +	int irq, ret; + +	if (!wdt->data->has_early_wakeup) +		return 0; + +	irq = platform_get_irq_optional(pdev, 0); +	if (irq <= 0) +		return 0; + +	if (of_property_read_bool(np, "wakeup-source")) { +		ret = device_init_wakeup(dev, true); +		if (ret) +			return ret; + +		ret = dev_pm_set_wake_irq(dev, irq); +		if (ret) +			return ret; +	} + +	ret = devm_request_irq(dev, irq, stm32_iwdg_isr, 0, +			       dev_name(dev), wdd); +	if (ret) +		return ret; + +	wdd->info = &stm32_iwdg_preinfo; +	return 0; +} +  static int stm32_iwdg_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; @@ -255,6 +343,11 @@ static int stm32_iwdg_probe(struct platform_device *pdev)  	wdd->max_hw_heartbeat_ms = ((RLR_MAX + 1) * wdt->data->max_prescaler *  				    1000) / wdt->rate; +	/* Initialize IRQ, this might override wdd->info, hence it is here. */ +	ret = stm32_iwdg_irq_init(pdev, wdt); +	if (ret) +		return ret; +  	watchdog_set_drvdata(wdd, wdt);  	watchdog_set_nowayout(wdd, WATCHDOG_NOWAYOUT);  	watchdog_init_timeout(wdd, 0, dev); diff --git a/drivers/watchdog/stmp3xxx_rtc_wdt.c b/drivers/watchdog/stmp3xxx_rtc_wdt.c index 4b2caa9807ac..060447101f48 100644 --- a/drivers/watchdog/stmp3xxx_rtc_wdt.c +++ b/drivers/watchdog/stmp3xxx_rtc_wdt.c @@ -143,7 +143,7 @@ static struct platform_driver stmp3xxx_wdt_driver = {  		.pm = &stmp3xxx_wdt_pm_ops,  	},  	.probe = stmp3xxx_wdt_probe, -	.remove_new = stmp3xxx_wdt_remove, +	.remove = stmp3xxx_wdt_remove,  };  module_platform_driver(stmp3xxx_wdt_driver); diff --git a/drivers/watchdog/txx9wdt.c b/drivers/watchdog/txx9wdt.c index 8d5f67acbff2..305349844b4f 100644 --- a/drivers/watchdog/txx9wdt.c +++ b/drivers/watchdog/txx9wdt.c @@ -159,7 +159,7 @@ static void txx9wdt_shutdown(struct platform_device *dev)  static struct platform_driver txx9wdt_driver = {  	.probe = txx9wdt_probe, -	.remove_new = txx9wdt_remove, +	.remove = txx9wdt_remove,  	.shutdown = txx9wdt_shutdown,  	.driver = {  		.name = "txx9wdt", diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index aff2c3912ead..d46d8c8c01f2 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c @@ -237,7 +237,7 @@ void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority)  }  EXPORT_SYMBOL_GPL(watchdog_set_restart_priority); -static int __watchdog_register_device(struct watchdog_device *wdd) +static int ___watchdog_register_device(struct watchdog_device *wdd)  {  	int ret, id = -1; @@ -337,6 +337,22 @@ static int __watchdog_register_device(struct watchdog_device *wdd)  	return 0;  } +static int __watchdog_register_device(struct watchdog_device *wdd) +{ +	const char *dev_str; +	int ret; + +	ret = ___watchdog_register_device(wdd); +	if (ret) { +		dev_str = wdd->parent ? dev_name(wdd->parent) : +			  (const char *)wdd->info->identity; +		pr_err("%s: failed to register watchdog device (err = %d)\n", +			dev_str, ret); +	} + +	return ret; +} +  /**   * watchdog_register_device() - register a watchdog device   * @wdd: watchdog device @@ -350,7 +366,6 @@ static int __watchdog_register_device(struct watchdog_device *wdd)  int watchdog_register_device(struct watchdog_device *wdd)  { -	const char *dev_str;  	int ret = 0;  	mutex_lock(&wtd_deferred_reg_mutex); @@ -360,13 +375,6 @@ int watchdog_register_device(struct watchdog_device *wdd)  		watchdog_deferred_registration_add(wdd);  	mutex_unlock(&wtd_deferred_reg_mutex); -	if (ret) { -		dev_str = wdd->parent ? dev_name(wdd->parent) : -			  (const char *)wdd->info->identity; -		pr_err("%s: failed to register watchdog device (err = %d)\n", -			dev_str, ret); -	} -  	return ret;  }  EXPORT_SYMBOL_GPL(watchdog_register_device); diff --git a/drivers/watchdog/xilinx_wwdt.c b/drivers/watchdog/xilinx_wwdt.c index d271e2e8d6e2..3d2a156f7180 100644 --- a/drivers/watchdog/xilinx_wwdt.c +++ b/drivers/watchdog/xilinx_wwdt.c @@ -2,7 +2,7 @@  /*   * Window watchdog device driver for Xilinx Versal WWDT   * - * Copyright (C) 2022 - 2023, Advanced Micro Devices, Inc. + * Copyright (C) 2022 - 2024, Advanced Micro Devices, Inc.   */  #include <linux/clk.h> @@ -36,6 +36,12 @@  #define XWWDT_CLOSE_WINDOW_PERCENT	50 +/* Maximum count value of each 32 bit window */ +#define XWWDT_MAX_COUNT_WINDOW		GENMASK(31, 0) + +/* Maximum count value of closed and open window combined */ +#define XWWDT_MAX_COUNT_WINDOW_COMBINED	GENMASK_ULL(32, 1) +  static int wwdt_timeout;  static int closed_window_percent; @@ -54,6 +60,8 @@ MODULE_PARM_DESC(closed_window_percent,   * @xilinx_wwdt_wdd: watchdog device structure   * @freq: source clock frequency of WWDT   * @close_percent: Closed window percent + * @closed_timeout: Closed window timeout in ticks + * @open_timeout: Open window timeout in ticks   */  struct xwwdt_device {  	void __iomem *base; @@ -61,27 +69,22 @@ struct xwwdt_device {  	struct watchdog_device xilinx_wwdt_wdd;  	unsigned long freq;  	u32 close_percent; +	u64 closed_timeout; +	u64 open_timeout;  };  static int xilinx_wwdt_start(struct watchdog_device *wdd)  {  	struct xwwdt_device *xdev = watchdog_get_drvdata(wdd);  	struct watchdog_device *xilinx_wwdt_wdd = &xdev->xilinx_wwdt_wdd; -	u64 time_out, closed_timeout, open_timeout;  	u32 control_status_reg; -	/* Calculate timeout count */ -	time_out = xdev->freq * wdd->timeout; -	closed_timeout = div_u64(time_out * xdev->close_percent, 100); -	open_timeout = time_out - closed_timeout; -	wdd->min_hw_heartbeat_ms = xdev->close_percent * 10 * wdd->timeout; -  	spin_lock(&xdev->spinlock);  	iowrite32(XWWDT_MWR_MASK, xdev->base + XWWDT_MWR_OFFSET);  	iowrite32(~(u32)XWWDT_ESR_WEN_MASK, xdev->base + XWWDT_ESR_OFFSET); -	iowrite32((u32)closed_timeout, xdev->base + XWWDT_FWR_OFFSET); -	iowrite32((u32)open_timeout, xdev->base + XWWDT_SWR_OFFSET); +	iowrite32((u32)xdev->closed_timeout, xdev->base + XWWDT_FWR_OFFSET); +	iowrite32((u32)xdev->open_timeout, xdev->base + XWWDT_SWR_OFFSET);  	/* Enable the window watchdog timer */  	control_status_reg = ioread32(xdev->base + XWWDT_ESR_OFFSET); @@ -133,7 +136,12 @@ static int xwwdt_probe(struct platform_device *pdev)  	struct watchdog_device *xilinx_wwdt_wdd;  	struct device *dev = &pdev->dev;  	struct xwwdt_device *xdev; +	u64 max_per_window_ms; +	u64 min_per_window_ms; +	u64 timeout_count;  	struct clk *clk; +	u32 timeout_ms; +	u64 ms_count;  	int ret;  	xdev = devm_kzalloc(dev, sizeof(*xdev), GFP_KERNEL); @@ -154,12 +162,13 @@ static int xwwdt_probe(struct platform_device *pdev)  		return PTR_ERR(clk);  	xdev->freq = clk_get_rate(clk); -	if (!xdev->freq) +	if (xdev->freq < 1000000)  		return -EINVAL;  	xilinx_wwdt_wdd->min_timeout = XWWDT_MIN_TIMEOUT;  	xilinx_wwdt_wdd->timeout = XWWDT_DEFAULT_TIMEOUT; -	xilinx_wwdt_wdd->max_hw_heartbeat_ms = 1000 * xilinx_wwdt_wdd->timeout; +	xilinx_wwdt_wdd->max_hw_heartbeat_ms = +		div64_u64(XWWDT_MAX_COUNT_WINDOW_COMBINED, xdev->freq) * 1000;  	if (closed_window_percent == 0 || closed_window_percent >= 100)  		xdev->close_percent = XWWDT_CLOSE_WINDOW_PERCENT; @@ -167,6 +176,48 @@ static int xwwdt_probe(struct platform_device *pdev)  		xdev->close_percent = closed_window_percent;  	watchdog_init_timeout(xilinx_wwdt_wdd, wwdt_timeout, &pdev->dev); + +	/* Calculate ticks for 1 milli-second */ +	ms_count = div_u64(xdev->freq, 1000); +	timeout_ms = xilinx_wwdt_wdd->timeout * 1000; +	timeout_count = timeout_ms * ms_count; + +	if (timeout_ms > xilinx_wwdt_wdd->max_hw_heartbeat_ms) { +		/* +		 * To avoid ping restrictions until the minimum hardware heartbeat, +		 * we will solely rely on the open window and +		 * adjust the minimum hardware heartbeat to 0. +		 */ +		xdev->closed_timeout = 0; +		xdev->open_timeout = XWWDT_MAX_COUNT_WINDOW; +		xilinx_wwdt_wdd->min_hw_heartbeat_ms = 0; +		xilinx_wwdt_wdd->max_hw_heartbeat_ms = xilinx_wwdt_wdd->max_hw_heartbeat_ms / 2; +	} else { +		xdev->closed_timeout  = div64_u64(timeout_count * xdev->close_percent, 100); +		xilinx_wwdt_wdd->min_hw_heartbeat_ms = +			div64_u64(timeout_ms * xdev->close_percent, 100); + +		if (timeout_ms > xilinx_wwdt_wdd->max_hw_heartbeat_ms / 2) { +			max_per_window_ms = xilinx_wwdt_wdd->max_hw_heartbeat_ms / 2; +			min_per_window_ms = timeout_ms - max_per_window_ms; + +			if (xilinx_wwdt_wdd->min_hw_heartbeat_ms > max_per_window_ms) { +				dev_info(xilinx_wwdt_wdd->parent, +					 "Closed window cannot be set to %d%%. Using maximum supported value.\n", +					xdev->close_percent); +				xdev->closed_timeout = max_per_window_ms * ms_count; +				xilinx_wwdt_wdd->min_hw_heartbeat_ms = max_per_window_ms; +			} else if (xilinx_wwdt_wdd->min_hw_heartbeat_ms < min_per_window_ms) { +				dev_info(xilinx_wwdt_wdd->parent, +					 "Closed window cannot be set to %d%%. Using minimum supported value.\n", +					xdev->close_percent); +				xdev->closed_timeout = min_per_window_ms * ms_count; +				xilinx_wwdt_wdd->min_hw_heartbeat_ms = min_per_window_ms; +			} +		} +		xdev->open_timeout = timeout_count - xdev->closed_timeout; +	} +  	spin_lock_init(&xdev->spinlock);  	watchdog_set_drvdata(xilinx_wwdt_wdd, xdev);  	watchdog_set_nowayout(xilinx_wwdt_wdd, 1); diff --git a/drivers/watchdog/ziirave_wdt.c b/drivers/watchdog/ziirave_wdt.c index 775838346bb5..fcc1ba02e75b 100644 --- a/drivers/watchdog/ziirave_wdt.c +++ b/drivers/watchdog/ziirave_wdt.c @@ -715,7 +715,7 @@ static void ziirave_wdt_remove(struct i2c_client *client)  }  static const struct i2c_device_id ziirave_wdt_id[] = { -	{ "rave-wdt", 0 }, +	{ "rave-wdt" },  	{ }  };  MODULE_DEVICE_TABLE(i2c, ziirave_wdt_id); diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c index 42adc2c1e06b..5453d86324f6 100644 --- a/drivers/xen/gntdev-dmabuf.c +++ b/drivers/xen/gntdev-dmabuf.c @@ -23,7 +23,7 @@  #include "gntdev-common.h"  #include "gntdev-dmabuf.h" -MODULE_IMPORT_NS(DMA_BUF); +MODULE_IMPORT_NS("DMA_BUF");  struct gntdev_dmabuf {  	struct gntdev_dmabuf_priv *priv; diff --git a/drivers/xen/grant-dma-iommu.c b/drivers/xen/grant-dma-iommu.c index 2ee750a03c2f..0965e2dd4edf 100644 --- a/drivers/xen/grant-dma-iommu.c +++ b/drivers/xen/grant-dma-iommu.c @@ -65,7 +65,7 @@ static struct platform_driver grant_dma_iommu_driver = {  		.of_match_table = grant_dma_iommu_of_match,  	},  	.probe = grant_dma_iommu_probe, -	.remove_new = grant_dma_iommu_remove, +	.remove = grant_dma_iommu_remove,  };  static int __init grant_dma_iommu_init(void)  | 
