| .. | .. | 
|---|
 | 1 | +// SPDX-License-Identifier: GPL-2.0  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 | 3 |   * Driver for the Intel P-Unit Mailbox IPC mechanism | 
|---|
| 3 | 4 |   * | 
|---|
| 4 | 5 |   * (C) Copyright 2015 Intel Corporation | 
|---|
| 5 | 6 |   * | 
|---|
| 6 |  | - * This program is free software; you can redistribute it and/or modify  | 
|---|
| 7 |  | - * it under the terms of the GNU General Public License version 2 as  | 
|---|
| 8 |  | - * published by the Free Software Foundation.  | 
|---|
| 9 |  | - *  | 
|---|
| 10 | 7 |   * The heart of the P-Unit is the Foxton microcontroller and its firmware, | 
|---|
| 11 | 8 |   * which provide mailbox interface for power management usage. | 
|---|
| 12 | 9 |   */ | 
|---|
| 13 | 10 |   | 
|---|
| 14 |  | -#include <linux/module.h>  | 
|---|
| 15 |  | -#include <linux/mod_devicetable.h>  | 
|---|
| 16 |  | -#include <linux/acpi.h>  | 
|---|
| 17 |  | -#include <linux/delay.h>  | 
|---|
| 18 | 11 |  #include <linux/bitops.h> | 
|---|
 | 12 | +#include <linux/delay.h>  | 
|---|
| 19 | 13 |  #include <linux/device.h> | 
|---|
| 20 | 14 |  #include <linux/interrupt.h> | 
|---|
| 21 | 15 |  #include <linux/io.h> | 
|---|
 | 16 | +#include <linux/mod_devicetable.h>  | 
|---|
 | 17 | +#include <linux/module.h>  | 
|---|
| 22 | 18 |  #include <linux/platform_device.h> | 
|---|
 | 19 | +  | 
|---|
| 23 | 20 |  #include <asm/intel_punit_ipc.h> | 
|---|
| 24 | 21 |   | 
|---|
| 25 | 22 |  /* IPC Mailbox registers */ | 
|---|
| .. | .. | 
|---|
| 226 | 223 |   | 
|---|
| 227 | 224 |  static int intel_punit_get_bars(struct platform_device *pdev) | 
|---|
| 228 | 225 |  { | 
|---|
| 229 |  | -	struct resource *res;  | 
|---|
| 230 | 226 |  	void __iomem *addr; | 
|---|
| 231 | 227 |   | 
|---|
| 232 | 228 |  	/* | 
|---|
| .. | .. | 
|---|
| 234 | 230 |  	 * - BIOS_IPC BASE_DATA | 
|---|
| 235 | 231 |  	 * - BIOS_IPC BASE_IFACE | 
|---|
| 236 | 232 |  	 */ | 
|---|
| 237 |  | -	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  | 
|---|
| 238 |  | -	addr = devm_ioremap_resource(&pdev->dev, res);  | 
|---|
 | 233 | +	addr = devm_platform_ioremap_resource(pdev, 0);  | 
|---|
| 239 | 234 |  	if (IS_ERR(addr)) | 
|---|
| 240 | 235 |  		return PTR_ERR(addr); | 
|---|
| 241 | 236 |  	punit_ipcdev->base[BIOS_IPC][BASE_DATA] = addr; | 
|---|
| 242 | 237 |   | 
|---|
| 243 |  | -	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);  | 
|---|
| 244 |  | -	addr = devm_ioremap_resource(&pdev->dev, res);  | 
|---|
 | 238 | +	addr = devm_platform_ioremap_resource(pdev, 1);  | 
|---|
| 245 | 239 |  	if (IS_ERR(addr)) | 
|---|
| 246 | 240 |  		return PTR_ERR(addr); | 
|---|
| 247 | 241 |  	punit_ipcdev->base[BIOS_IPC][BASE_IFACE] = addr; | 
|---|
| .. | .. | 
|---|
| 253 | 247 |  	 * - GTDRIVER_IPC BASE_DATA | 
|---|
| 254 | 248 |  	 * - GTDRIVER_IPC BASE_IFACE | 
|---|
| 255 | 249 |  	 */ | 
|---|
| 256 |  | -	res = platform_get_resource(pdev, IORESOURCE_MEM, 2);  | 
|---|
| 257 |  | -	if (res && resource_size(res) > 1) {  | 
|---|
| 258 |  | -		addr = devm_ioremap_resource(&pdev->dev, res);  | 
|---|
| 259 |  | -		if (!IS_ERR(addr))  | 
|---|
| 260 |  | -			punit_ipcdev->base[ISPDRIVER_IPC][BASE_DATA] = addr;  | 
|---|
| 261 |  | -	}  | 
|---|
 | 250 | +	addr = devm_platform_ioremap_resource(pdev, 2);  | 
|---|
 | 251 | +	if (!IS_ERR(addr))  | 
|---|
 | 252 | +		punit_ipcdev->base[ISPDRIVER_IPC][BASE_DATA] = addr;  | 
|---|
| 262 | 253 |   | 
|---|
| 263 |  | -	res = platform_get_resource(pdev, IORESOURCE_MEM, 3);  | 
|---|
| 264 |  | -	if (res && resource_size(res) > 1) {  | 
|---|
| 265 |  | -		addr = devm_ioremap_resource(&pdev->dev, res);  | 
|---|
| 266 |  | -		if (!IS_ERR(addr))  | 
|---|
| 267 |  | -			punit_ipcdev->base[ISPDRIVER_IPC][BASE_IFACE] = addr;  | 
|---|
| 268 |  | -	}  | 
|---|
 | 254 | +	addr = devm_platform_ioremap_resource(pdev, 3);  | 
|---|
 | 255 | +	if (!IS_ERR(addr))  | 
|---|
 | 256 | +		punit_ipcdev->base[ISPDRIVER_IPC][BASE_IFACE] = addr;  | 
|---|
| 269 | 257 |   | 
|---|
| 270 |  | -	res = platform_get_resource(pdev, IORESOURCE_MEM, 4);  | 
|---|
| 271 |  | -	if (res && resource_size(res) > 1) {  | 
|---|
| 272 |  | -		addr = devm_ioremap_resource(&pdev->dev, res);  | 
|---|
| 273 |  | -		if (!IS_ERR(addr))  | 
|---|
| 274 |  | -			punit_ipcdev->base[GTDRIVER_IPC][BASE_DATA] = addr;  | 
|---|
| 275 |  | -	}  | 
|---|
 | 258 | +	addr = devm_platform_ioremap_resource(pdev, 4);  | 
|---|
 | 259 | +	if (!IS_ERR(addr))  | 
|---|
 | 260 | +		punit_ipcdev->base[GTDRIVER_IPC][BASE_DATA] = addr;  | 
|---|
| 276 | 261 |   | 
|---|
| 277 |  | -	res = platform_get_resource(pdev, IORESOURCE_MEM, 5);  | 
|---|
| 278 |  | -	if (res && resource_size(res) > 1) {  | 
|---|
| 279 |  | -		addr = devm_ioremap_resource(&pdev->dev, res);  | 
|---|
| 280 |  | -		if (!IS_ERR(addr))  | 
|---|
| 281 |  | -			punit_ipcdev->base[GTDRIVER_IPC][BASE_IFACE] = addr;  | 
|---|
| 282 |  | -	}  | 
|---|
 | 262 | +	addr = devm_platform_ioremap_resource(pdev, 5);  | 
|---|
 | 263 | +	if (!IS_ERR(addr))  | 
|---|
 | 264 | +		punit_ipcdev->base[GTDRIVER_IPC][BASE_IFACE] = addr;  | 
|---|
| 283 | 265 |   | 
|---|
| 284 | 266 |  	return 0; | 
|---|
| 285 | 267 |  } | 
|---|
| .. | .. | 
|---|
| 295 | 277 |   | 
|---|
| 296 | 278 |  	platform_set_drvdata(pdev, punit_ipcdev); | 
|---|
| 297 | 279 |   | 
|---|
| 298 |  | -	irq = platform_get_irq(pdev, 0);  | 
|---|
 | 280 | +	irq = platform_get_irq_optional(pdev, 0);  | 
|---|
| 299 | 281 |  	if (irq < 0) { | 
|---|
| 300 |  | -		punit_ipcdev->irq = 0;  | 
|---|
| 301 | 282 |  		dev_warn(&pdev->dev, "Invalid IRQ, using polling mode\n"); | 
|---|
| 302 | 283 |  	} else { | 
|---|
| 303 | 284 |  		ret = devm_request_irq(&pdev->dev, irq, intel_punit_ioc, | 
|---|
| .. | .. | 
|---|
| 312 | 293 |   | 
|---|
| 313 | 294 |  	ret = intel_punit_get_bars(pdev); | 
|---|
| 314 | 295 |  	if (ret) | 
|---|
| 315 |  | -		goto out;  | 
|---|
 | 296 | +		return ret;  | 
|---|
| 316 | 297 |   | 
|---|
| 317 | 298 |  	punit_ipcdev->dev = &pdev->dev; | 
|---|
| 318 | 299 |  	mutex_init(&punit_ipcdev->lock); | 
|---|
| 319 | 300 |  	init_completion(&punit_ipcdev->cmd_complete); | 
|---|
| 320 | 301 |   | 
|---|
| 321 |  | -out:  | 
|---|
| 322 |  | -	return ret;  | 
|---|
 | 302 | +	return 0;  | 
|---|
| 323 | 303 |  } | 
|---|
| 324 | 304 |   | 
|---|
| 325 | 305 |  static int intel_punit_ipc_remove(struct platform_device *pdev) | 
|---|
| .. | .. | 
|---|
| 338 | 318 |  	.remove = intel_punit_ipc_remove, | 
|---|
| 339 | 319 |  	.driver = { | 
|---|
| 340 | 320 |  		.name = "intel_punit_ipc", | 
|---|
| 341 |  | -		.acpi_match_table = ACPI_PTR(punit_ipc_acpi_ids),  | 
|---|
 | 321 | +		.acpi_match_table = punit_ipc_acpi_ids,  | 
|---|
| 342 | 322 |  	}, | 
|---|
| 343 | 323 |  }; | 
|---|
| 344 | 324 |   | 
|---|