1 // SPDX-License-Identifier: GPL-2.0-only
3 * Cavium ThunderX SPI driver.
5 * Copyright (C) 2016 Cavium Inc.
6 * Authors: Jan Glauber <jglauber@cavium.com>
9 #include <linux/module.h>
10 #include <linux/pci.h>
11 #include <linux/spi/spi.h>
13 #include "spi-cavium.h"
15 #define DRV_NAME "spi-thunderx"
17 #define SYS_FREQ_DEFAULT 700000000 /* 700 Mhz */
19 static int thunderx_spi_probe(struct pci_dev
*pdev
,
20 const struct pci_device_id
*ent
)
22 struct device
*dev
= &pdev
->dev
;
23 struct spi_controller
*host
;
27 host
= spi_alloc_host(dev
, sizeof(struct octeon_spi
));
31 p
= spi_controller_get_devdata(host
);
33 ret
= pcim_enable_device(pdev
);
37 ret
= pci_request_regions(pdev
, DRV_NAME
);
41 p
->register_base
= pcim_iomap(pdev
, 0, pci_resource_len(pdev
, 0));
42 if (!p
->register_base
) {
47 p
->regs
.config
= 0x1000;
48 p
->regs
.status
= 0x1008;
50 p
->regs
.data
= 0x1080;
52 p
->clk
= devm_clk_get_enabled(dev
, NULL
);
54 ret
= PTR_ERR(p
->clk
);
58 p
->sys_freq
= clk_get_rate(p
->clk
);
60 p
->sys_freq
= SYS_FREQ_DEFAULT
;
61 dev_info(dev
, "Set system clock to %u\n", p
->sys_freq
);
63 host
->flags
= SPI_CONTROLLER_HALF_DUPLEX
;
64 host
->num_chipselect
= 4;
65 host
->mode_bits
= SPI_CPHA
| SPI_CPOL
| SPI_CS_HIGH
|
66 SPI_LSB_FIRST
| SPI_3WIRE
;
67 host
->transfer_one_message
= octeon_spi_transfer_one_message
;
68 host
->bits_per_word_mask
= SPI_BPW_MASK(8);
69 host
->max_speed_hz
= OCTEON_SPI_MAX_CLOCK_HZ
;
70 host
->dev
.of_node
= pdev
->dev
.of_node
;
72 pci_set_drvdata(pdev
, host
);
74 ret
= devm_spi_register_controller(dev
, host
);
81 pci_release_regions(pdev
);
82 spi_controller_put(host
);
86 static void thunderx_spi_remove(struct pci_dev
*pdev
)
88 struct spi_controller
*host
= pci_get_drvdata(pdev
);
91 p
= spi_controller_get_devdata(host
);
95 pci_release_regions(pdev
);
96 /* Put everything in a known state. */
97 writeq(0, p
->register_base
+ OCTEON_SPI_CFG(p
));
100 static const struct pci_device_id thunderx_spi_pci_id_table
[] = {
101 { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM
, 0xa00b) },
105 MODULE_DEVICE_TABLE(pci
, thunderx_spi_pci_id_table
);
107 static struct pci_driver thunderx_spi_driver
= {
109 .id_table
= thunderx_spi_pci_id_table
,
110 .probe
= thunderx_spi_probe
,
111 .remove
= thunderx_spi_remove
,
114 module_pci_driver(thunderx_spi_driver
);
116 MODULE_DESCRIPTION("Cavium, Inc. ThunderX SPI bus driver");
117 MODULE_AUTHOR("Jan Glauber");
118 MODULE_LICENSE("GPL");