Lines Matching +full:four +full:- +full:cell

1 // SPDX-License-Identifier: GPL-2.0+
22 #define DRV_NAME "hisi-lpc"
42 /* The max IO cycle counts supported is four per operation at maximum */
84 return (status & LPC_REG_OP_STATUS_FINISHED) ? 0 : -EIO; in wait_lpc_idle()
86 } while (--waitcnt); in wait_lpc_idle()
88 return -ETIME; in wait_lpc_idle()
92 * hisi_lpc_target_in - trigger a series of LPC cycles for read operation
99 * Returns 0 on success, non-zero on fail.
110 if (!buf || !opcnt || !para || !para->csize || !lpcdev) in hisi_lpc_target_in()
111 return -EINVAL; in hisi_lpc_target_in()
115 if (!(para->opflags & FG_INCRADDR_LPC)) { in hisi_lpc_target_in()
121 spin_lock_irqsave(&lpcdev->cycle_lock, flags); in hisi_lpc_target_in()
123 writel_relaxed(opcnt, lpcdev->membase + LPC_REG_OP_LEN); in hisi_lpc_target_in()
124 writel_relaxed(cmd_word, lpcdev->membase + LPC_REG_CMD); in hisi_lpc_target_in()
125 writel_relaxed(addr, lpcdev->membase + LPC_REG_ADDR); in hisi_lpc_target_in()
128 lpcdev->membase + LPC_REG_STARTUP_SIGNAL); in hisi_lpc_target_in()
131 ret = wait_lpc_idle(lpcdev->membase, waitcnt); in hisi_lpc_target_in()
133 spin_unlock_irqrestore(&lpcdev->cycle_lock, flags); in hisi_lpc_target_in()
137 readsb(lpcdev->membase + LPC_REG_RDATA, buf, opcnt); in hisi_lpc_target_in()
139 spin_unlock_irqrestore(&lpcdev->cycle_lock, flags); in hisi_lpc_target_in()
145 * hisi_lpc_target_out - trigger a series of LPC cycles for write operation
152 * Returns 0 on success, non-zero on fail.
164 return -EINVAL; in hisi_lpc_target_out()
169 if (!(para->opflags & FG_INCRADDR_LPC)) { in hisi_lpc_target_out()
174 spin_lock_irqsave(&lpcdev->cycle_lock, flags); in hisi_lpc_target_out()
176 writel_relaxed(opcnt, lpcdev->membase + LPC_REG_OP_LEN); in hisi_lpc_target_out()
177 writel_relaxed(cmd_word, lpcdev->membase + LPC_REG_CMD); in hisi_lpc_target_out()
178 writel_relaxed(addr, lpcdev->membase + LPC_REG_ADDR); in hisi_lpc_target_out()
180 writesb(lpcdev->membase + LPC_REG_WDATA, buf, opcnt); in hisi_lpc_target_out()
183 lpcdev->membase + LPC_REG_STARTUP_SIGNAL); in hisi_lpc_target_out()
186 ret = wait_lpc_idle(lpcdev->membase, waitcnt); in hisi_lpc_target_out()
188 spin_unlock_irqrestore(&lpcdev->cycle_lock, flags); in hisi_lpc_target_out()
196 return pio - lpcdev->io_host->io_start + lpcdev->io_host->hw_start; in hisi_lpc_pio_to_addr()
200 * hisi_lpc_comm_in - input the data in a single operation
232 * hisi_lpc_comm_out - output the data in a single operation
235 * @val: a value to be output from caller, maximum is four bytes
262 * hisi_lpc_comm_ins - input the data in the buffer in multiple operations
270 * Returns 0 on success, -errno otherwise.
281 return -EINVAL; in hisi_lpc_comm_ins()
297 } while (--count); in hisi_lpc_comm_ins()
303 * hisi_lpc_comm_outs - output the data in the buffer in multiple operations
332 } while (--count); in hisi_lpc_comm_outs()
350 sys_port = logic_pio_trans_hwaddr(&host->fwnode, res->start, len); in hisi_lpc_acpi_xlat_io_res()
352 return -EFAULT; in hisi_lpc_acpi_xlat_io_res()
354 res->start = sys_port; in hisi_lpc_acpi_xlat_io_res()
355 res->end = sys_port + len; in hisi_lpc_acpi_xlat_io_res()
368 if (r->end != 0x3fff) in hisi_lpc_acpi_fixup_child_resource()
371 if (r->start == 0xe4) in hisi_lpc_acpi_fixup_child_resource()
372 r->end = 0xe4 + 0x04 - 1; in hisi_lpc_acpi_fixup_child_resource()
373 else if (r->start == 0x2f8) in hisi_lpc_acpi_fixup_child_resource()
374 r->end = 0x2f8 + 0x08 - 1; in hisi_lpc_acpi_fixup_child_resource()
381 * hisi_lpc_acpi_set_io_res - set the resources for a child
390 * host-relative address resource. This function will return the translated
406 return -EINVAL; in hisi_lpc_acpi_set_io_res()
411 if (!adev->status.present) { in hisi_lpc_acpi_set_io_res()
413 return -EIO; in hisi_lpc_acpi_set_io_res()
418 return -EIO; in hisi_lpc_acpi_set_io_res()
429 return count ? count : -EIO; in hisi_lpc_acpi_set_io_res()
438 return -ENOMEM; in hisi_lpc_acpi_set_io_res()
442 resources[count] = *rentry->res; in hisi_lpc_acpi_set_io_res()
488 list_for_each_entry(child, &adev->children, node) in hisi_lpc_acpi_remove()
493 * hisi_lpc_acpi_probe - probe children for ACPI FW
509 list_for_each_entry(child, &adev->children, node) { in hisi_lpc_acpi_probe()
511 const struct hisi_lpc_acpi_cell *cell; in hisi_lpc_acpi_probe() local
517 ret = hisi_lpc_acpi_set_io_res(&child->dev, &adev->dev, &res, in hisi_lpc_acpi_probe()
524 cell = (struct hisi_lpc_acpi_cell []){ in hisi_lpc_acpi_probe()
528 .name = "hisi-lpc-ipmi", in hisi_lpc_acpi_probe()
530 /* 8250-compatible uart */ in hisi_lpc_acpi_probe()
536 .iobase = res->start, in hisi_lpc_acpi_probe()
549 for (; cell && cell->name; cell++) { in hisi_lpc_acpi_probe()
550 if (!strcmp(cell->hid, hid)) { in hisi_lpc_acpi_probe()
558 "could not find cell for child device (%s), discarding\n", in hisi_lpc_acpi_probe()
563 pdev = platform_device_alloc(cell->name, PLATFORM_DEVID_AUTO); in hisi_lpc_acpi_probe()
565 ret = -ENOMEM; in hisi_lpc_acpi_probe()
569 pdev->dev.parent = hostdev; in hisi_lpc_acpi_probe()
570 ACPI_COMPANION_SET(&pdev->dev, child); in hisi_lpc_acpi_probe()
576 ret = platform_device_add_data(pdev, cell->pdata, in hisi_lpc_acpi_probe()
577 cell->pdata_size); in hisi_lpc_acpi_probe()
602 return -ENODEV; in hisi_lpc_acpi_probe()
611 * hisi_lpc_probe - the probe callback function for hisi lpc host,
615 * Returns 0 on success, non-zero on fail.
619 struct device *dev = &pdev->dev; in hisi_lpc_probe()
629 return -ENOMEM; in hisi_lpc_probe()
631 spin_lock_init(&lpcdev->cycle_lock); in hisi_lpc_probe()
634 lpcdev->membase = devm_ioremap_resource(dev, res); in hisi_lpc_probe()
635 if (IS_ERR(lpcdev->membase)) in hisi_lpc_probe()
636 return PTR_ERR(lpcdev->membase); in hisi_lpc_probe()
640 return -ENOMEM; in hisi_lpc_probe()
642 range->fwnode = dev->fwnode; in hisi_lpc_probe()
643 range->flags = LOGIC_PIO_INDIRECT; in hisi_lpc_probe()
644 range->size = PIO_INDIRECT_SIZE; in hisi_lpc_probe()
645 range->hostdata = lpcdev; in hisi_lpc_probe()
646 range->ops = &hisi_lpc_ops; in hisi_lpc_probe()
647 lpcdev->io_host = range; in hisi_lpc_probe()
659 ret = of_platform_populate(dev->of_node, NULL, NULL, dev); in hisi_lpc_probe()
667 io_end = lpcdev->io_host->io_start + lpcdev->io_host->size; in hisi_lpc_probe()
668 dev_info(dev, "registered range [%pa - %pa]\n", in hisi_lpc_probe()
669 &lpcdev->io_host->io_start, &io_end); in hisi_lpc_probe()
676 struct device *dev = &pdev->dev; in hisi_lpc_remove()
679 struct logic_pio_hwaddr *range = lpcdev->io_host; in hisi_lpc_remove()
692 { .compatible = "hisilicon,hip06-lpc", },
693 { .compatible = "hisilicon,hip07-lpc", },