linux-can-fixes-for-5.18-20220514
-----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEBsvAIBsPu6mG7thcrX5LkNig010FAmJ/+pYTHG1rbEBwZW5n dXRyb25peC5kZQAKCRCtfkuQ2KDTXQSHB/9EEcms7LYv1N+SftYGIOA/rY+dhD+o N6aLI0aFI3K1SK7BcnSuvamO+Wi6pEH/8twe/fFSphaKiQIiy7rE+FmU0BLPcvG1 ejISzRUdxDkWW0X7fZQfObf9MGOlostXjYWPb396OfOR/z45DvFmhuJX1ye/9W5+ HFmfbsGkDKzmZhgXrkP1Zj3ag4br2qJLPGsWmiH4QBBeWT6dokfqxiM0rNjA18Hp gytGQ6AycHFhyEaAuyEQKNCpsce/s1f/dpQ5EsSxbNEHT4aV1qwc05fL4/SHmEih zR8QjIy9d0I7fprM5VXrbLt5e7aQR9XIaJIZ+iL8t2LYhCnw/g4xkEQe =ANrU -----END PGP SIGNATURE----- Merge tag 'linux-can-fixes-for-5.18-20220514' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can Marc Kleine-Budde says: ==================== pull-request: can 2022-05-14 this is a pull request of 2 patches for net/master. Changes to linux-can-fixes-for-5.18-20220513: - adjusted Fixes: Tag on "Revert "can: m_can: pci: use custom bit timings for Elkhart Lake"" (Thanks Jakub) Both patches are by Jarkko Nikula, target the m_can PCI driver bindings, and fix usage of wrong bit timing constants for the Elkhart Lake platform. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
dbd5f5d868
|
@ -1495,34 +1495,22 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)
|
||||||
err = can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
err = can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
cdev->can.bittiming_const = &m_can_bittiming_const_30X;
|
||||||
cdev->bit_timing : &m_can_bittiming_const_30X;
|
cdev->can.data_bittiming_const = &m_can_data_bittiming_const_30X;
|
||||||
|
|
||||||
cdev->can.data_bittiming_const = cdev->data_timing ?
|
|
||||||
cdev->data_timing :
|
|
||||||
&m_can_data_bittiming_const_30X;
|
|
||||||
break;
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
/* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.1.x */
|
/* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.1.x */
|
||||||
err = can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
err = can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
cdev->can.bittiming_const = &m_can_bittiming_const_31X;
|
||||||
cdev->bit_timing : &m_can_bittiming_const_31X;
|
cdev->can.data_bittiming_const = &m_can_data_bittiming_const_31X;
|
||||||
|
|
||||||
cdev->can.data_bittiming_const = cdev->data_timing ?
|
|
||||||
cdev->data_timing :
|
|
||||||
&m_can_data_bittiming_const_31X;
|
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
case 33:
|
case 33:
|
||||||
/* Support both MCAN version v3.2.x and v3.3.0 */
|
/* Support both MCAN version v3.2.x and v3.3.0 */
|
||||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
cdev->can.bittiming_const = &m_can_bittiming_const_31X;
|
||||||
cdev->bit_timing : &m_can_bittiming_const_31X;
|
cdev->can.data_bittiming_const = &m_can_data_bittiming_const_31X;
|
||||||
|
|
||||||
cdev->can.data_bittiming_const = cdev->data_timing ?
|
|
||||||
cdev->data_timing :
|
|
||||||
&m_can_data_bittiming_const_31X;
|
|
||||||
|
|
||||||
cdev->can.ctrlmode_supported |=
|
cdev->can.ctrlmode_supported |=
|
||||||
(m_can_niso_supported(cdev) ?
|
(m_can_niso_supported(cdev) ?
|
||||||
|
|
|
@ -85,9 +85,6 @@ struct m_can_classdev {
|
||||||
struct sk_buff *tx_skb;
|
struct sk_buff *tx_skb;
|
||||||
struct phy *transceiver;
|
struct phy *transceiver;
|
||||||
|
|
||||||
const struct can_bittiming_const *bit_timing;
|
|
||||||
const struct can_bittiming_const *data_timing;
|
|
||||||
|
|
||||||
struct m_can_ops *ops;
|
struct m_can_ops *ops;
|
||||||
|
|
||||||
int version;
|
int version;
|
||||||
|
|
|
@ -18,14 +18,9 @@
|
||||||
|
|
||||||
#define M_CAN_PCI_MMIO_BAR 0
|
#define M_CAN_PCI_MMIO_BAR 0
|
||||||
|
|
||||||
|
#define M_CAN_CLOCK_FREQ_EHL 200000000
|
||||||
#define CTL_CSR_INT_CTL_OFFSET 0x508
|
#define CTL_CSR_INT_CTL_OFFSET 0x508
|
||||||
|
|
||||||
struct m_can_pci_config {
|
|
||||||
const struct can_bittiming_const *bit_timing;
|
|
||||||
const struct can_bittiming_const *data_timing;
|
|
||||||
unsigned int clock_freq;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct m_can_pci_priv {
|
struct m_can_pci_priv {
|
||||||
struct m_can_classdev cdev;
|
struct m_can_classdev cdev;
|
||||||
|
|
||||||
|
@ -89,40 +84,9 @@ static struct m_can_ops m_can_pci_ops = {
|
||||||
.read_fifo = iomap_read_fifo,
|
.read_fifo = iomap_read_fifo,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct can_bittiming_const m_can_bittiming_const_ehl = {
|
|
||||||
.name = KBUILD_MODNAME,
|
|
||||||
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
|
|
||||||
.tseg1_max = 64,
|
|
||||||
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
|
|
||||||
.tseg2_max = 128,
|
|
||||||
.sjw_max = 128,
|
|
||||||
.brp_min = 1,
|
|
||||||
.brp_max = 512,
|
|
||||||
.brp_inc = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct can_bittiming_const m_can_data_bittiming_const_ehl = {
|
|
||||||
.name = KBUILD_MODNAME,
|
|
||||||
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
|
|
||||||
.tseg1_max = 16,
|
|
||||||
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
|
|
||||||
.tseg2_max = 8,
|
|
||||||
.sjw_max = 4,
|
|
||||||
.brp_min = 1,
|
|
||||||
.brp_max = 32,
|
|
||||||
.brp_inc = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct m_can_pci_config m_can_pci_ehl = {
|
|
||||||
.bit_timing = &m_can_bittiming_const_ehl,
|
|
||||||
.data_timing = &m_can_data_bittiming_const_ehl,
|
|
||||||
.clock_freq = 200000000,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||||
{
|
{
|
||||||
struct device *dev = &pci->dev;
|
struct device *dev = &pci->dev;
|
||||||
const struct m_can_pci_config *cfg;
|
|
||||||
struct m_can_classdev *mcan_class;
|
struct m_can_classdev *mcan_class;
|
||||||
struct m_can_pci_priv *priv;
|
struct m_can_pci_priv *priv;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
|
@ -150,8 +114,6 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||||
if (!mcan_class)
|
if (!mcan_class)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
cfg = (const struct m_can_pci_config *)id->driver_data;
|
|
||||||
|
|
||||||
priv = cdev_to_priv(mcan_class);
|
priv = cdev_to_priv(mcan_class);
|
||||||
|
|
||||||
priv->base = base;
|
priv->base = base;
|
||||||
|
@ -163,9 +125,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||||
mcan_class->dev = &pci->dev;
|
mcan_class->dev = &pci->dev;
|
||||||
mcan_class->net->irq = pci_irq_vector(pci, 0);
|
mcan_class->net->irq = pci_irq_vector(pci, 0);
|
||||||
mcan_class->pm_clock_support = 1;
|
mcan_class->pm_clock_support = 1;
|
||||||
mcan_class->bit_timing = cfg->bit_timing;
|
mcan_class->can.clock.freq = id->driver_data;
|
||||||
mcan_class->data_timing = cfg->data_timing;
|
|
||||||
mcan_class->can.clock.freq = cfg->clock_freq;
|
|
||||||
mcan_class->ops = &m_can_pci_ops;
|
mcan_class->ops = &m_can_pci_ops;
|
||||||
|
|
||||||
pci_set_drvdata(pci, mcan_class);
|
pci_set_drvdata(pci, mcan_class);
|
||||||
|
@ -218,8 +178,8 @@ static SIMPLE_DEV_PM_OPS(m_can_pci_pm_ops,
|
||||||
m_can_pci_suspend, m_can_pci_resume);
|
m_can_pci_suspend, m_can_pci_resume);
|
||||||
|
|
||||||
static const struct pci_device_id m_can_pci_id_table[] = {
|
static const struct pci_device_id m_can_pci_id_table[] = {
|
||||||
{ PCI_VDEVICE(INTEL, 0x4bc1), (kernel_ulong_t)&m_can_pci_ehl, },
|
{ PCI_VDEVICE(INTEL, 0x4bc1), M_CAN_CLOCK_FREQ_EHL, },
|
||||||
{ PCI_VDEVICE(INTEL, 0x4bc2), (kernel_ulong_t)&m_can_pci_ehl, },
|
{ PCI_VDEVICE(INTEL, 0x4bc2), M_CAN_CLOCK_FREQ_EHL, },
|
||||||
{ } /* Terminating Entry */
|
{ } /* Terminating Entry */
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pci, m_can_pci_id_table);
|
MODULE_DEVICE_TABLE(pci, m_can_pci_id_table);
|
||||||
|
|
Loading…
Reference in New Issue