Unverified Commit 4cb59d50 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

Merge tag 'hisi-drivers-for-6.1' of https://github.com/hisilicon/linux-hisi into arm/drivers

HiSilicon driver updates for 6.1:
- some small improvements to the hisi_lpc driver

* tag 'hisi-drivers-for-6.1' of https://github.com/hisilicon/linux-hisi:
  bus: hisi_lpc: Use platform_device_register_full()
  bus: hisi_lpc: Don't guard ACPI IDs with ACPI_PTR()
  bus: hisi_lpc: Correct error code for timeout
  bus: hisi_lpc: Use devm_platform_ioremap_resource
  bus: hisi_lpc: Don't dereference fwnode handle

Link: https://lore.kernel.org/r/631FE463.6070701@hisilicon.com


Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 37d49c24 4678a2d3
Loading
Loading
Loading
Loading
+44 −52
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ static int wait_lpc_idle(void __iomem *mbase, unsigned int waitcnt)
		ndelay(LPC_NSEC_PERWAIT);
	} while (--waitcnt);

	return -ETIME;
	return -ETIMEDOUT;
}

/*
@@ -347,7 +347,7 @@ static int hisi_lpc_acpi_xlat_io_res(struct acpi_device *adev,
	unsigned long sys_port;
	resource_size_t len = resource_size(res);

	sys_port = logic_pio_trans_hwaddr(&host->fwnode, res->start, len);
	sys_port = logic_pio_trans_hwaddr(acpi_fwnode_handle(host), res->start, len);
	if (sys_port == ~0UL)
		return -EFAULT;

@@ -472,9 +472,7 @@ static int hisi_lpc_acpi_clear_enumerated(struct acpi_device *adev, void *not_us

struct hisi_lpc_acpi_cell {
	const char *hid;
	const char *name;
	void *pdata;
	size_t pdata_size;
	const struct platform_device_info *pdevinfo;
};

static void hisi_lpc_acpi_remove(struct device *hostdev)
@@ -505,13 +503,29 @@ static int hisi_lpc_acpi_add_child(struct acpi_device *child, void *data)
		/* ipmi */
		{
			.hid = "IPI0001",
			.pdevinfo = (struct platform_device_info []) {
				{
					.parent = hostdev,
					.fwnode = acpi_fwnode_handle(child),
					.name = "hisi-lpc-ipmi",
					.id = PLATFORM_DEVID_AUTO,
					.res = res,
					.num_res = num_res,
				},
			},
		},
		/* 8250-compatible uart */
		{
			.hid = "HISI1031",
			.pdevinfo = (struct platform_device_info []) {
				{
					.parent = hostdev,
					.fwnode = acpi_fwnode_handle(child),
					.name = "serial8250",
			.pdata = (struct plat_serial8250_port []) {
					.id = PLATFORM_DEVID_AUTO,
					.res = res,
					.num_res = num_res,
					.data = (struct plat_serial8250_port []) {
						{
							.iobase = res->start,
							.uartclk = 1843200,
@@ -520,13 +534,14 @@ static int hisi_lpc_acpi_add_child(struct acpi_device *child, void *data)
						},
						{}
					},
			.pdata_size = 2 *
				sizeof(struct plat_serial8250_port),
					.size_data =  2 * sizeof(struct plat_serial8250_port),
				},
			},
		},
		{}
	};

	for (; cell && cell->name; cell++) {
	for (; cell && cell->hid; cell++) {
		if (!strcmp(cell->hid, hid)) {
			found = true;
			break;
@@ -540,31 +555,12 @@ static int hisi_lpc_acpi_add_child(struct acpi_device *child, void *data)
		return 0;
	}

	pdev = platform_device_alloc(cell->name, PLATFORM_DEVID_AUTO);
	if (!pdev)
		return -ENOMEM;

	pdev->dev.parent = hostdev;
	ACPI_COMPANION_SET(&pdev->dev, child);

	ret = platform_device_add_resources(pdev, res, num_res);
	if (ret)
		goto fail;

	ret = platform_device_add_data(pdev, cell->pdata, cell->pdata_size);
	if (ret)
		goto fail;

	ret = platform_device_add(pdev);
	if (ret)
		goto fail;
	pdev = platform_device_register_full(cell->pdevinfo);
	if (IS_ERR(pdev))
		return PTR_ERR(pdev);

	acpi_device_set_enumerated(child);
	return 0;

fail:
	platform_device_put(pdev);
	return ret;
}

/*
@@ -589,11 +585,6 @@ static int hisi_lpc_acpi_probe(struct device *hostdev)

	return ret;
}

static const struct acpi_device_id hisi_lpc_acpi_match[] = {
	{"HISI0191"},
	{}
};
#else
static int hisi_lpc_acpi_probe(struct device *dev)
{
@@ -615,11 +606,9 @@ static void hisi_lpc_acpi_remove(struct device *hostdev)
static int hisi_lpc_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct acpi_device *acpi_device = ACPI_COMPANION(dev);
	struct logic_pio_hwaddr *range;
	struct hisi_lpc_dev *lpcdev;
	resource_size_t io_end;
	struct resource *res;
	int ret;

	lpcdev = devm_kzalloc(dev, sizeof(*lpcdev), GFP_KERNEL);
@@ -628,8 +617,7 @@ static int hisi_lpc_probe(struct platform_device *pdev)

	spin_lock_init(&lpcdev->cycle_lock);

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	lpcdev->membase = devm_ioremap_resource(dev, res);
	lpcdev->membase = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(lpcdev->membase))
		return PTR_ERR(lpcdev->membase);

@@ -637,7 +625,7 @@ static int hisi_lpc_probe(struct platform_device *pdev)
	if (!range)
		return -ENOMEM;

	range->fwnode = dev->fwnode;
	range->fwnode = dev_fwnode(dev);
	range->flags = LOGIC_PIO_INDIRECT;
	range->size = PIO_INDIRECT_SIZE;
	range->hostdata = lpcdev;
@@ -651,7 +639,7 @@ static int hisi_lpc_probe(struct platform_device *pdev)
	}

	/* register the LPC host PIO resources */
	if (acpi_device)
	if (is_acpi_device_node(range->fwnode))
		ret = hisi_lpc_acpi_probe(dev);
	else
		ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
@@ -672,11 +660,10 @@ static int hisi_lpc_probe(struct platform_device *pdev)
static int hisi_lpc_remove(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct acpi_device *acpi_device = ACPI_COMPANION(dev);
	struct hisi_lpc_dev *lpcdev = dev_get_drvdata(dev);
	struct logic_pio_hwaddr *range = lpcdev->io_host;

	if (acpi_device)
	if (is_acpi_device_node(range->fwnode))
		hisi_lpc_acpi_remove(dev);
	else
		of_platform_depopulate(dev);
@@ -692,11 +679,16 @@ static const struct of_device_id hisi_lpc_of_match[] = {
	{}
};

static const struct acpi_device_id hisi_lpc_acpi_match[] = {
	{"HISI0191"},
	{}
};

static struct platform_driver hisi_lpc_driver = {
	.driver = {
		.name           = DRV_NAME,
		.of_match_table = hisi_lpc_of_match,
		.acpi_match_table = ACPI_PTR(hisi_lpc_acpi_match),
		.acpi_match_table = hisi_lpc_acpi_match,
	},
	.probe = hisi_lpc_probe,
	.remove = hisi_lpc_remove,