9952f6918d
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms and conditions of the gnu general public license version 2 as published by the free software foundation this program is distributed in the hope it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not see http www gnu org licenses extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 228 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Steve Winslow <swinslow@gmail.com> Reviewed-by: Richard Fontana <rfontana@redhat.com> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190528171438.107155473@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* VFIO platform driver specialized for Calxeda xgmac reset
|
|
* reset code is inherited from calxeda xgmac native driver
|
|
*
|
|
* Copyright 2010-2011 Calxeda, Inc.
|
|
* Copyright (c) 2015 Linaro Ltd.
|
|
* www.linaro.org
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/io.h>
|
|
|
|
#include "../vfio_platform_private.h"
|
|
|
|
#define DRIVER_VERSION "0.1"
|
|
#define DRIVER_AUTHOR "Eric Auger <eric.auger@linaro.org>"
|
|
#define DRIVER_DESC "Reset support for Calxeda xgmac vfio platform device"
|
|
|
|
/* XGMAC Register definitions */
|
|
#define XGMAC_CONTROL 0x00000000 /* MAC Configuration */
|
|
|
|
/* DMA Control and Status Registers */
|
|
#define XGMAC_DMA_CONTROL 0x00000f18 /* Ctrl (Operational Mode) */
|
|
#define XGMAC_DMA_INTR_ENA 0x00000f1c /* Interrupt Enable */
|
|
|
|
/* DMA Control registe defines */
|
|
#define DMA_CONTROL_ST 0x00002000 /* Start/Stop Transmission */
|
|
#define DMA_CONTROL_SR 0x00000002 /* Start/Stop Receive */
|
|
|
|
/* Common MAC defines */
|
|
#define MAC_ENABLE_TX 0x00000008 /* Transmitter Enable */
|
|
#define MAC_ENABLE_RX 0x00000004 /* Receiver Enable */
|
|
|
|
static inline void xgmac_mac_disable(void __iomem *ioaddr)
|
|
{
|
|
u32 value = readl(ioaddr + XGMAC_DMA_CONTROL);
|
|
|
|
value &= ~(DMA_CONTROL_ST | DMA_CONTROL_SR);
|
|
writel(value, ioaddr + XGMAC_DMA_CONTROL);
|
|
|
|
value = readl(ioaddr + XGMAC_CONTROL);
|
|
value &= ~(MAC_ENABLE_TX | MAC_ENABLE_RX);
|
|
writel(value, ioaddr + XGMAC_CONTROL);
|
|
}
|
|
|
|
static int vfio_platform_calxedaxgmac_reset(struct vfio_platform_device *vdev)
|
|
{
|
|
struct vfio_platform_region *reg = &vdev->regions[0];
|
|
|
|
if (!reg->ioaddr) {
|
|
reg->ioaddr =
|
|
ioremap_nocache(reg->addr, reg->size);
|
|
if (!reg->ioaddr)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
/* disable IRQ */
|
|
writel(0, reg->ioaddr + XGMAC_DMA_INTR_ENA);
|
|
|
|
/* Disable the MAC core */
|
|
xgmac_mac_disable(reg->ioaddr);
|
|
|
|
return 0;
|
|
}
|
|
|
|
module_vfio_reset_handler("calxeda,hb-xgmac", vfio_platform_calxedaxgmac_reset);
|
|
|
|
MODULE_VERSION(DRIVER_VERSION);
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_AUTHOR(DRIVER_AUTHOR);
|
|
MODULE_DESCRIPTION(DRIVER_DESC);
|