Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e26b2f40 authored by John Garry's avatar John Garry Committed by Martin K. Petersen
Browse files

hisi_sas: Scan device tree



Scan the device tree for all properties. Also do this:

- do ioremap for SAS registers
- allocate memory for interrupt names

Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7eb7869f
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,8 @@
#define HISI_SAS_MAX_DEVICES HISI_SAS_MAX_ITCT_ENTRIES
#define HISI_SAS_MAX_DEVICES HISI_SAS_MAX_ITCT_ENTRIES
#define HISI_SAS_COMMAND_ENTRIES 8192
#define HISI_SAS_COMMAND_ENTRIES 8192


#define HISI_SAS_NAME_LEN 32

struct hisi_sas_phy {
struct hisi_sas_phy {
	struct asd_sas_phy	sas_phy;
	struct asd_sas_phy	sas_phy;
};
};
@@ -44,6 +46,11 @@ struct hisi_hba {
	struct sas_ha_struct *p;
	struct sas_ha_struct *p;


	struct platform_device *pdev;
	struct platform_device *pdev;
	void __iomem *regs;
	struct regmap *ctrl;
	u32 ctrl_reset_reg;
	u32 ctrl_reset_sts_reg;
	u32 ctrl_clock_ena_reg;
	u8 sas_addr[SAS_ADDR_SIZE];
	u8 sas_addr[SAS_ADDR_SIZE];


	int n_phy;
	int n_phy;
@@ -53,6 +60,9 @@ struct hisi_hba {
	struct Scsi_Host *shost;
	struct Scsi_Host *shost;
	struct hisi_sas_phy phy[HISI_SAS_MAX_PHYS];
	struct hisi_sas_phy phy[HISI_SAS_MAX_PHYS];
	struct hisi_sas_port port[HISI_SAS_MAX_PHYS];
	struct hisi_sas_port port[HISI_SAS_MAX_PHYS];

	int	queue_count;
	char	*int_names;
	const struct hisi_sas_hw *hw;	/* Low level hw interface */
	const struct hisi_sas_hw *hw;	/* Low level hw interface */
};
};


+44 −1
Original line number Original line Diff line number Diff line
@@ -39,9 +39,13 @@ static struct sas_domain_function_template hisi_sas_transport_ops = {
static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
					      const struct hisi_sas_hw *hw)
					      const struct hisi_sas_hw *hw)
{
{
	struct resource *res;
	struct Scsi_Host *shost;
	struct Scsi_Host *shost;
	struct hisi_hba *hisi_hba;
	struct hisi_hba *hisi_hba;
	struct device *dev = &pdev->dev;
	struct device *dev = &pdev->dev;
	struct device_node *np = pdev->dev.of_node;
	struct property *sas_addr_prop;
	int num;


	shost = scsi_host_alloc(&hisi_sas_sht, sizeof(*hisi_hba));
	shost = scsi_host_alloc(&hisi_sas_sht, sizeof(*hisi_hba));
	if (!shost)
	if (!shost)
@@ -53,6 +57,46 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
	hisi_hba->shost = shost;
	hisi_hba->shost = shost;
	SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;
	SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;


	sas_addr_prop = of_find_property(np, "sas-addr", NULL);
	if (!sas_addr_prop || (sas_addr_prop->length != SAS_ADDR_SIZE))
		goto err_out;
	memcpy(hisi_hba->sas_addr, sas_addr_prop->value, SAS_ADDR_SIZE);

	if (of_property_read_u32(np, "ctrl-reset-reg",
				 &hisi_hba->ctrl_reset_reg))
		goto err_out;

	if (of_property_read_u32(np, "ctrl-reset-sts-reg",
				 &hisi_hba->ctrl_reset_sts_reg))
		goto err_out;

	if (of_property_read_u32(np, "ctrl-clock-ena-reg",
				 &hisi_hba->ctrl_clock_ena_reg))
		goto err_out;

	if (of_property_read_u32(np, "phy-count", &hisi_hba->n_phy))
		goto err_out;

	if (of_property_read_u32(np, "queue-count", &hisi_hba->queue_count))
		goto err_out;

	num = of_irq_count(np);
	hisi_hba->int_names = devm_kcalloc(dev, num,
					   HISI_SAS_NAME_LEN,
					   GFP_KERNEL);
	if (!hisi_hba->int_names)
		goto err_out;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	hisi_hba->regs = devm_ioremap_resource(dev, res);
	if (IS_ERR(hisi_hba->regs))
		goto err_out;

	hisi_hba->ctrl = syscon_regmap_lookup_by_phandle(
				np, "hisilicon,sas-syscon");
	if (IS_ERR(hisi_hba->ctrl))
		goto err_out;

	return shost;
	return shost;
err_out:
err_out:
	dev_err(dev, "shost alloc failed\n");
	dev_err(dev, "shost alloc failed\n");
@@ -79,7 +123,6 @@ int hisi_sas_probe(struct platform_device *pdev,
	sha = SHOST_TO_SAS_HA(shost);
	sha = SHOST_TO_SAS_HA(shost);
	hisi_hba = shost_priv(shost);
	hisi_hba = shost_priv(shost);
	platform_set_drvdata(pdev, sha);
	platform_set_drvdata(pdev, sha);
	hisi_hba->n_phy = HISI_SAS_MAX_PHYS;
	phy_nr = port_nr = hisi_hba->n_phy;
	phy_nr = port_nr = hisi_hba->n_phy;


	arr_phy = devm_kcalloc(dev, phy_nr, sizeof(void *), GFP_KERNEL);
	arr_phy = devm_kcalloc(dev, phy_nr, sizeof(void *), GFP_KERNEL);