static int sprom_do_write()

in pci.c [281:325]


static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)
{
	struct pci_dev *pdev = bus->host_pci;
	int i, err;
	u32 spromctl;
	u16 size = bus->sprom_size;

	pr_notice("Writing SPROM. Do NOT turn off the power! Please stand by...\n");
	err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl);
	if (err)
		goto err_ctlreg;
	spromctl |= SSB_SPROMCTL_WE;
	err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl);
	if (err)
		goto err_ctlreg;
	pr_notice("[ 0%%");
	msleep(500);
	for (i = 0; i < size; i++) {
		if (i == size / 4)
			pr_cont("25%%");
		else if (i == size / 2)
			pr_cont("50%%");
		else if (i == (size * 3) / 4)
			pr_cont("75%%");
		else if (i % 2)
			pr_cont(".");
		writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2));
		msleep(20);
	}
	err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl);
	if (err)
		goto err_ctlreg;
	spromctl &= ~SSB_SPROMCTL_WE;
	err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl);
	if (err)
		goto err_ctlreg;
	msleep(500);
	pr_cont("100%% ]\n");
	pr_notice("SPROM written\n");

	return 0;
err_ctlreg:
	pr_err("Could not access SPROM control register.\n");
	return err;
}