/* * PCI bus driver for Bosch C_CAN/D_CAN controller * * Copyright (C) 2012 Federico Vaga <federico.vaga@gmail.com> * * Borrowed from c_can_platform.c * * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied.
*/
struct c_can_pci_data { /* Specify if is C_CAN or D_CAN */ enum c_can_dev_id type; /* Number of message objects */ unsignedint msg_obj_num; /* Set the register alignment in the memory */ enum c_can_pci_reg_align reg_align; /* Set the frequency */ unsignedint freq; /* PCI bar number */ int bar; /* Callback for reset */ void (*init)(conststruct c_can_priv *priv, bool enable);
};
/* 16-bit c_can registers can be arranged differently in the memory * architecture of different implementations. For example: 16-bit * registers can be aligned to a 16-bit boundary or 32-bit boundary etc. * Handle the same by providing a common read/write interface.
*/ static u16 c_can_pci_read_reg_aligned_to_16bit(conststruct c_can_priv *priv, enum reg index)
{ return readw(priv->base + priv->regs[index]);
}
if (!c_can_pci_data->freq) {
dev_err(&pdev->dev, "no clock frequency defined\n");
ret = -ENODEV; goto out_free_c_can;
} else {
priv->can.clock.freq = c_can_pci_data->freq;
}
/* Configure CAN type */ switch (c_can_pci_data->type) { case BOSCH_C_CAN:
priv->regs = reg_map_c_can; break; case BOSCH_D_CAN:
priv->regs = reg_map_d_can; break; default:
ret = -EINVAL; goto out_free_c_can;
}
priv->type = c_can_pci_data->type;
/* Configure access to registers */ switch (c_can_pci_data->reg_align) { case C_CAN_REG_ALIGN_32:
priv->read_reg = c_can_pci_read_reg_aligned_to_32bit;
priv->write_reg = c_can_pci_write_reg_aligned_to_32bit; break; case C_CAN_REG_ALIGN_16:
priv->read_reg = c_can_pci_read_reg_aligned_to_16bit;
priv->write_reg = c_can_pci_write_reg_aligned_to_16bit; break; case C_CAN_REG_32:
priv->read_reg = c_can_pci_read_reg_32bit;
priv->write_reg = c_can_pci_write_reg_32bit; break; default:
ret = -EINVAL; goto out_free_c_can;
}
priv->read_reg32 = c_can_pci_read_reg32;
priv->write_reg32 = c_can_pci_write_reg32;
priv->raminit = c_can_pci_data->init;
ret = register_c_can_dev(dev); if (ret) {
dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
KBUILD_MODNAME, ret); goto out_free_c_can;
}
MODULE_AUTHOR("Federico Vaga ");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("PCI CAN bus driver for Bosch C_CAN/D_CAN controller");
MODULE_DEVICE_TABLE(pci, c_can_pci_tbl);
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.