Linux Audio

Check our new training course

Yocto distribution development and maintenance

Need a Yocto distribution for your embedded project?
Loading...
Note: File does not exist in v3.1.
   1/*
   2 * nvmem framework core.
   3 *
   4 * Copyright (C) 2015 Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
   5 * Copyright (C) 2013 Maxime Ripard <maxime.ripard@free-electrons.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 and
   9 * only version 2 as published by the Free Software Foundation.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 */
  16
  17#include <linux/device.h>
  18#include <linux/export.h>
  19#include <linux/fs.h>
  20#include <linux/idr.h>
  21#include <linux/init.h>
  22#include <linux/module.h>
  23#include <linux/nvmem-consumer.h>
  24#include <linux/nvmem-provider.h>
  25#include <linux/of.h>
  26#include <linux/slab.h>
  27
  28struct nvmem_device {
  29	const char		*name;
  30	struct module		*owner;
  31	struct device		dev;
  32	int			stride;
  33	int			word_size;
  34	int			ncells;
  35	int			id;
  36	int			users;
  37	size_t			size;
  38	bool			read_only;
  39	int			flags;
  40	struct bin_attribute	eeprom;
  41	struct device		*base_dev;
  42	nvmem_reg_read_t	reg_read;
  43	nvmem_reg_write_t	reg_write;
  44	void *priv;
  45};
  46
  47#define FLAG_COMPAT		BIT(0)
  48
  49struct nvmem_cell {
  50	const char		*name;
  51	int			offset;
  52	int			bytes;
  53	int			bit_offset;
  54	int			nbits;
  55	struct nvmem_device	*nvmem;
  56	struct list_head	node;
  57};
  58
  59static DEFINE_MUTEX(nvmem_mutex);
  60static DEFINE_IDA(nvmem_ida);
  61
  62static LIST_HEAD(nvmem_cells);
  63static DEFINE_MUTEX(nvmem_cells_mutex);
  64
  65#ifdef CONFIG_DEBUG_LOCK_ALLOC
  66static struct lock_class_key eeprom_lock_key;
  67#endif
  68
  69#define to_nvmem_device(d) container_of(d, struct nvmem_device, dev)
  70static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
  71			  void *val, size_t bytes)
  72{
  73	if (nvmem->reg_read)
  74		return nvmem->reg_read(nvmem->priv, offset, val, bytes);
  75
  76	return -EINVAL;
  77}
  78
  79static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
  80			   void *val, size_t bytes)
  81{
  82	if (nvmem->reg_write)
  83		return nvmem->reg_write(nvmem->priv, offset, val, bytes);
  84
  85	return -EINVAL;
  86}
  87
  88static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj,
  89				    struct bin_attribute *attr,
  90				    char *buf, loff_t pos, size_t count)
  91{
  92	struct device *dev;
  93	struct nvmem_device *nvmem;
  94	int rc;
  95
  96	if (attr->private)
  97		dev = attr->private;
  98	else
  99		dev = container_of(kobj, struct device, kobj);
 100	nvmem = to_nvmem_device(dev);
 101
 102	/* Stop the user from reading */
 103	if (pos >= nvmem->size)
 104		return 0;
 105
 106	if (count < nvmem->word_size)
 107		return -EINVAL;
 108
 109	if (pos + count > nvmem->size)
 110		count = nvmem->size - pos;
 111
 112	count = round_down(count, nvmem->word_size);
 113
 114	rc = nvmem_reg_read(nvmem, pos, buf, count);
 115
 116	if (rc)
 117		return rc;
 118
 119	return count;
 120}
 121
 122static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
 123				     struct bin_attribute *attr,
 124				     char *buf, loff_t pos, size_t count)
 125{
 126	struct device *dev;
 127	struct nvmem_device *nvmem;
 128	int rc;
 129
 130	if (attr->private)
 131		dev = attr->private;
 132	else
 133		dev = container_of(kobj, struct device, kobj);
 134	nvmem = to_nvmem_device(dev);
 135
 136	/* Stop the user from writing */
 137	if (pos >= nvmem->size)
 138		return 0;
 139
 140	if (count < nvmem->word_size)
 141		return -EINVAL;
 142
 143	if (pos + count > nvmem->size)
 144		count = nvmem->size - pos;
 145
 146	count = round_down(count, nvmem->word_size);
 147
 148	rc = nvmem_reg_write(nvmem, pos, buf, count);
 149
 150	if (rc)
 151		return rc;
 152
 153	return count;
 154}
 155
 156/* default read/write permissions */
 157static struct bin_attribute bin_attr_rw_nvmem = {
 158	.attr	= {
 159		.name	= "nvmem",
 160		.mode	= S_IWUSR | S_IRUGO,
 161	},
 162	.read	= bin_attr_nvmem_read,
 163	.write	= bin_attr_nvmem_write,
 164};
 165
 166static struct bin_attribute *nvmem_bin_rw_attributes[] = {
 167	&bin_attr_rw_nvmem,
 168	NULL,
 169};
 170
 171static const struct attribute_group nvmem_bin_rw_group = {
 172	.bin_attrs	= nvmem_bin_rw_attributes,
 173};
 174
 175static const struct attribute_group *nvmem_rw_dev_groups[] = {
 176	&nvmem_bin_rw_group,
 177	NULL,
 178};
 179
 180/* read only permission */
 181static struct bin_attribute bin_attr_ro_nvmem = {
 182	.attr	= {
 183		.name	= "nvmem",
 184		.mode	= S_IRUGO,
 185	},
 186	.read	= bin_attr_nvmem_read,
 187};
 188
 189static struct bin_attribute *nvmem_bin_ro_attributes[] = {
 190	&bin_attr_ro_nvmem,
 191	NULL,
 192};
 193
 194static const struct attribute_group nvmem_bin_ro_group = {
 195	.bin_attrs	= nvmem_bin_ro_attributes,
 196};
 197
 198static const struct attribute_group *nvmem_ro_dev_groups[] = {
 199	&nvmem_bin_ro_group,
 200	NULL,
 201};
 202
 203/* default read/write permissions, root only */
 204static struct bin_attribute bin_attr_rw_root_nvmem = {
 205	.attr	= {
 206		.name	= "nvmem",
 207		.mode	= S_IWUSR | S_IRUSR,
 208	},
 209	.read	= bin_attr_nvmem_read,
 210	.write	= bin_attr_nvmem_write,
 211};
 212
 213static struct bin_attribute *nvmem_bin_rw_root_attributes[] = {
 214	&bin_attr_rw_root_nvmem,
 215	NULL,
 216};
 217
 218static const struct attribute_group nvmem_bin_rw_root_group = {
 219	.bin_attrs	= nvmem_bin_rw_root_attributes,
 220};
 221
 222static const struct attribute_group *nvmem_rw_root_dev_groups[] = {
 223	&nvmem_bin_rw_root_group,
 224	NULL,
 225};
 226
 227/* read only permission, root only */
 228static struct bin_attribute bin_attr_ro_root_nvmem = {
 229	.attr	= {
 230		.name	= "nvmem",
 231		.mode	= S_IRUSR,
 232	},
 233	.read	= bin_attr_nvmem_read,
 234};
 235
 236static struct bin_attribute *nvmem_bin_ro_root_attributes[] = {
 237	&bin_attr_ro_root_nvmem,
 238	NULL,
 239};
 240
 241static const struct attribute_group nvmem_bin_ro_root_group = {
 242	.bin_attrs	= nvmem_bin_ro_root_attributes,
 243};
 244
 245static const struct attribute_group *nvmem_ro_root_dev_groups[] = {
 246	&nvmem_bin_ro_root_group,
 247	NULL,
 248};
 249
 250static void nvmem_release(struct device *dev)
 251{
 252	struct nvmem_device *nvmem = to_nvmem_device(dev);
 253
 254	ida_simple_remove(&nvmem_ida, nvmem->id);
 255	kfree(nvmem);
 256}
 257
 258static const struct device_type nvmem_provider_type = {
 259	.release	= nvmem_release,
 260};
 261
 262static struct bus_type nvmem_bus_type = {
 263	.name		= "nvmem",
 264};
 265
 266static int of_nvmem_match(struct device *dev, void *nvmem_np)
 267{
 268	return dev->of_node == nvmem_np;
 269}
 270
 271static struct nvmem_device *of_nvmem_find(struct device_node *nvmem_np)
 272{
 273	struct device *d;
 274
 275	if (!nvmem_np)
 276		return NULL;
 277
 278	d = bus_find_device(&nvmem_bus_type, NULL, nvmem_np, of_nvmem_match);
 279
 280	if (!d)
 281		return NULL;
 282
 283	return to_nvmem_device(d);
 284}
 285
 286static struct nvmem_cell *nvmem_find_cell(const char *cell_id)
 287{
 288	struct nvmem_cell *p;
 289
 290	list_for_each_entry(p, &nvmem_cells, node)
 291		if (p && !strcmp(p->name, cell_id))
 292			return p;
 293
 294	return NULL;
 295}
 296
 297static void nvmem_cell_drop(struct nvmem_cell *cell)
 298{
 299	mutex_lock(&nvmem_cells_mutex);
 300	list_del(&cell->node);
 301	mutex_unlock(&nvmem_cells_mutex);
 302	kfree(cell);
 303}
 304
 305static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem)
 306{
 307	struct nvmem_cell *cell;
 308	struct list_head *p, *n;
 309
 310	list_for_each_safe(p, n, &nvmem_cells) {
 311		cell = list_entry(p, struct nvmem_cell, node);
 312		if (cell->nvmem == nvmem)
 313			nvmem_cell_drop(cell);
 314	}
 315}
 316
 317static void nvmem_cell_add(struct nvmem_cell *cell)
 318{
 319	mutex_lock(&nvmem_cells_mutex);
 320	list_add_tail(&cell->node, &nvmem_cells);
 321	mutex_unlock(&nvmem_cells_mutex);
 322}
 323
 324static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,
 325				   const struct nvmem_cell_info *info,
 326				   struct nvmem_cell *cell)
 327{
 328	cell->nvmem = nvmem;
 329	cell->offset = info->offset;
 330	cell->bytes = info->bytes;
 331	cell->name = info->name;
 332
 333	cell->bit_offset = info->bit_offset;
 334	cell->nbits = info->nbits;
 335
 336	if (cell->nbits)
 337		cell->bytes = DIV_ROUND_UP(cell->nbits + cell->bit_offset,
 338					   BITS_PER_BYTE);
 339
 340	if (!IS_ALIGNED(cell->offset, nvmem->stride)) {
 341		dev_err(&nvmem->dev,
 342			"cell %s unaligned to nvmem stride %d\n",
 343			cell->name, nvmem->stride);
 344		return -EINVAL;
 345	}
 346
 347	return 0;
 348}
 349
 350static int nvmem_add_cells(struct nvmem_device *nvmem,
 351			   const struct nvmem_config *cfg)
 352{
 353	struct nvmem_cell **cells;
 354	const struct nvmem_cell_info *info = cfg->cells;
 355	int i, rval;
 356
 357	cells = kcalloc(cfg->ncells, sizeof(*cells), GFP_KERNEL);
 358	if (!cells)
 359		return -ENOMEM;
 360
 361	for (i = 0; i < cfg->ncells; i++) {
 362		cells[i] = kzalloc(sizeof(**cells), GFP_KERNEL);
 363		if (!cells[i]) {
 364			rval = -ENOMEM;
 365			goto err;
 366		}
 367
 368		rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]);
 369		if (rval) {
 370			kfree(cells[i]);
 371			goto err;
 372		}
 373
 374		nvmem_cell_add(cells[i]);
 375	}
 376
 377	nvmem->ncells = cfg->ncells;
 378	/* remove tmp array */
 379	kfree(cells);
 380
 381	return 0;
 382err:
 383	while (i--)
 384		nvmem_cell_drop(cells[i]);
 385
 386	kfree(cells);
 387
 388	return rval;
 389}
 390
 391/*
 392 * nvmem_setup_compat() - Create an additional binary entry in
 393 * drivers sys directory, to be backwards compatible with the older
 394 * drivers/misc/eeprom drivers.
 395 */
 396static int nvmem_setup_compat(struct nvmem_device *nvmem,
 397			      const struct nvmem_config *config)
 398{
 399	int rval;
 400
 401	if (!config->base_dev)
 402		return -EINVAL;
 403
 404	if (nvmem->read_only)
 405		nvmem->eeprom = bin_attr_ro_root_nvmem;
 406	else
 407		nvmem->eeprom = bin_attr_rw_root_nvmem;
 408	nvmem->eeprom.attr.name = "eeprom";
 409	nvmem->eeprom.size = nvmem->size;
 410#ifdef CONFIG_DEBUG_LOCK_ALLOC
 411	nvmem->eeprom.attr.key = &eeprom_lock_key;
 412#endif
 413	nvmem->eeprom.private = &nvmem->dev;
 414	nvmem->base_dev = config->base_dev;
 415
 416	rval = device_create_bin_file(nvmem->base_dev, &nvmem->eeprom);
 417	if (rval) {
 418		dev_err(&nvmem->dev,
 419			"Failed to create eeprom binary file %d\n", rval);
 420		return rval;
 421	}
 422
 423	nvmem->flags |= FLAG_COMPAT;
 424
 425	return 0;
 426}
 427
 428/**
 429 * nvmem_register() - Register a nvmem device for given nvmem_config.
 430 * Also creates an binary entry in /sys/bus/nvmem/devices/dev-name/nvmem
 431 *
 432 * @config: nvmem device configuration with which nvmem device is created.
 433 *
 434 * Return: Will be an ERR_PTR() on error or a valid pointer to nvmem_device
 435 * on success.
 436 */
 437
 438struct nvmem_device *nvmem_register(const struct nvmem_config *config)
 439{
 440	struct nvmem_device *nvmem;
 441	struct device_node *np;
 442	int rval;
 443
 444	if (!config->dev)
 445		return ERR_PTR(-EINVAL);
 446
 447	nvmem = kzalloc(sizeof(*nvmem), GFP_KERNEL);
 448	if (!nvmem)
 449		return ERR_PTR(-ENOMEM);
 450
 451	rval  = ida_simple_get(&nvmem_ida, 0, 0, GFP_KERNEL);
 452	if (rval < 0) {
 453		kfree(nvmem);
 454		return ERR_PTR(rval);
 455	}
 456
 457	nvmem->id = rval;
 458	nvmem->owner = config->owner;
 459	nvmem->stride = config->stride;
 460	nvmem->word_size = config->word_size;
 461	nvmem->size = config->size;
 462	nvmem->dev.type = &nvmem_provider_type;
 463	nvmem->dev.bus = &nvmem_bus_type;
 464	nvmem->dev.parent = config->dev;
 465	nvmem->priv = config->priv;
 466	nvmem->reg_read = config->reg_read;
 467	nvmem->reg_write = config->reg_write;
 468	np = config->dev->of_node;
 469	nvmem->dev.of_node = np;
 470	dev_set_name(&nvmem->dev, "%s%d",
 471		     config->name ? : "nvmem", config->id);
 472
 473	nvmem->read_only = of_property_read_bool(np, "read-only") |
 474			   config->read_only;
 475
 476	if (config->root_only)
 477		nvmem->dev.groups = nvmem->read_only ?
 478			nvmem_ro_root_dev_groups :
 479			nvmem_rw_root_dev_groups;
 480	else
 481		nvmem->dev.groups = nvmem->read_only ?
 482			nvmem_ro_dev_groups :
 483			nvmem_rw_dev_groups;
 484
 485	device_initialize(&nvmem->dev);
 486
 487	dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
 488
 489	rval = device_add(&nvmem->dev);
 490	if (rval)
 491		goto out;
 492
 493	if (config->compat) {
 494		rval = nvmem_setup_compat(nvmem, config);
 495		if (rval)
 496			goto out;
 497	}
 498
 499	if (config->cells)
 500		nvmem_add_cells(nvmem, config);
 501
 502	return nvmem;
 503out:
 504	ida_simple_remove(&nvmem_ida, nvmem->id);
 505	kfree(nvmem);
 506	return ERR_PTR(rval);
 507}
 508EXPORT_SYMBOL_GPL(nvmem_register);
 509
 510/**
 511 * nvmem_unregister() - Unregister previously registered nvmem device
 512 *
 513 * @nvmem: Pointer to previously registered nvmem device.
 514 *
 515 * Return: Will be an negative on error or a zero on success.
 516 */
 517int nvmem_unregister(struct nvmem_device *nvmem)
 518{
 519	mutex_lock(&nvmem_mutex);
 520	if (nvmem->users) {
 521		mutex_unlock(&nvmem_mutex);
 522		return -EBUSY;
 523	}
 524	mutex_unlock(&nvmem_mutex);
 525
 526	if (nvmem->flags & FLAG_COMPAT)
 527		device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom);
 528
 529	nvmem_device_remove_all_cells(nvmem);
 530	device_del(&nvmem->dev);
 531
 532	return 0;
 533}
 534EXPORT_SYMBOL_GPL(nvmem_unregister);
 535
 536static struct nvmem_device *__nvmem_device_get(struct device_node *np,
 537					       struct nvmem_cell **cellp,
 538					       const char *cell_id)
 539{
 540	struct nvmem_device *nvmem = NULL;
 541
 542	mutex_lock(&nvmem_mutex);
 543
 544	if (np) {
 545		nvmem = of_nvmem_find(np);
 546		if (!nvmem) {
 547			mutex_unlock(&nvmem_mutex);
 548			return ERR_PTR(-EPROBE_DEFER);
 549		}
 550	} else {
 551		struct nvmem_cell *cell = nvmem_find_cell(cell_id);
 552
 553		if (cell) {
 554			nvmem = cell->nvmem;
 555			*cellp = cell;
 556		}
 557
 558		if (!nvmem) {
 559			mutex_unlock(&nvmem_mutex);
 560			return ERR_PTR(-ENOENT);
 561		}
 562	}
 563
 564	nvmem->users++;
 565	mutex_unlock(&nvmem_mutex);
 566
 567	if (!try_module_get(nvmem->owner)) {
 568		dev_err(&nvmem->dev,
 569			"could not increase module refcount for cell %s\n",
 570			nvmem->name);
 571
 572		mutex_lock(&nvmem_mutex);
 573		nvmem->users--;
 574		mutex_unlock(&nvmem_mutex);
 575
 576		return ERR_PTR(-EINVAL);
 577	}
 578
 579	return nvmem;
 580}
 581
 582static void __nvmem_device_put(struct nvmem_device *nvmem)
 583{
 584	module_put(nvmem->owner);
 585	mutex_lock(&nvmem_mutex);
 586	nvmem->users--;
 587	mutex_unlock(&nvmem_mutex);
 588}
 589
 590static int nvmem_match(struct device *dev, void *data)
 591{
 592	return !strcmp(dev_name(dev), data);
 593}
 594
 595static struct nvmem_device *nvmem_find(const char *name)
 596{
 597	struct device *d;
 598
 599	d = bus_find_device(&nvmem_bus_type, NULL, (void *)name, nvmem_match);
 600
 601	if (!d)
 602		return NULL;
 603
 604	return to_nvmem_device(d);
 605}
 606
 607#if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
 608/**
 609 * of_nvmem_device_get() - Get nvmem device from a given id
 610 *
 611 * @dev node: Device tree node that uses the nvmem device
 612 * @id: nvmem name from nvmem-names property.
 613 *
 614 * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device
 615 * on success.
 616 */
 617struct nvmem_device *of_nvmem_device_get(struct device_node *np, const char *id)
 618{
 619
 620	struct device_node *nvmem_np;
 621	int index;
 622
 623	index = of_property_match_string(np, "nvmem-names", id);
 624
 625	nvmem_np = of_parse_phandle(np, "nvmem", index);
 626	if (!nvmem_np)
 627		return ERR_PTR(-EINVAL);
 628
 629	return __nvmem_device_get(nvmem_np, NULL, NULL);
 630}
 631EXPORT_SYMBOL_GPL(of_nvmem_device_get);
 632#endif
 633
 634/**
 635 * nvmem_device_get() - Get nvmem device from a given id
 636 *
 637 * @dev : Device that uses the nvmem device
 638 * @id: nvmem name from nvmem-names property.
 639 *
 640 * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device
 641 * on success.
 642 */
 643struct nvmem_device *nvmem_device_get(struct device *dev, const char *dev_name)
 644{
 645	if (dev->of_node) { /* try dt first */
 646		struct nvmem_device *nvmem;
 647
 648		nvmem = of_nvmem_device_get(dev->of_node, dev_name);
 649
 650		if (!IS_ERR(nvmem) || PTR_ERR(nvmem) == -EPROBE_DEFER)
 651			return nvmem;
 652
 653	}
 654
 655	return nvmem_find(dev_name);
 656}
 657EXPORT_SYMBOL_GPL(nvmem_device_get);
 658
 659static int devm_nvmem_device_match(struct device *dev, void *res, void *data)
 660{
 661	struct nvmem_device **nvmem = res;
 662
 663	if (WARN_ON(!nvmem || !*nvmem))
 664		return 0;
 665
 666	return *nvmem == data;
 667}
 668
 669static void devm_nvmem_device_release(struct device *dev, void *res)
 670{
 671	nvmem_device_put(*(struct nvmem_device **)res);
 672}
 673
 674/**
 675 * devm_nvmem_device_put() - put alredy got nvmem device
 676 *
 677 * @nvmem: pointer to nvmem device allocated by devm_nvmem_cell_get(),
 678 * that needs to be released.
 679 */
 680void devm_nvmem_device_put(struct device *dev, struct nvmem_device *nvmem)
 681{
 682	int ret;
 683
 684	ret = devres_release(dev, devm_nvmem_device_release,
 685			     devm_nvmem_device_match, nvmem);
 686
 687	WARN_ON(ret);
 688}
 689EXPORT_SYMBOL_GPL(devm_nvmem_device_put);
 690
 691/**
 692 * nvmem_device_put() - put alredy got nvmem device
 693 *
 694 * @nvmem: pointer to nvmem device that needs to be released.
 695 */
 696void nvmem_device_put(struct nvmem_device *nvmem)
 697{
 698	__nvmem_device_put(nvmem);
 699}
 700EXPORT_SYMBOL_GPL(nvmem_device_put);
 701
 702/**
 703 * devm_nvmem_device_get() - Get nvmem cell of device form a given id
 704 *
 705 * @dev node: Device tree node that uses the nvmem cell
 706 * @id: nvmem name in nvmems property.
 707 *
 708 * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_cell
 709 * on success.  The nvmem_cell will be freed by the automatically once the
 710 * device is freed.
 711 */
 712struct nvmem_device *devm_nvmem_device_get(struct device *dev, const char *id)
 713{
 714	struct nvmem_device **ptr, *nvmem;
 715
 716	ptr = devres_alloc(devm_nvmem_device_release, sizeof(*ptr), GFP_KERNEL);
 717	if (!ptr)
 718		return ERR_PTR(-ENOMEM);
 719
 720	nvmem = nvmem_device_get(dev, id);
 721	if (!IS_ERR(nvmem)) {
 722		*ptr = nvmem;
 723		devres_add(dev, ptr);
 724	} else {
 725		devres_free(ptr);
 726	}
 727
 728	return nvmem;
 729}
 730EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
 731
 732static struct nvmem_cell *nvmem_cell_get_from_list(const char *cell_id)
 733{
 734	struct nvmem_cell *cell = NULL;
 735	struct nvmem_device *nvmem;
 736
 737	nvmem = __nvmem_device_get(NULL, &cell, cell_id);
 738	if (IS_ERR(nvmem))
 739		return ERR_CAST(nvmem);
 740
 741	return cell;
 742}
 743
 744#if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
 745/**
 746 * of_nvmem_cell_get() - Get a nvmem cell from given device node and cell id
 747 *
 748 * @dev node: Device tree node that uses the nvmem cell
 749 * @id: nvmem cell name from nvmem-cell-names property.
 750 *
 751 * Return: Will be an ERR_PTR() on error or a valid pointer
 752 * to a struct nvmem_cell.  The nvmem_cell will be freed by the
 753 * nvmem_cell_put().
 754 */
 755struct nvmem_cell *of_nvmem_cell_get(struct device_node *np,
 756					    const char *name)
 757{
 758	struct device_node *cell_np, *nvmem_np;
 759	struct nvmem_cell *cell;
 760	struct nvmem_device *nvmem;
 761	const __be32 *addr;
 762	int rval, len, index;
 763
 764	index = of_property_match_string(np, "nvmem-cell-names", name);
 765
 766	cell_np = of_parse_phandle(np, "nvmem-cells", index);
 767	if (!cell_np)
 768		return ERR_PTR(-EINVAL);
 769
 770	nvmem_np = of_get_next_parent(cell_np);
 771	if (!nvmem_np)
 772		return ERR_PTR(-EINVAL);
 773
 774	nvmem = __nvmem_device_get(nvmem_np, NULL, NULL);
 775	if (IS_ERR(nvmem))
 776		return ERR_CAST(nvmem);
 777
 778	addr = of_get_property(cell_np, "reg", &len);
 779	if (!addr || (len < 2 * sizeof(u32))) {
 780		dev_err(&nvmem->dev, "nvmem: invalid reg on %s\n",
 781			cell_np->full_name);
 782		rval  = -EINVAL;
 783		goto err_mem;
 784	}
 785
 786	cell = kzalloc(sizeof(*cell), GFP_KERNEL);
 787	if (!cell) {
 788		rval = -ENOMEM;
 789		goto err_mem;
 790	}
 791
 792	cell->nvmem = nvmem;
 793	cell->offset = be32_to_cpup(addr++);
 794	cell->bytes = be32_to_cpup(addr);
 795	cell->name = cell_np->name;
 796
 797	addr = of_get_property(cell_np, "bits", &len);
 798	if (addr && len == (2 * sizeof(u32))) {
 799		cell->bit_offset = be32_to_cpup(addr++);
 800		cell->nbits = be32_to_cpup(addr);
 801	}
 802
 803	if (cell->nbits)
 804		cell->bytes = DIV_ROUND_UP(cell->nbits + cell->bit_offset,
 805					   BITS_PER_BYTE);
 806
 807	if (!IS_ALIGNED(cell->offset, nvmem->stride)) {
 808			dev_err(&nvmem->dev,
 809				"cell %s unaligned to nvmem stride %d\n",
 810				cell->name, nvmem->stride);
 811		rval  = -EINVAL;
 812		goto err_sanity;
 813	}
 814
 815	nvmem_cell_add(cell);
 816
 817	return cell;
 818
 819err_sanity:
 820	kfree(cell);
 821
 822err_mem:
 823	__nvmem_device_put(nvmem);
 824
 825	return ERR_PTR(rval);
 826}
 827EXPORT_SYMBOL_GPL(of_nvmem_cell_get);
 828#endif
 829
 830/**
 831 * nvmem_cell_get() - Get nvmem cell of device form a given cell name
 832 *
 833 * @dev node: Device tree node that uses the nvmem cell
 834 * @id: nvmem cell name to get.
 835 *
 836 * Return: Will be an ERR_PTR() on error or a valid pointer
 837 * to a struct nvmem_cell.  The nvmem_cell will be freed by the
 838 * nvmem_cell_put().
 839 */
 840struct nvmem_cell *nvmem_cell_get(struct device *dev, const char *cell_id)
 841{
 842	struct nvmem_cell *cell;
 843
 844	if (dev->of_node) { /* try dt first */
 845		cell = of_nvmem_cell_get(dev->of_node, cell_id);
 846		if (!IS_ERR(cell) || PTR_ERR(cell) == -EPROBE_DEFER)
 847			return cell;
 848	}
 849
 850	return nvmem_cell_get_from_list(cell_id);
 851}
 852EXPORT_SYMBOL_GPL(nvmem_cell_get);
 853
 854static void devm_nvmem_cell_release(struct device *dev, void *res)
 855{
 856	nvmem_cell_put(*(struct nvmem_cell **)res);
 857}
 858
 859/**
 860 * devm_nvmem_cell_get() - Get nvmem cell of device form a given id
 861 *
 862 * @dev node: Device tree node that uses the nvmem cell
 863 * @id: nvmem id in nvmem-names property.
 864 *
 865 * Return: Will be an ERR_PTR() on error or a valid pointer
 866 * to a struct nvmem_cell.  The nvmem_cell will be freed by the
 867 * automatically once the device is freed.
 868 */
 869struct nvmem_cell *devm_nvmem_cell_get(struct device *dev, const char *id)
 870{
 871	struct nvmem_cell **ptr, *cell;
 872
 873	ptr = devres_alloc(devm_nvmem_cell_release, sizeof(*ptr), GFP_KERNEL);
 874	if (!ptr)
 875		return ERR_PTR(-ENOMEM);
 876
 877	cell = nvmem_cell_get(dev, id);
 878	if (!IS_ERR(cell)) {
 879		*ptr = cell;
 880		devres_add(dev, ptr);
 881	} else {
 882		devres_free(ptr);
 883	}
 884
 885	return cell;
 886}
 887EXPORT_SYMBOL_GPL(devm_nvmem_cell_get);
 888
 889static int devm_nvmem_cell_match(struct device *dev, void *res, void *data)
 890{
 891	struct nvmem_cell **c = res;
 892
 893	if (WARN_ON(!c || !*c))
 894		return 0;
 895
 896	return *c == data;
 897}
 898
 899/**
 900 * devm_nvmem_cell_put() - Release previously allocated nvmem cell
 901 * from devm_nvmem_cell_get.
 902 *
 903 * @cell: Previously allocated nvmem cell by devm_nvmem_cell_get()
 904 */
 905void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell)
 906{
 907	int ret;
 908
 909	ret = devres_release(dev, devm_nvmem_cell_release,
 910				devm_nvmem_cell_match, cell);
 911
 912	WARN_ON(ret);
 913}
 914EXPORT_SYMBOL(devm_nvmem_cell_put);
 915
 916/**
 917 * nvmem_cell_put() - Release previously allocated nvmem cell.
 918 *
 919 * @cell: Previously allocated nvmem cell by nvmem_cell_get()
 920 */
 921void nvmem_cell_put(struct nvmem_cell *cell)
 922{
 923	struct nvmem_device *nvmem = cell->nvmem;
 924
 925	__nvmem_device_put(nvmem);
 926	nvmem_cell_drop(cell);
 927}
 928EXPORT_SYMBOL_GPL(nvmem_cell_put);
 929
 930static inline void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell,
 931						    void *buf)
 932{
 933	u8 *p, *b;
 934	int i, bit_offset = cell->bit_offset;
 935
 936	p = b = buf;
 937	if (bit_offset) {
 938		/* First shift */
 939		*b++ >>= bit_offset;
 940
 941		/* setup rest of the bytes if any */
 942		for (i = 1; i < cell->bytes; i++) {
 943			/* Get bits from next byte and shift them towards msb */
 944			*p |= *b << (BITS_PER_BYTE - bit_offset);
 945
 946			p = b;
 947			*b++ >>= bit_offset;
 948		}
 949
 950		/* result fits in less bytes */
 951		if (cell->bytes != DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE))
 952			*p-- = 0;
 953	}
 954	/* clear msb bits if any leftover in the last byte */
 955	*p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
 956}
 957
 958static int __nvmem_cell_read(struct nvmem_device *nvmem,
 959		      struct nvmem_cell *cell,
 960		      void *buf, size_t *len)
 961{
 962	int rc;
 963
 964	rc = nvmem_reg_read(nvmem, cell->offset, buf, cell->bytes);
 965
 966	if (rc)
 967		return rc;
 968
 969	/* shift bits in-place */
 970	if (cell->bit_offset || cell->nbits)
 971		nvmem_shift_read_buffer_in_place(cell, buf);
 972
 973	*len = cell->bytes;
 974
 975	return 0;
 976}
 977
 978/**
 979 * nvmem_cell_read() - Read a given nvmem cell
 980 *
 981 * @cell: nvmem cell to be read.
 982 * @len: pointer to length of cell which will be populated on successful read.
 983 *
 984 * Return: ERR_PTR() on error or a valid pointer to a buffer on success. The
 985 * buffer should be freed by the consumer with a kfree().
 986 */
 987void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
 988{
 989	struct nvmem_device *nvmem = cell->nvmem;
 990	u8 *buf;
 991	int rc;
 992
 993	if (!nvmem)
 994		return ERR_PTR(-EINVAL);
 995
 996	buf = kzalloc(cell->bytes, GFP_KERNEL);
 997	if (!buf)
 998		return ERR_PTR(-ENOMEM);
 999
1000	rc = __nvmem_cell_read(nvmem, cell, buf, len);
1001	if (rc) {
1002		kfree(buf);
1003		return ERR_PTR(rc);
1004	}
1005
1006	return buf;
1007}
1008EXPORT_SYMBOL_GPL(nvmem_cell_read);
1009
1010static inline void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,
1011						    u8 *_buf, int len)
1012{
1013	struct nvmem_device *nvmem = cell->nvmem;
1014	int i, rc, nbits, bit_offset = cell->bit_offset;
1015	u8 v, *p, *buf, *b, pbyte, pbits;
1016
1017	nbits = cell->nbits;
1018	buf = kzalloc(cell->bytes, GFP_KERNEL);
1019	if (!buf)
1020		return ERR_PTR(-ENOMEM);
1021
1022	memcpy(buf, _buf, len);
1023	p = b = buf;
1024
1025	if (bit_offset) {
1026		pbyte = *b;
1027		*b <<= bit_offset;
1028
1029		/* setup the first byte with lsb bits from nvmem */
1030		rc = nvmem_reg_read(nvmem, cell->offset, &v, 1);
1031		*b++ |= GENMASK(bit_offset - 1, 0) & v;
1032
1033		/* setup rest of the byte if any */
1034		for (i = 1; i < cell->bytes; i++) {
1035			/* Get last byte bits and shift them towards lsb */
1036			pbits = pbyte >> (BITS_PER_BYTE - 1 - bit_offset);
1037			pbyte = *b;
1038			p = b;
1039			*b <<= bit_offset;
1040			*b++ |= pbits;
1041		}
1042	}
1043
1044	/* if it's not end on byte boundary */
1045	if ((nbits + bit_offset) % BITS_PER_BYTE) {
1046		/* setup the last byte with msb bits from nvmem */
1047		rc = nvmem_reg_read(nvmem,
1048				    cell->offset + cell->bytes - 1, &v, 1);
1049		*p |= GENMASK(7, (nbits + bit_offset) % BITS_PER_BYTE) & v;
1050
1051	}
1052
1053	return buf;
1054}
1055
1056/**
1057 * nvmem_cell_write() - Write to a given nvmem cell
1058 *
1059 * @cell: nvmem cell to be written.
1060 * @buf: Buffer to be written.
1061 * @len: length of buffer to be written to nvmem cell.
1062 *
1063 * Return: length of bytes written or negative on failure.
1064 */
1065int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
1066{
1067	struct nvmem_device *nvmem = cell->nvmem;
1068	int rc;
1069
1070	if (!nvmem || nvmem->read_only ||
1071	    (cell->bit_offset == 0 && len != cell->bytes))
1072		return -EINVAL;
1073
1074	if (cell->bit_offset || cell->nbits) {
1075		buf = nvmem_cell_prepare_write_buffer(cell, buf, len);
1076		if (IS_ERR(buf))
1077			return PTR_ERR(buf);
1078	}
1079
1080	rc = nvmem_reg_write(nvmem, cell->offset, buf, cell->bytes);
1081
1082	/* free the tmp buffer */
1083	if (cell->bit_offset || cell->nbits)
1084		kfree(buf);
1085
1086	if (rc)
1087		return rc;
1088
1089	return len;
1090}
1091EXPORT_SYMBOL_GPL(nvmem_cell_write);
1092
1093/**
1094 * nvmem_device_cell_read() - Read a given nvmem device and cell
1095 *
1096 * @nvmem: nvmem device to read from.
1097 * @info: nvmem cell info to be read.
1098 * @buf: buffer pointer which will be populated on successful read.
1099 *
1100 * Return: length of successful bytes read on success and negative
1101 * error code on error.
1102 */
1103ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
1104			   struct nvmem_cell_info *info, void *buf)
1105{
1106	struct nvmem_cell cell;
1107	int rc;
1108	ssize_t len;
1109
1110	if (!nvmem)
1111		return -EINVAL;
1112
1113	rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell);
1114	if (rc)
1115		return rc;
1116
1117	rc = __nvmem_cell_read(nvmem, &cell, buf, &len);
1118	if (rc)
1119		return rc;
1120
1121	return len;
1122}
1123EXPORT_SYMBOL_GPL(nvmem_device_cell_read);
1124
1125/**
1126 * nvmem_device_cell_write() - Write cell to a given nvmem device
1127 *
1128 * @nvmem: nvmem device to be written to.
1129 * @info: nvmem cell info to be written
1130 * @buf: buffer to be written to cell.
1131 *
1132 * Return: length of bytes written or negative error code on failure.
1133 * */
1134int nvmem_device_cell_write(struct nvmem_device *nvmem,
1135			    struct nvmem_cell_info *info, void *buf)
1136{
1137	struct nvmem_cell cell;
1138	int rc;
1139
1140	if (!nvmem)
1141		return -EINVAL;
1142
1143	rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell);
1144	if (rc)
1145		return rc;
1146
1147	return nvmem_cell_write(&cell, buf, cell.bytes);
1148}
1149EXPORT_SYMBOL_GPL(nvmem_device_cell_write);
1150
1151/**
1152 * nvmem_device_read() - Read from a given nvmem device
1153 *
1154 * @nvmem: nvmem device to read from.
1155 * @offset: offset in nvmem device.
1156 * @bytes: number of bytes to read.
1157 * @buf: buffer pointer which will be populated on successful read.
1158 *
1159 * Return: length of successful bytes read on success and negative
1160 * error code on error.
1161 */
1162int nvmem_device_read(struct nvmem_device *nvmem,
1163		      unsigned int offset,
1164		      size_t bytes, void *buf)
1165{
1166	int rc;
1167
1168	if (!nvmem)
1169		return -EINVAL;
1170
1171	rc = nvmem_reg_read(nvmem, offset, buf, bytes);
1172
1173	if (rc)
1174		return rc;
1175
1176	return bytes;
1177}
1178EXPORT_SYMBOL_GPL(nvmem_device_read);
1179
1180/**
1181 * nvmem_device_write() - Write cell to a given nvmem device
1182 *
1183 * @nvmem: nvmem device to be written to.
1184 * @offset: offset in nvmem device.
1185 * @bytes: number of bytes to write.
1186 * @buf: buffer to be written.
1187 *
1188 * Return: length of bytes written or negative error code on failure.
1189 * */
1190int nvmem_device_write(struct nvmem_device *nvmem,
1191		       unsigned int offset,
1192		       size_t bytes, void *buf)
1193{
1194	int rc;
1195
1196	if (!nvmem)
1197		return -EINVAL;
1198
1199	rc = nvmem_reg_write(nvmem, offset, buf, bytes);
1200
1201	if (rc)
1202		return rc;
1203
1204
1205	return bytes;
1206}
1207EXPORT_SYMBOL_GPL(nvmem_device_write);
1208
1209static int __init nvmem_init(void)
1210{
1211	return bus_register(&nvmem_bus_type);
1212}
1213
1214static void __exit nvmem_exit(void)
1215{
1216	bus_unregister(&nvmem_bus_type);
1217}
1218
1219subsys_initcall(nvmem_init);
1220module_exit(nvmem_exit);
1221
1222MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org");
1223MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com");
1224MODULE_DESCRIPTION("nvmem Driver Core");
1225MODULE_LICENSE("GPL v2");