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

Commit 9f757f41 authored by Federico Vaga's avatar Federico Vaga Committed by Greg Kroah-Hartman
Browse files

drivers/fmc: hide fmc operations behind helpers



This gave us more freedom to change/add/remove operations without
recompiling all device driver.

Typically, Carrier board implement the fmc operations, so they will not
use these helpers.

Signed-off-by: default avatarFederico Vaga <federico.vaga@cern.ch>
Tested-by: default avatarPat Riehecky <riehecky@fnal.gov>
Acked-by: default avatarAlessandro Rubini <rubini@gnudd.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8e12381b
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -129,8 +129,7 @@ static int fc_probe(struct fmc_device *fmc)

	struct fc_instance *fc;

	if (fmc->op->validate)
		index = fmc->op->validate(fmc, &fc_drv);
	index = fmc_validate(fmc, &fc_drv);
	if (index < 0)
		return -EINVAL; /* not our device: invalid */

+55 −0
Original line number Diff line number Diff line
@@ -118,6 +118,61 @@ static struct bin_attribute fmc_eeprom_attr = {
	.write = fmc_write_eeprom,
};

int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h,
		    char *name, int flags)
{
	if (fmc->op->irq_request)
		return fmc->op->irq_request(fmc, h, name, flags);
	return -EPERM;
}
EXPORT_SYMBOL(fmc_irq_request);

void fmc_irq_free(struct fmc_device *fmc)
{
	if (fmc->op->irq_free)
		fmc->op->irq_free(fmc);
}
EXPORT_SYMBOL(fmc_irq_free);

void fmc_irq_ack(struct fmc_device *fmc)
{
	if (likely(fmc->op->irq_ack))
		fmc->op->irq_ack(fmc);
}
EXPORT_SYMBOL(fmc_irq_ack);

int fmc_validate(struct fmc_device *fmc, struct fmc_driver *drv)
{
	if (fmc->op->validate)
		return fmc->op->validate(fmc, drv);
	return -EPERM;
}
EXPORT_SYMBOL(fmc_validate);

int fmc_gpio_config(struct fmc_device *fmc, struct fmc_gpio *gpio, int ngpio)
{
	if (fmc->op->gpio_config)
		return fmc->op->gpio_config(fmc, gpio, ngpio);
	return -EPERM;
}
EXPORT_SYMBOL(fmc_gpio_config);

int fmc_read_ee(struct fmc_device *fmc, int pos, void *d, int l)
{
	if (fmc->op->read_ee)
		return fmc->op->read_ee(fmc, pos, d, l);
	return -EPERM;
}
EXPORT_SYMBOL(fmc_read_ee);

int fmc_write_ee(struct fmc_device *fmc, int pos, const void *d, int l)
{
	if (fmc->op->write_ee)
		return fmc->op->write_ee(fmc, pos, d, l);
	return -EPERM;
}
EXPORT_SYMBOL(fmc_write_ee);

/*
 * Functions for client modules follow
 */
+1 −1
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ int fmc_fill_id_info(struct fmc_device *fmc)
		if (!fmc->eeprom)
			return -ENOMEM;
		allocated = 1;
		ret = fmc->op->read_ee(fmc, 0, fmc->eeprom, fmc->eeprom_len);
		ret = fmc_read_ee(fmc, 0, fmc->eeprom, fmc->eeprom_len);
		if (ret < 0)
			goto out;
	}
+8 −12
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ static irqreturn_t t_handler(int irq, void *dev_id)
{
	struct fmc_device *fmc = dev_id;

	fmc->op->irq_ack(fmc);
	fmc_irq_ack(fmc);
	dev_info(&fmc->dev, "received irq %i\n", irq);
	return IRQ_HANDLED;
}
@@ -46,25 +46,21 @@ static int t_probe(struct fmc_device *fmc)
	int ret;
	int index = 0;

	if (fmc->op->validate)
		index = fmc->op->validate(fmc, &t_drv);
	index = fmc_validate(fmc, &t_drv);
	if (index < 0)
		return -EINVAL; /* not our device: invalid */

	ret = fmc->op->irq_request(fmc, t_handler, "fmc-trivial", IRQF_SHARED);
	ret = fmc_irq_request(fmc, t_handler, "fmc-trivial", IRQF_SHARED);
	if (ret < 0)
		return ret;
	/* ignore error code of call below, we really don't care */
	fmc->op->gpio_config(fmc, t_gpio, ARRAY_SIZE(t_gpio));
	fmc_gpio_config(fmc, t_gpio, ARRAY_SIZE(t_gpio));

	/* Reprogram, if asked to. ESRCH == no filename specified */
	ret = -ESRCH;
	if (fmc->op->reprogram)
		ret = fmc->op->reprogram(fmc, &t_drv, "");
	if (ret == -ESRCH)
	ret = fmc_reprogram(fmc, &t_drv, "", 0);
	if (ret == -EPERM) /* programming not supported */
		ret = 0;
	if (ret < 0)
		fmc->op->irq_free(fmc);
		fmc_irq_free(fmc);

	/* FIXME: reprogram LM32 too */
	return ret;
@@ -72,7 +68,7 @@ static int t_probe(struct fmc_device *fmc)

static int t_remove(struct fmc_device *fmc)
{
	fmc->op->irq_free(fmc);
	fmc_irq_free(fmc);
	return 0;
}

+4 −4
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ static int fwe_run_tlv(struct fmc_device *fmc, const struct firmware *fw,
		if (write) {
			dev_info(&fmc->dev, "write %i bytes at 0x%04x\n",
				 thislen, thisaddr);
			err = fmc->op->write_ee(fmc, thisaddr, p + 5, thislen);
			err = fmc_write_ee(fmc, thisaddr, p + 5, thislen);
		}
		if (err < 0) {
			dev_err(&fmc->dev, "write failure @0x%04x\n",
@@ -70,7 +70,7 @@ static int fwe_run_bin(struct fmc_device *fmc, const struct firmware *fw)
	int ret;

	dev_info(&fmc->dev, "programming %zi bytes\n", fw->size);
	ret = fmc->op->write_ee(fmc, 0, (void *)fw->data, fw->size);
	ret = fmc_write_ee(fmc, 0, (void *)fw->data, fw->size);
	if (ret < 0) {
		dev_info(&fmc->dev, "write_eeprom: error %i\n", ret);
		return ret;
@@ -115,8 +115,8 @@ static int fwe_probe(struct fmc_device *fmc)
			KBUILD_MODNAME);
		return -ENODEV;
	}
	if (fmc->op->validate)
		index = fmc->op->validate(fmc, &fwe_drv);

	index = fmc_validate(fmc, &fwe_drv);
	if (index < 0) {
		pr_err("%s: refusing device \"%s\"\n", KBUILD_MODNAME,
		       dev_name(dev));
Loading