Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ea4c178

Browse files
tq-schiffermmarckleinebudde
authored andcommitted
can: m_can: pci: use custom bit timings for Elkhart Lake
The relevant datasheet [1] specifies nonstandard limits for the bit timing parameters. While it is unclear what the exact effect of violating these limits is, it seems like a good idea to adhere to the documentation. [1] Intel Atom® x6000E Series, and Intel® Pentium® and Celeron® N and J Series Processors for IoT Applications Datasheet, Volume 2 (Book 3 of 3), July 2021, Revision 001 Fixes: cab7ffc ("can: m_can: add PCI glue driver for Intel Elkhart Lake") Link: https://lore.kernel.org/all/9eba5d7c05a48ead4024ffa6e5926f191d8c6b38.1636967198.git.matthias.schiffer@ew.tq-group.com Signed-off-by: Matthias Schiffer <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent ea22ba4 commit ea4c178

File tree

1 file changed

+44
-4
lines changed

1 file changed

+44
-4
lines changed

drivers/net/can/m_can/m_can_pci.c

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@
1818

1919
#define M_CAN_PCI_MMIO_BAR 0
2020

21-
#define M_CAN_CLOCK_FREQ_EHL 200000000
2221
#define CTL_CSR_INT_CTL_OFFSET 0x508
2322

23+
struct m_can_pci_config {
24+
const struct can_bittiming_const *bit_timing;
25+
const struct can_bittiming_const *data_timing;
26+
unsigned int clock_freq;
27+
};
28+
2429
struct m_can_pci_priv {
2530
struct m_can_classdev cdev;
2631

@@ -84,9 +89,40 @@ static struct m_can_ops m_can_pci_ops = {
8489
.read_fifo = iomap_read_fifo,
8590
};
8691

92+
static const struct can_bittiming_const m_can_bittiming_const_ehl = {
93+
.name = KBUILD_MODNAME,
94+
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
95+
.tseg1_max = 64,
96+
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
97+
.tseg2_max = 128,
98+
.sjw_max = 128,
99+
.brp_min = 1,
100+
.brp_max = 512,
101+
.brp_inc = 1,
102+
};
103+
104+
static const struct can_bittiming_const m_can_data_bittiming_const_ehl = {
105+
.name = KBUILD_MODNAME,
106+
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
107+
.tseg1_max = 16,
108+
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
109+
.tseg2_max = 8,
110+
.sjw_max = 4,
111+
.brp_min = 1,
112+
.brp_max = 32,
113+
.brp_inc = 1,
114+
};
115+
116+
static const struct m_can_pci_config m_can_pci_ehl = {
117+
.bit_timing = &m_can_bittiming_const_ehl,
118+
.data_timing = &m_can_data_bittiming_const_ehl,
119+
.clock_freq = 200000000,
120+
};
121+
87122
static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
88123
{
89124
struct device *dev = &pci->dev;
125+
const struct m_can_pci_config *cfg;
90126
struct m_can_classdev *mcan_class;
91127
struct m_can_pci_priv *priv;
92128
void __iomem *base;
@@ -114,6 +150,8 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
114150
if (!mcan_class)
115151
return -ENOMEM;
116152

153+
cfg = (const struct m_can_pci_config *)id->driver_data;
154+
117155
priv = cdev_to_priv(mcan_class);
118156

119157
priv->base = base;
@@ -125,7 +163,9 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
125163
mcan_class->dev = &pci->dev;
126164
mcan_class->net->irq = pci_irq_vector(pci, 0);
127165
mcan_class->pm_clock_support = 1;
128-
mcan_class->can.clock.freq = id->driver_data;
166+
mcan_class->bit_timing = cfg->bit_timing;
167+
mcan_class->data_timing = cfg->data_timing;
168+
mcan_class->can.clock.freq = cfg->clock_freq;
129169
mcan_class->ops = &m_can_pci_ops;
130170

131171
pci_set_drvdata(pci, mcan_class);
@@ -178,8 +218,8 @@ static SIMPLE_DEV_PM_OPS(m_can_pci_pm_ops,
178218
m_can_pci_suspend, m_can_pci_resume);
179219

180220
static const struct pci_device_id m_can_pci_id_table[] = {
181-
{ PCI_VDEVICE(INTEL, 0x4bc1), M_CAN_CLOCK_FREQ_EHL, },
182-
{ PCI_VDEVICE(INTEL, 0x4bc2), M_CAN_CLOCK_FREQ_EHL, },
221+
{ PCI_VDEVICE(INTEL, 0x4bc1), (kernel_ulong_t)&m_can_pci_ehl, },
222+
{ PCI_VDEVICE(INTEL, 0x4bc2), (kernel_ulong_t)&m_can_pci_ehl, },
183223
{ } /* Terminating Entry */
184224
};
185225
MODULE_DEVICE_TABLE(pci, m_can_pci_id_table);

0 commit comments

Comments
 (0)