Commit e24eb5e6 authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge tag 'at91-5.5-drivers' of...

Merge tag 'at91-5.5-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux into arm/drivers

AT91 drivers for 5.5

 - a new driver exposing the serial number registers through nvmem
 - a few documentation and definition changes

* tag 'at91-5.5-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/at91/linux:
  soc: at91: Add Atmel SFR SN (Serial Number) support
  memory: atmel-ebi: switch to SPDX license identifiers
  memory: atmel-ebi: move NUM_CS definition inside EBI driver
  ARM: at91: Documentation: update the sama5d3 and armv7m datasheets

Link: https://lore.kernel.org/r/20191107221644.GA201884@piout.net


Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents 44a39847 c3277f8e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ the Microchip website: http://www.microchip.com.

          * Datasheet

          http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-11121-32-bit-Cortex-A5-Microcontroller-SAMA5D3_Datasheet.pdf
          http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-11121-32-bit-Cortex-A5-Microcontroller-SAMA5D3_Datasheet_B.pdf

    * ARM Cortex-A5 + NEON based SoCs
      - sama5d4 family
@@ -167,7 +167,7 @@ the Microchip website: http://www.microchip.com.

          * Datasheet

          http://ww1.microchip.com/downloads/en/DeviceDoc/60001527A.pdf
          http://ww1.microchip.com/downloads/en/DeviceDoc/SAM-E70-S70-V70-V71-Family-Data-Sheet-DS60001527D.pdf


Linux kernel information
+5 −6
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * EBI driver for Atmel chips
 * inspired by the fsl weim bus driver
 *
 * Copyright (C) 2013 Jean-Jacques Hiblot <jjhiblot@traphandler.com>
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2. This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

#include <linux/clk.h>
@@ -19,6 +16,8 @@
#include <linux/regmap.h>
#include <soc/at91/atmel-sfr.h>

#define AT91_EBI_NUM_CS		8

struct atmel_ebi_dev_config {
	int cs;
	struct atmel_smc_cs_conf smcconf;
@@ -314,7 +313,7 @@ static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np,
		if (ret)
			return ret;

		if (cs >= AT91_MATRIX_EBI_NUM_CS ||
		if (cs >= AT91_EBI_NUM_CS ||
		    !(ebi->caps->available_cs & BIT(cs))) {
			dev_err(dev, "invalid reg property in %pOF\n", np);
			return -EINVAL;
@@ -344,7 +343,7 @@ static int atmel_ebi_dev_setup(struct atmel_ebi *ebi, struct device_node *np,
		apply = true;

	i = 0;
	for_each_set_bit(cs, &cslines, AT91_MATRIX_EBI_NUM_CS) {
	for_each_set_bit(cs, &cslines, AT91_EBI_NUM_CS) {
		ebid->configs[i].cs = cs;

		if (apply) {
+11 −0
Original line number Diff line number Diff line
@@ -5,3 +5,14 @@ config AT91_SOC_ID
	default ARCH_AT91
	help
	  Include support for the SoC bus on the Atmel ARM SoCs.

config AT91_SOC_SFR
	tristate "Special Function Registers support"
	depends on ARCH_AT91 || COMPILE_TEST
	help
	  This is a driver for the Special Function Registers available on
	  Atmel SAMA5Dx SoCs, providing access to specific aspects of the
	  integrated memory, bridge implementations, processor etc.

	  This driver can also be built as a module. If so, the module
	  will be called sfr.
+1 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_AT91_SOC_ID) += soc.o
obj-$(CONFIG_AT91_SOC_SFR) += sfr.o
+99 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * sfr.c - driver for special function registers
 *
 * Copyright (C) 2019 Bootlin.
 *
 */
#include <linux/mfd/syscon.h>
#include <linux/module.h>
#include <linux/nvmem-provider.h>
#include <linux/random.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>

#define SFR_SN0		0x4c
#define SFR_SN_SIZE	8

struct atmel_sfr_priv {
	struct regmap			*regmap;
};

static int atmel_sfr_read(void *context, unsigned int offset,
			  void *buf, size_t bytes)
{
	struct atmel_sfr_priv *priv = context;

	return regmap_bulk_read(priv->regmap, SFR_SN0 + offset,
				buf, bytes / 4);
}

static struct nvmem_config atmel_sfr_nvmem_config = {
	.name = "atmel-sfr",
	.read_only = true,
	.word_size = 4,
	.stride = 4,
	.size = SFR_SN_SIZE,
	.reg_read = atmel_sfr_read,
};

static int atmel_sfr_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct device_node *np = dev->of_node;
	struct nvmem_device *nvmem;
	struct atmel_sfr_priv *priv;
	u8 sn[SFR_SN_SIZE];
	int ret;

	priv = devm_kmalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->regmap = syscon_node_to_regmap(np);
	if (IS_ERR(priv->regmap)) {
		dev_err(dev, "cannot get parent's regmap\n");
		return PTR_ERR(priv->regmap);
	}

	atmel_sfr_nvmem_config.dev = dev;
	atmel_sfr_nvmem_config.priv = priv;

	nvmem = devm_nvmem_register(dev, &atmel_sfr_nvmem_config);
	if (IS_ERR(nvmem)) {
		dev_err(dev, "error registering nvmem config\n");
		return PTR_ERR(nvmem);
	}

	ret = atmel_sfr_read(priv, 0, sn, SFR_SN_SIZE);
	if (ret == 0)
		add_device_randomness(sn, SFR_SN_SIZE);

	return ret;
}

static const struct of_device_id atmel_sfr_dt_ids[] = {
	{
		.compatible = "atmel,sama5d2-sfr",
	}, {
		.compatible = "atmel,sama5d4-sfr",
	}, {
		/* sentinel */
	},
};
MODULE_DEVICE_TABLE(of, atmel_sfr_dt_ids);

static struct platform_driver atmel_sfr_driver = {
	.probe = atmel_sfr_probe,
	.driver = {
		.name = "atmel-sfr",
		.of_match_table = atmel_sfr_dt_ids,
	},
};
module_platform_driver(atmel_sfr_driver);

MODULE_AUTHOR("Kamel Bouhara <kamel.bouhara@bootlin.com>");
MODULE_DESCRIPTION("Atmel SFR SN driver for SAMA5D2/4 SoC family");
MODULE_LICENSE("GPL v2");
Loading