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

Commit 924e7a9f authored by Jamie Iles's avatar Jamie Iles Committed by Grant Likely
Browse files

basic_mmio_gpio: allow overriding number of gpio



Some platforms may have a number of GPIO that is less than the register
width of the peripheral.

Signed-off-by: default avatarJamie Iles <jamie@jamieiles.com>
Acked-by: default avatarAnton Vorontsov <cbouatmailru@gmail.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 4ddb8ae2
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -239,6 +239,7 @@ static int __devinit bgpio_probe(struct platform_device *pdev)
	resource_size_t dat_sz;
	int bits;
	int ret;
	int ngpio;

	res_dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
	if (!res_dat)
@@ -249,6 +250,7 @@ static int __devinit bgpio_probe(struct platform_device *pdev)
		return -EINVAL;

	bits = dat_sz * 8;
	ngpio = bits;
	if (bits > BITS_PER_LONG)
		return -EINVAL;

@@ -277,13 +279,22 @@ static int __devinit bgpio_probe(struct platform_device *pdev)

	spin_lock_init(&bgc->lock);

	if (pdata) {
		bgc->gc.base = pdata->base;
		if (pdata->ngpio > 0)
			ngpio = pdata->ngpio;
	} else {
		bgc->gc.base = -1;
	}

	bgc->bits = bits;
	ret = bgpio_setup_accessors(pdev, bgc);
	if (ret)
		return ret;

	bgc->data = bgc->read_reg(bgc->reg_dat);
	bgc->gc.ngpio = bits;

	bgc->gc.ngpio = ngpio;
	bgc->gc.direction_input = bgpio_dir_in;
	bgc->gc.direction_output = bgpio_dir_out;
	bgc->gc.get = bgpio_get;
@@ -291,11 +302,6 @@ static int __devinit bgpio_probe(struct platform_device *pdev)
	bgc->gc.dev = dev;
	bgc->gc.label = dev_name(dev);

	if (pdata)
		bgc->gc.base = pdata->base;
	else
		bgc->gc.base = -1;

	platform_set_drvdata(pdev, bgc);

	ret = gpiochip_add(&bgc->gc);
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@

struct bgpio_pdata {
	int base;
	int ngpio;
};

#endif /* __BASIC_MMIO_GPIO_H */