| .. | .. |
|---|
| 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 | |
|---|