raw/ifpga/base: fix retimer link status
[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         unsigned int tmp = val;
21
22         if (!g_max10)
23                 return -ENODEV;
24
25         return spi_transaction_write(g_max10->spi_tran_dev,
26                         reg, 4, (unsigned char *)&tmp);
27 }
28
29 struct intel_max10_device *
30 intel_max10_device_probe(struct altera_spi_device *spi,
31                 int chipselect)
32 {
33         struct intel_max10_device *dev;
34         int ret;
35         unsigned int val;
36
37         dev = opae_malloc(sizeof(*dev));
38         if (!dev)
39                 return NULL;
40
41         dev->spi_master = spi;
42
43         dev->spi_tran_dev = spi_transaction_init(spi, chipselect);
44         if (!dev->spi_tran_dev) {
45                 dev_err(dev, "%s spi tran init fail\n", __func__);
46                 goto free_dev;
47         }
48
49         /* set the max10 device firstly */
50         g_max10 = dev;
51
52         /* read FPGA loading information */
53         ret = max10_reg_read(FPGA_PAGE_INFO_OFF, &val);
54         if (ret) {
55                 dev_err(dev, "fail to get FPGA loading info\n");
56                 goto spi_tran_fail;
57         }
58         dev_info(dev, "FPGA loaded from %s Image\n", val ? "User" : "Factory");
59
60         return dev;
61
62 spi_tran_fail:
63         spi_transaction_remove(dev->spi_tran_dev);
64 free_dev:
65         g_max10 = NULL;
66         opae_free(dev);
67
68         return NULL;
69 }
70
71 int intel_max10_device_remove(struct intel_max10_device *dev)
72 {
73         if (!dev)
74                 return 0;
75
76         if (dev->spi_tran_dev)
77                 spi_transaction_remove(dev->spi_tran_dev);
78
79         g_max10 = NULL;
80         opae_free(dev);
81
82         return 0;
83 }