.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright (C) 1999 - 2010 Intel Corporation. |
---|
3 | 4 | * Copyright (C) 2010 LAPIS SEMICONDUCTOR CO., LTD. |
---|
4 | | - * |
---|
5 | | - * This program is free software; you can redistribute it and/or modify |
---|
6 | | - * it under the terms of the GNU General Public License as published by |
---|
7 | | - * the Free Software Foundation; version 2 of the License. |
---|
8 | | - * |
---|
9 | | - * This program is distributed in the hope that it will be useful, |
---|
10 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
11 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
12 | | - * GNU General Public License for more details. |
---|
13 | | - * |
---|
14 | | - * You should have received a copy of the GNU General Public License |
---|
15 | | - * along with this program; if not, see <http://www.gnu.org/licenses/>. |
---|
16 | 5 | */ |
---|
17 | 6 | |
---|
18 | 7 | #include <linux/interrupt.h> |
---|
.. | .. |
---|
472 | 461 | PCH_ID2_DIR | (0x7ff << 2)); |
---|
473 | 462 | iowrite32(0x0, &priv->regs->ifregs[1].id1); |
---|
474 | 463 | |
---|
475 | | - /* Claring NewDat, TxRqst & IntPnd */ |
---|
| 464 | + /* Clearing NewDat, TxRqst & IntPnd */ |
---|
476 | 465 | pch_can_bit_clear(&priv->regs->ifregs[1].mcont, |
---|
477 | 466 | PCH_IF_MCONT_NEWDAT | PCH_IF_MCONT_INTPND | |
---|
478 | 467 | PCH_IF_MCONT_TXRQXT); |
---|
.. | .. |
---|
500 | 489 | if (!skb) |
---|
501 | 490 | return; |
---|
502 | 491 | |
---|
| 492 | + errc = ioread32(&priv->regs->errc); |
---|
503 | 493 | if (status & PCH_BUS_OFF) { |
---|
504 | 494 | pch_can_set_tx_all(priv, 0); |
---|
505 | 495 | pch_can_set_rx_all(priv, 0); |
---|
.. | .. |
---|
507 | 497 | cf->can_id |= CAN_ERR_BUSOFF; |
---|
508 | 498 | priv->can.can_stats.bus_off++; |
---|
509 | 499 | can_bus_off(ndev); |
---|
| 500 | + } else { |
---|
| 501 | + cf->data[6] = errc & PCH_TEC; |
---|
| 502 | + cf->data[7] = (errc & PCH_REC) >> 8; |
---|
510 | 503 | } |
---|
511 | 504 | |
---|
512 | | - errc = ioread32(&priv->regs->errc); |
---|
513 | 505 | /* Warning interrupt. */ |
---|
514 | 506 | if (status & PCH_EWARN) { |
---|
515 | 507 | state = CAN_STATE_ERROR_WARNING; |
---|
.. | .. |
---|
566 | 558 | case PCH_LEC_ALL: /* Written by CPU. No error status */ |
---|
567 | 559 | break; |
---|
568 | 560 | } |
---|
569 | | - |
---|
570 | | - cf->data[6] = errc & PCH_TEC; |
---|
571 | | - cf->data[7] = (errc & PCH_REC) >> 8; |
---|
572 | 561 | |
---|
573 | 562 | priv->can.state = state; |
---|
574 | 563 | netif_receive_skb(skb); |
---|
.. | .. |
---|
845 | 834 | struct pch_can_priv *priv = netdev_priv(ndev); |
---|
846 | 835 | int retval; |
---|
847 | 836 | |
---|
848 | | - /* Regstering the interrupt. */ |
---|
| 837 | + /* Registering the interrupt. */ |
---|
849 | 838 | retval = request_irq(priv->dev->irq, pch_can_interrupt, IRQF_SHARED, |
---|
850 | 839 | ndev->name, ndev); |
---|
851 | 840 | if (retval) { |
---|
.. | .. |
---|
968 | 957 | free_candev(priv->ndev); |
---|
969 | 958 | } |
---|
970 | 959 | |
---|
971 | | -#ifdef CONFIG_PM |
---|
972 | | -static void pch_can_set_int_custom(struct pch_can_priv *priv) |
---|
| 960 | +static void __maybe_unused pch_can_set_int_custom(struct pch_can_priv *priv) |
---|
973 | 961 | { |
---|
974 | 962 | /* Clearing the IE, SIE and EIE bits of Can control register. */ |
---|
975 | 963 | pch_can_bit_clear(&priv->regs->cont, PCH_CTRL_IE_SIE_EIE); |
---|
.. | .. |
---|
980 | 968 | } |
---|
981 | 969 | |
---|
982 | 970 | /* This function retrieves interrupt enabled for the CAN device. */ |
---|
983 | | -static u32 pch_can_get_int_enables(struct pch_can_priv *priv) |
---|
| 971 | +static u32 __maybe_unused pch_can_get_int_enables(struct pch_can_priv *priv) |
---|
984 | 972 | { |
---|
985 | 973 | /* Obtaining the status of IE, SIE and EIE interrupt bits. */ |
---|
986 | 974 | return (ioread32(&priv->regs->cont) & PCH_CTRL_IE_SIE_EIE) >> 1; |
---|
987 | 975 | } |
---|
988 | 976 | |
---|
989 | | -static u32 pch_can_get_rxtx_ir(struct pch_can_priv *priv, u32 buff_num, |
---|
990 | | - enum pch_ifreg dir) |
---|
| 977 | +static u32 __maybe_unused pch_can_get_rxtx_ir(struct pch_can_priv *priv, |
---|
| 978 | + u32 buff_num, enum pch_ifreg dir) |
---|
991 | 979 | { |
---|
992 | 980 | u32 ie, enable; |
---|
993 | 981 | |
---|
.. | .. |
---|
1008 | 996 | return enable; |
---|
1009 | 997 | } |
---|
1010 | 998 | |
---|
1011 | | -static void pch_can_set_rx_buffer_link(struct pch_can_priv *priv, |
---|
1012 | | - u32 buffer_num, int set) |
---|
| 999 | +static void __maybe_unused pch_can_set_rx_buffer_link(struct pch_can_priv *priv, |
---|
| 1000 | + u32 buffer_num, int set) |
---|
1013 | 1001 | { |
---|
1014 | 1002 | iowrite32(PCH_CMASK_RX_TX_GET, &priv->regs->ifregs[0].cmask); |
---|
1015 | 1003 | pch_can_rw_msg_obj(&priv->regs->ifregs[0].creq, buffer_num); |
---|
.. | .. |
---|
1024 | 1012 | pch_can_rw_msg_obj(&priv->regs->ifregs[0].creq, buffer_num); |
---|
1025 | 1013 | } |
---|
1026 | 1014 | |
---|
1027 | | -static u32 pch_can_get_rx_buffer_link(struct pch_can_priv *priv, u32 buffer_num) |
---|
| 1015 | +static u32 __maybe_unused pch_can_get_rx_buffer_link(struct pch_can_priv *priv, |
---|
| 1016 | + u32 buffer_num) |
---|
1028 | 1017 | { |
---|
1029 | 1018 | u32 link; |
---|
1030 | 1019 | |
---|
.. | .. |
---|
1038 | 1027 | return link; |
---|
1039 | 1028 | } |
---|
1040 | 1029 | |
---|
1041 | | -static int pch_can_get_buffer_status(struct pch_can_priv *priv) |
---|
| 1030 | +static int __maybe_unused pch_can_get_buffer_status(struct pch_can_priv *priv) |
---|
1042 | 1031 | { |
---|
1043 | 1032 | return (ioread32(&priv->regs->treq1) & 0xffff) | |
---|
1044 | 1033 | (ioread32(&priv->regs->treq2) << 16); |
---|
1045 | 1034 | } |
---|
1046 | 1035 | |
---|
1047 | | -static int pch_can_suspend(struct pci_dev *pdev, pm_message_t state) |
---|
| 1036 | +static int __maybe_unused pch_can_suspend(struct device *dev_d) |
---|
1048 | 1037 | { |
---|
1049 | 1038 | int i; |
---|
1050 | | - int retval; |
---|
1051 | 1039 | u32 buf_stat; /* Variable for reading the transmit buffer status. */ |
---|
1052 | 1040 | int counter = PCH_COUNTER_LIMIT; |
---|
1053 | 1041 | |
---|
1054 | | - struct net_device *dev = pci_get_drvdata(pdev); |
---|
| 1042 | + struct net_device *dev = dev_get_drvdata(dev_d); |
---|
1055 | 1043 | struct pch_can_priv *priv = netdev_priv(dev); |
---|
1056 | 1044 | |
---|
1057 | 1045 | /* Stop the CAN controller */ |
---|
.. | .. |
---|
1069 | 1057 | udelay(1); |
---|
1070 | 1058 | } |
---|
1071 | 1059 | if (!counter) |
---|
1072 | | - dev_err(&pdev->dev, "%s -> Transmission time out.\n", __func__); |
---|
| 1060 | + dev_err(dev_d, "%s -> Transmission time out.\n", __func__); |
---|
1073 | 1061 | |
---|
1074 | 1062 | /* Save interrupt configuration and then disable them */ |
---|
1075 | 1063 | priv->int_enables = pch_can_get_int_enables(priv); |
---|
.. | .. |
---|
1092 | 1080 | |
---|
1093 | 1081 | /* Disable all Receive buffers */ |
---|
1094 | 1082 | pch_can_set_rx_all(priv, 0); |
---|
1095 | | - retval = pci_save_state(pdev); |
---|
1096 | | - if (retval) { |
---|
1097 | | - dev_err(&pdev->dev, "pci_save_state failed.\n"); |
---|
1098 | | - } else { |
---|
1099 | | - pci_enable_wake(pdev, PCI_D3hot, 0); |
---|
1100 | | - pci_disable_device(pdev); |
---|
1101 | | - pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
---|
1102 | | - } |
---|
1103 | 1083 | |
---|
1104 | | - return retval; |
---|
| 1084 | + return 0; |
---|
1105 | 1085 | } |
---|
1106 | 1086 | |
---|
1107 | | -static int pch_can_resume(struct pci_dev *pdev) |
---|
| 1087 | +static int __maybe_unused pch_can_resume(struct device *dev_d) |
---|
1108 | 1088 | { |
---|
1109 | 1089 | int i; |
---|
1110 | | - int retval; |
---|
1111 | | - struct net_device *dev = pci_get_drvdata(pdev); |
---|
| 1090 | + struct net_device *dev = dev_get_drvdata(dev_d); |
---|
1112 | 1091 | struct pch_can_priv *priv = netdev_priv(dev); |
---|
1113 | | - |
---|
1114 | | - pci_set_power_state(pdev, PCI_D0); |
---|
1115 | | - pci_restore_state(pdev); |
---|
1116 | | - retval = pci_enable_device(pdev); |
---|
1117 | | - if (retval) { |
---|
1118 | | - dev_err(&pdev->dev, "pci_enable_device failed.\n"); |
---|
1119 | | - return retval; |
---|
1120 | | - } |
---|
1121 | | - |
---|
1122 | | - pci_enable_wake(pdev, PCI_D3hot, 0); |
---|
1123 | 1092 | |
---|
1124 | 1093 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
---|
1125 | 1094 | |
---|
.. | .. |
---|
1157 | 1126 | /* Restore Run Mode */ |
---|
1158 | 1127 | pch_can_set_run_mode(priv, PCH_CAN_RUN); |
---|
1159 | 1128 | |
---|
1160 | | - return retval; |
---|
| 1129 | + return 0; |
---|
1161 | 1130 | } |
---|
1162 | | -#else |
---|
1163 | | -#define pch_can_suspend NULL |
---|
1164 | | -#define pch_can_resume NULL |
---|
1165 | | -#endif |
---|
1166 | 1131 | |
---|
1167 | 1132 | static int pch_can_get_berr_counter(const struct net_device *dev, |
---|
1168 | 1133 | struct can_berr_counter *bec) |
---|
.. | .. |
---|
1263 | 1228 | return rc; |
---|
1264 | 1229 | } |
---|
1265 | 1230 | |
---|
| 1231 | +static SIMPLE_DEV_PM_OPS(pch_can_pm_ops, |
---|
| 1232 | + pch_can_suspend, |
---|
| 1233 | + pch_can_resume); |
---|
| 1234 | + |
---|
1266 | 1235 | static struct pci_driver pch_can_pci_driver = { |
---|
1267 | 1236 | .name = "pch_can", |
---|
1268 | 1237 | .id_table = pch_pci_tbl, |
---|
1269 | 1238 | .probe = pch_can_probe, |
---|
1270 | 1239 | .remove = pch_can_remove, |
---|
1271 | | - .suspend = pch_can_suspend, |
---|
1272 | | - .resume = pch_can_resume, |
---|
| 1240 | + .driver.pm = &pch_can_pm_ops, |
---|
1273 | 1241 | }; |
---|
1274 | 1242 | |
---|
1275 | 1243 | module_pci_driver(pch_can_pci_driver); |
---|