sunxi SRAM driver changes:
- minor code refactor - support for Allwinner D1 -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQSPRixG1tysKC2PKM10Ba7+DO8kkwUCYyeKsgAKCRB0Ba7+DO8k k1X1AQDo4koVgAH3uPXHj9dDUtOy8bcuf2cj2ZwjYtPEseWdVgD+JTh2fty584qq 7n2vFdGr0AAAD5L/1u5kiSvJlOCrVAk= =GqoJ -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmMt0mkACgkQmmx57+YA GNlmShAAkIsFHmlEs3MOjHCNCIulvQjqBcChYfvoVEN22HLr2wSvQqLtpYQ65bjB wV2ktJZXUNjCIzTNE16N2hErvFEhQ0mbPg2PKiIny2UiNjb+amJbdaJbfmwuDptr q23WDbTu3WApBzyfsTpW+YThC0EXx+cD3hg3i1KNtAnlUjkeuG3oDphqr7Hp+8E4 NQTgD7mj6IJsEx4J7+GDYgNdIiGybgmRind6nW8svnmSo6Wx1p1Hty5mjsjeKlnb A/14D0qSGu8z3pRIcxnYESnicacyzUILyAOZ1+UUh7oU29ymQQPIH/uXTDO4id4e llaR/RoOCjg/OmYPWpxu50Wb0vsx71JRbHnxtpdvjYUd1nAakK2C5AA1NwMEAzex Zh17w/C9WkmfSTbcvk7njRtxEl29QhEeJ3kZPYqWdt7cwvRX4wYjg84Xb7Axkbq9 fuLiaTw81YbVx91wEzW2vLUBCnBXYxkf9KPdaeK8KrR6pvzKfdzify2zzjw68Vy1 f6PpF0CSDiNbgha6w9MH8D6Fp/MOkBWnjmMadlWFA3zX7ymoVbIT+v28CgXhw4rw 7LSGi+p3jVObVwhgDLGSyL5xbTbxmW37aTyBfANOwT7Qj7D2zz9HqYb07jWV5oIP e0ixr9dmcF96cPB1CBUPomnay8f0XKD2E/DVxn/Kdjn1Hl5O0k8= =Fmcq -----END PGP SIGNATURE----- Merge tag 'sunxi-drivers-for-6.1-1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into arm/drivers sunxi SRAM driver changes: - minor code refactor - support for Allwinner D1 * tag 'sunxi-drivers-for-6.1-1' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux: soc: sunxi: sram: Add support for the D1 system control soc: sunxi: sram: Export the LDO control register soc: sunxi: sram: Save a pointer to the OF match data soc: sunxi: sram: Return void from the release function soc: sunxi: sram: Fix debugfs info for A64 SRAM C soc: sunxi: sram: Fix probe function ordering issues soc: sunxi: sram: Prevent the driver from being unbound soc: sunxi: sram: Actually claim SRAM regions Link: https://lore.kernel.org/r/YyeOthH4y8wy8A8R@kista.localdomain Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
891518b717
|
@ -78,8 +78,8 @@ static struct sunxi_sram_desc sun4i_a10_sram_d = {
|
|||
|
||||
static struct sunxi_sram_desc sun50i_a64_sram_c = {
|
||||
.data = SUNXI_SRAM_DATA("C", 0x4, 24, 1,
|
||||
SUNXI_SRAM_MAP(0, 1, "cpu"),
|
||||
SUNXI_SRAM_MAP(1, 0, "de2")),
|
||||
SUNXI_SRAM_MAP(1, 0, "cpu"),
|
||||
SUNXI_SRAM_MAP(0, 1, "de2")),
|
||||
};
|
||||
|
||||
static const struct of_device_id sunxi_sram_dt_ids[] = {
|
||||
|
@ -254,36 +254,36 @@ int sunxi_sram_claim(struct device *dev)
|
|||
writel(val | ((device << sram_data->offset) & mask),
|
||||
base + sram_data->reg);
|
||||
|
||||
sram_desc->claimed = true;
|
||||
spin_unlock(&sram_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sunxi_sram_claim);
|
||||
|
||||
int sunxi_sram_release(struct device *dev)
|
||||
void sunxi_sram_release(struct device *dev)
|
||||
{
|
||||
const struct sunxi_sram_data *sram_data;
|
||||
struct sunxi_sram_desc *sram_desc;
|
||||
|
||||
if (!dev || !dev->of_node)
|
||||
return -EINVAL;
|
||||
return;
|
||||
|
||||
sram_data = sunxi_sram_of_parse(dev->of_node, NULL);
|
||||
if (IS_ERR(sram_data))
|
||||
return -EINVAL;
|
||||
return;
|
||||
|
||||
sram_desc = to_sram_desc(sram_data);
|
||||
|
||||
spin_lock(&sram_lock);
|
||||
sram_desc->claimed = false;
|
||||
spin_unlock(&sram_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sunxi_sram_release);
|
||||
|
||||
struct sunxi_sramc_variant {
|
||||
int num_emac_clocks;
|
||||
bool has_ldo_ctrl;
|
||||
};
|
||||
|
||||
static const struct sunxi_sramc_variant sun4i_a10_sramc_variant = {
|
||||
|
@ -294,6 +294,11 @@ static const struct sunxi_sramc_variant sun8i_h3_sramc_variant = {
|
|||
.num_emac_clocks = 1,
|
||||
};
|
||||
|
||||
static const struct sunxi_sramc_variant sun20i_d1_sramc_variant = {
|
||||
.num_emac_clocks = 1,
|
||||
.has_ldo_ctrl = true,
|
||||
};
|
||||
|
||||
static const struct sunxi_sramc_variant sun50i_a64_sramc_variant = {
|
||||
.num_emac_clocks = 1,
|
||||
};
|
||||
|
@ -303,37 +308,38 @@ static const struct sunxi_sramc_variant sun50i_h616_sramc_variant = {
|
|||
};
|
||||
|
||||
#define SUNXI_SRAM_EMAC_CLOCK_REG 0x30
|
||||
#define SUNXI_SYS_LDO_CTRL_REG 0x150
|
||||
|
||||
static bool sunxi_sram_regmap_accessible_reg(struct device *dev,
|
||||
unsigned int reg)
|
||||
{
|
||||
const struct sunxi_sramc_variant *variant;
|
||||
const struct sunxi_sramc_variant *variant = dev_get_drvdata(dev);
|
||||
|
||||
variant = of_device_get_match_data(dev);
|
||||
if (reg >= SUNXI_SRAM_EMAC_CLOCK_REG &&
|
||||
reg < SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4)
|
||||
return true;
|
||||
if (reg == SUNXI_SYS_LDO_CTRL_REG && variant->has_ldo_ctrl)
|
||||
return true;
|
||||
|
||||
if (reg < SUNXI_SRAM_EMAC_CLOCK_REG)
|
||||
return false;
|
||||
if (reg > SUNXI_SRAM_EMAC_CLOCK_REG + variant->num_emac_clocks * 4)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct regmap_config sunxi_sram_emac_clock_regmap = {
|
||||
static struct regmap_config sunxi_sram_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
/* last defined register */
|
||||
.max_register = SUNXI_SRAM_EMAC_CLOCK_REG + 4,
|
||||
.max_register = SUNXI_SYS_LDO_CTRL_REG,
|
||||
/* other devices have no business accessing other registers */
|
||||
.readable_reg = sunxi_sram_regmap_accessible_reg,
|
||||
.writeable_reg = sunxi_sram_regmap_accessible_reg,
|
||||
};
|
||||
|
||||
static int sunxi_sram_probe(struct platform_device *pdev)
|
||||
static int __init sunxi_sram_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct dentry *d;
|
||||
struct regmap *emac_clock;
|
||||
const struct sunxi_sramc_variant *variant;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct regmap *regmap;
|
||||
|
||||
sram_dev = &pdev->dev;
|
||||
|
||||
|
@ -341,25 +347,22 @@ static int sunxi_sram_probe(struct platform_device *pdev)
|
|||
if (!variant)
|
||||
return -EINVAL;
|
||||
|
||||
dev_set_drvdata(dev, (struct sunxi_sramc_variant *)variant);
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
|
||||
of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
|
||||
|
||||
d = debugfs_create_file("sram", S_IRUGO, NULL, NULL,
|
||||
&sunxi_sram_fops);
|
||||
if (!d)
|
||||
return -ENOMEM;
|
||||
|
||||
if (variant->num_emac_clocks > 0) {
|
||||
emac_clock = devm_regmap_init_mmio(&pdev->dev, base,
|
||||
&sunxi_sram_emac_clock_regmap);
|
||||
|
||||
if (IS_ERR(emac_clock))
|
||||
return PTR_ERR(emac_clock);
|
||||
if (variant->num_emac_clocks || variant->has_ldo_ctrl) {
|
||||
regmap = devm_regmap_init_mmio(dev, base, &sunxi_sram_regmap_config);
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
of_platform_populate(dev->of_node, NULL, NULL, dev);
|
||||
|
||||
debugfs_create_file("sram", 0444, NULL, NULL, &sunxi_sram_fops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -384,6 +387,10 @@ static const struct of_device_id sunxi_sram_dt_match[] = {
|
|||
.compatible = "allwinner,sun8i-h3-system-control",
|
||||
.data = &sun8i_h3_sramc_variant,
|
||||
},
|
||||
{
|
||||
.compatible = "allwinner,sun20i-d1-system-control",
|
||||
.data = &sun20i_d1_sramc_variant,
|
||||
},
|
||||
{
|
||||
.compatible = "allwinner,sun50i-a64-sram-controller",
|
||||
.data = &sun50i_a64_sramc_variant,
|
||||
|
@ -409,9 +416,8 @@ static struct platform_driver sunxi_sram_driver = {
|
|||
.name = "sunxi-sram",
|
||||
.of_match_table = sunxi_sram_dt_match,
|
||||
},
|
||||
.probe = sunxi_sram_probe,
|
||||
};
|
||||
module_platform_driver(sunxi_sram_driver);
|
||||
builtin_platform_driver_probe(sunxi_sram_driver, sunxi_sram_probe);
|
||||
|
||||
MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
|
||||
MODULE_DESCRIPTION("Allwinner sunXi SRAM Controller Driver");
|
||||
|
|
|
@ -14,6 +14,6 @@
|
|||
#define _SUNXI_SRAM_H_
|
||||
|
||||
int sunxi_sram_claim(struct device *dev);
|
||||
int sunxi_sram_release(struct device *dev);
|
||||
void sunxi_sram_release(struct device *dev);
|
||||
|
||||
#endif /* _SUNXI_SRAM_H_ */
|
||||
|
|
Loading…
Reference in New Issue