net/atlantic: enable broadcast traffic
[dpdk.git] / drivers / raw / ifpga_rawdev / base / opae_intel_max10.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2019 Intel Corporation
3  */
4
5 #include "opae_intel_max10.h"
6
7 static struct intel_max10_device *g_max10;
8
9 int max10_reg_read(unsigned int reg, unsigned int *val)
10 {
11         if (!g_max10)
12                 return -ENODEV;
13
14         return spi_transaction_read(g_max10->spi_tran_dev,
15                         reg, 4, (unsigned char *)val);
16 }
17
18 int max10_reg_write(unsigned int reg, unsigned int val)
19 {
20         if (!g_max10)
21                 return -ENODEV;
22
23         return spi_transaction_write(g_max10->spi_tran_dev,
24                         reg, 4, (unsigned char *)&val);
25 }
26
27 struct intel_max10_device *
28 intel_max10_device_probe(struct altera_spi_device *spi,
29                 int chipselect)
30 {
31         struct intel_max10_device *dev;
32         int ret;
33         unsigned int val;
34
35         dev = opae_malloc(sizeof(*dev));
36         if (!dev)
37                 return NULL;
38
39         dev->spi_master = spi;
40
41         dev->spi_tran_dev = spi_transaction_init(spi, chipselect);
42         if (!dev->spi_tran_dev) {
43                 dev_err(dev, "%s spi tran init fail\n", __func__);
44                 goto free_dev;
45         }
46
47         /* set the max10 device firstly */
48         g_max10 = dev;
49
50         /* read FPGA loading information */
51         ret = max10_reg_read(FPGA_PAGE_INFO_OFF, &val);
52         if (ret) {
53                 dev_err(dev, "fail to get FPGA loading info\n");
54                 goto spi_tran_fail;
55         }
56         dev_info(dev, "FPGA loaded from %s Image\n", val ? "User" : "Factory");
57
58         /* set PKVL Polling manually in BBS */
59         ret = max10_reg_write(PKVL_POLLING_CTRL, 0x3);
60         if (ret) {
61                 dev_err(dev, "%s set PKVL polling fail\n", __func__);
62                 goto spi_tran_fail;
63         }
64
65         return dev;
66
67 spi_tran_fail:
68         spi_transaction_remove(dev->spi_tran_dev);
69 free_dev:
70         g_max10 = NULL;
71         opae_free(dev);
72
73         return NULL;
74 }
75
76 int intel_max10_device_remove(struct intel_max10_device *dev)
77 {
78         if (!dev)
79                 return 0;
80
81         if (dev->spi_tran_dev)
82                 spi_transaction_remove(dev->spi_tran_dev);
83
84         g_max10 = NULL;
85         opae_free(dev);
86
87         return 0;
88 }