1*57251285SSimon Glass /* 2*57251285SSimon Glass * Copyright (C) 2015 Google, Inc 3*57251285SSimon Glass * Written by Simon Glass <sjg@chromium.org> 4*57251285SSimon Glass * 5*57251285SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*57251285SSimon Glass */ 7*57251285SSimon Glass 8*57251285SSimon Glass #include <common.h> 9*57251285SSimon Glass #include <syscon.h> 10*57251285SSimon Glass #include <dm.h> 11*57251285SSimon Glass #include <errno.h> 12*57251285SSimon Glass #include <regmap.h> 13*57251285SSimon Glass #include <dm/device-internal.h> 14*57251285SSimon Glass #include <dm/lists.h> 15*57251285SSimon Glass #include <dm/root.h> 16*57251285SSimon Glass #include <linux/err.h> 17*57251285SSimon Glass 18*57251285SSimon Glass struct regmap *syscon_get_regmap(struct udevice *dev) 19*57251285SSimon Glass { 20*57251285SSimon Glass struct syscon_uc_info *priv = dev_get_uclass_priv(dev); 21*57251285SSimon Glass 22*57251285SSimon Glass return priv->regmap; 23*57251285SSimon Glass } 24*57251285SSimon Glass 25*57251285SSimon Glass static int syscon_pre_probe(struct udevice *dev) 26*57251285SSimon Glass { 27*57251285SSimon Glass struct syscon_uc_info *priv = dev_get_uclass_priv(dev); 28*57251285SSimon Glass 29*57251285SSimon Glass return regmap_init_mem(dev, &priv->regmap); 30*57251285SSimon Glass } 31*57251285SSimon Glass 32*57251285SSimon Glass struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data) 33*57251285SSimon Glass { 34*57251285SSimon Glass struct udevice *dev; 35*57251285SSimon Glass struct uclass *uc; 36*57251285SSimon Glass int ret; 37*57251285SSimon Glass 38*57251285SSimon Glass ret = uclass_get(UCLASS_SYSCON, &uc); 39*57251285SSimon Glass if (ret) 40*57251285SSimon Glass return ERR_PTR(ret); 41*57251285SSimon Glass uclass_foreach_dev(dev, uc) { 42*57251285SSimon Glass if (dev->driver_data == driver_data) { 43*57251285SSimon Glass struct syscon_uc_info *priv; 44*57251285SSimon Glass int ret; 45*57251285SSimon Glass 46*57251285SSimon Glass ret = device_probe(dev); 47*57251285SSimon Glass if (ret) 48*57251285SSimon Glass return ERR_PTR(ret); 49*57251285SSimon Glass priv = dev_get_uclass_priv(dev); 50*57251285SSimon Glass 51*57251285SSimon Glass return priv->regmap; 52*57251285SSimon Glass } 53*57251285SSimon Glass } 54*57251285SSimon Glass 55*57251285SSimon Glass return ERR_PTR(-ENOENT); 56*57251285SSimon Glass } 57*57251285SSimon Glass 58*57251285SSimon Glass void *syscon_get_first_range(ulong driver_data) 59*57251285SSimon Glass { 60*57251285SSimon Glass struct regmap *map; 61*57251285SSimon Glass 62*57251285SSimon Glass map = syscon_get_regmap_by_driver_data(driver_data); 63*57251285SSimon Glass if (IS_ERR(map)) 64*57251285SSimon Glass return map; 65*57251285SSimon Glass return regmap_get_range(map, 0); 66*57251285SSimon Glass } 67*57251285SSimon Glass 68*57251285SSimon Glass UCLASS_DRIVER(syscon) = { 69*57251285SSimon Glass .id = UCLASS_SYSCON, 70*57251285SSimon Glass .name = "syscon", 71*57251285SSimon Glass .per_device_auto_alloc_size = sizeof(struct syscon_uc_info), 72*57251285SSimon Glass .pre_probe = syscon_pre_probe, 73*57251285SSimon Glass }; 74