On Fri, Jan 23, 2015 at 12:46 AM, Javier Martinez Canillas <javier.martinez@xxxxxxxxxxxxxxx> wrote: > From: Bill Richardson <wfrichar@xxxxxxxxxxxx> > > Chromebooks have an Embedded Controller (EC) that is used to > implement various functions such as keyboard, power and battery. > > The AP can communicate with the EC through different bus types > such as I2C, SPI or LPC. > > The cros_ec mfd driver is then composed of a core driver that > register the sub-devices as mfd cells and provide a high level > communication interface that is used by the rest of the kernel > and bus specific interfaces modules. > > Each connection method then has its own driver, which register > with the EC driver interface-agnostic interface. > > Currently, there are drivers to communicate with the EC over > I2C and SPI and this driver adds support for LPC. > > Signed-off-by: Bill Richardson <wfrichar@xxxxxxxxxxxx> > Signed-off-by: Javier Martinez Canillas <javier.martinez@xxxxxxxxxxxxxxx> > --- > > Changes since v2: > - Move out from drivers/mfd to drivers/misc. Suggested by Lee Jones. > > Changes since v1: None, new patch. > --- > drivers/misc/Kconfig | 10 ++ > drivers/misc/Makefile | 1 + > drivers/misc/cros_ec_lpc.c | 306 +++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 317 insertions(+) > create mode 100644 drivers/misc/cros_ec_lpc.c (...) > +static int cros_ec_lpc_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct cros_ec_device *ec_dev; > + int err = -ENOTTY; > + > + if (!request_region(EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE, MYNAME)) { Why dont you use devres API for request_region()... Then maximum of your goto label regarding release region will gone... > + dev_warn(dev, "couldn't reserve memmap region\n"); > + goto failed_memmap; > + } > + > + if ((inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID) != 'E') || > + (inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID + 1) != 'C')) { > + dev_warn(dev, "EC ID not detected\n"); > + goto failed_ec_probe; > + } > + > + if (!request_region(EC_HOST_CMD_REGION0, EC_HOST_CMD_REGION_SIZE, > + MYNAME)) { same... > + dev_warn(dev, "couldn't reserve region0\n"); > + goto failed_region0; > + } > + if (!request_region(EC_HOST_CMD_REGION1, EC_HOST_CMD_REGION_SIZE, > + MYNAME)) { same ... > + dev_warn(dev, "couldn't reserve region1\n"); > + goto failed_region1; > + } > + > + ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL); > + if (!ec_dev) { > + err = -ENOMEM; > + goto failed_ec_dev; > + } > + > + platform_set_drvdata(pdev, ec_dev); > + ec_dev->dev = dev; > + ec_dev->ec_name = pdev->name; > + ec_dev->phys_name = dev_name(dev); > + ec_dev->parent = dev; > + ec_dev->cmd_xfer = cros_ec_cmd_xfer_lpc; > + ec_dev->cmd_readmem = cros_ec_lpc_readmem; > + > + err = cros_ec_register(ec_dev); > + if (err) { > + dev_warn(dev, "couldn't register ec_dev\n"); > + goto failed_ec_dev; > + } > + > + return 0; > + > +failed_ec_dev: > + release_region(EC_HOST_CMD_REGION1, EC_HOST_CMD_REGION_SIZE); > +failed_region1: > + release_region(EC_HOST_CMD_REGION0, EC_HOST_CMD_REGION_SIZE); > +failed_region0: > +failed_ec_probe: > + release_region(EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE); All these goto labels will be gone if you use devres API.. > +failed_memmap: > + return err; > +} > + > +static int cros_ec_lpc_remove(struct platform_device *pdev) > +{ > + struct cros_ec_device *ec_dev; > + > + ec_dev = platform_get_drvdata(pdev); > + cros_ec_remove(ec_dev); > + > + release_region(EC_HOST_CMD_REGION1, EC_HOST_CMD_REGION_SIZE); > + release_region(EC_HOST_CMD_REGION0, EC_HOST_CMD_REGION_SIZE); > + release_region(EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE); > + These also will be gone.... -- Thanks and Regards, Varka Bhadram. -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html