// SPDX-License-Identifier: GPL-2.0-only /* * Copyright 2011-2012, Meador Inge, Mentor Graphics Corporation. * * Some ideas based on un-pushed work done by Vivek Mahajan, Jason Jin, and * Mingkai Hu from Freescale Semiconductor, Inc.
*/
/* The following three functions are used to compute the order and number of * the message register blocks. They are clearly very inefficient. However, * they are called *only* a few times during device initialization.
*/ staticunsignedint mpic_msgr_number_of_blocks(void)
{ unsignedint count; struct device_node *aliases;
/* The probe function for a single message register block.
*/ staticint mpic_msgr_probe(struct platform_device *dev)
{ void __iomem *msgr_block_addr; int block_number; struct resource rsrc; unsignedint i; unsignedint irq_index; struct device_node *np = dev->dev.of_node; unsignedint receive_mask; constunsignedint *prop;
if (!np) {
dev_err(&dev->dev, "Device OF-Node is NULL"); return -EFAULT;
}
/* Allocate the message register array upon the first device * registered.
*/ if (!mpic_msgrs) {
mpic_msgr_count = mpic_msgr_number_of_registers();
dev_info(&dev->dev, "Found %d message registers\n",
mpic_msgr_count);
mpic_msgrs = kcalloc(mpic_msgr_count, sizeof(*mpic_msgrs),
GFP_KERNEL); if (!mpic_msgrs) {
dev_err(&dev->dev, "No memory for message register blocks\n"); return -ENOMEM;
}
}
dev_info(&dev->dev, "Of-device full name %pOF\n", np);
/* IO map the message register block. */
of_address_to_resource(np, 0, &rsrc);
msgr_block_addr = devm_ioremap(&dev->dev, rsrc.start, resource_size(&rsrc)); if (!msgr_block_addr) {
dev_err(&dev->dev, "Failed to iomap MPIC message registers"); return -EFAULT;
}
/* Ensure the block has a defined order. */
block_number = mpic_msgr_block_number(np); if (block_number < 0) {
dev_err(&dev->dev, "Failed to find message register block alias\n"); return -ENODEV;
}
dev_info(&dev->dev, "Setting up message register block %d\n",
block_number);
/* Grab the receive mask which specifies what registers can receive * interrupts.
*/
prop = of_get_property(np, "mpic-msgr-receive-mask", NULL);
receive_mask = (prop) ? *prop : 0xF;
/* Build up the appropriate message register data structures. */ for (i = 0, irq_index = 0; i < MPIC_MSGR_REGISTERS_PER_BLOCK; ++i) { struct mpic_msgr *msgr; unsignedint reg_number;
msgr = kzalloc(sizeof(struct mpic_msgr), GFP_KERNEL); if (!msgr) {
dev_err(&dev->dev, "No memory for message register\n"); return -ENOMEM;
}
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.