blob: 7345abb5db7654ef4d662c191b95b70cc270e1a6 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* iomapres driver
*
* Copyright (C) 2019 Amlogic, Inc. All rights reserved.
*
*/
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/device.h>
#include "iomapres.h"
struct regmap *regmap_resource(struct device *dev, char *name)
{
struct resource res;
void __iomem *base;
struct device_node *node = dev->of_node;
static struct regmap_config aud_regmap_config = {
.reg_bits = 32,
.val_bits = 32,
.reg_stride = 4,
};
int i;
i = of_property_match_string(node, "reg-names", name);
if (of_address_to_resource(node, i, &res))
return ERR_PTR(-ENOENT);
base = devm_ioremap_resource(dev, &res);
if (IS_ERR(base))
return ERR_CAST(base);
pr_info("%s, %s, start:%#x, size:%#x\n",
__func__, name, (u32)res.start, (u32)resource_size(&res));
aud_regmap_config.max_register = resource_size(&res) - 4;
aud_regmap_config.name =
devm_kasprintf(dev, GFP_KERNEL, "%s-%s", node->name, name);
if (!aud_regmap_config.name)
return ERR_PTR(-ENOMEM);
return devm_regmap_init_mmio(dev, base, &aud_regmap_config);
}
unsigned int mmio_read(struct regmap *map, unsigned int reg_ofs)
{
unsigned int val;
regmap_read(map, (reg_ofs << 2), &val);
return val;
}
int mmio_write(struct regmap *map, unsigned int reg_ofs, unsigned int value)
{
return regmap_write(map, (reg_ofs << 2), value);
}
int mmio_update_bits(struct regmap *map,
unsigned int reg_ofs,
unsigned int mask,
unsigned int value)
{
return regmap_update_bits(map, (reg_ofs << 2), mask, value);
}