There's only a single caller of vexpress_config_set_master() from vexpress-sysreg.c. Let's just make the registers needed available to vexpress-config and move all the code there. The registers needed aren't used anywhere else either. With this, we can get rid of the private API between these 2 drivers.
Unified · Split
| @@ -14,9 +14,17 @@ · 13 unmodified lines | ||
| 14 | 14 | #include <linux/slab.h> |
| 15 | 15 | #include <linux/vexpress.h> |
| 16 | 16 | |
| 17 | −#define SYS_CFGDATA 0x0 | |
| 17 | +#define SYS_MISC 0x0 | |
| 18 | +#define SYS_MISC_MASTERSITE (1 << 14) | |
| 18 | 19 | |
| 19 | −#define SYS_CFGCTRL 0x4 | |
| 20 | +#define SYS_PROCID0 0x24 | |
| 21 | +#define SYS_PROCID1 0x28 | |
| 22 | +#define SYS_HBI_MASK 0xfff | |
| 23 | +#define SYS_PROCIDx_HBI_SHIFT 0 | |
| 24 | + | |
| 25 | +#define SYS_CFGDATA 0x40 | |
| 26 | + | |
| 27 | +#define SYS_CFGCTRL 0x44 | |
| 20 | 28 | #define SYS_CFGCTRL_START (1 << 31) |
| 21 | 29 | #define SYS_CFGCTRL_WRITE (1 << 30) |
| 22 | 30 | #define SYS_CFGCTRL_DCC(n) (((n) & 0xf) << 26) |
| @@ -25,10 +33,14 @@ · 2 unmodified lines | ||
| 25 | 33 | #define SYS_CFGCTRL_POSITION(n) (((n) & 0xf) << 12) |
| 26 | 34 | #define SYS_CFGCTRL_DEVICE(n) (((n) & 0xfff) << 0) |
| 27 | 35 | |
| 28 | −#define SYS_CFGSTAT 0x8 | |
| 36 | +#define SYS_CFGSTAT 0x48 | |
| 29 | 37 | #define SYS_CFGSTAT_ERR (1 << 1) |
| 30 | 38 | #define SYS_CFGSTAT_COMPLETE (1 << 0) |
| 31 | 39 | |
| 40 | +#define VEXPRESS_SITE_MB 0 | |
| 41 | +#define VEXPRESS_SITE_DB1 1 | |
| 42 | +#define VEXPRESS_SITE_DB2 2 | |
| 43 | +#define VEXPRESS_SITE_MASTER 0xf | |
| 32 | 44 | |
| 33 | 45 | struct vexpress_syscfg { |
| 34 | 46 | struct device *dev; |
| @@ -59,7 +71,7 @@ static DEFINE_MUTEX(vexpress_config_mutex); · 24 unmodified lines | ||
| 59 | 71 | static u32 vexpress_config_site_master = VEXPRESS_SITE_MASTER; |
| 60 | 72 | |
| 61 | 73 | |
| 62 | −void vexpress_config_set_master(u32 site) | |
| 74 | +static void vexpress_config_set_master(u32 site) | |
| 63 | 75 | { |
| 64 | 76 | vexpress_config_site_master = site; |
| 65 | 77 | } |
| @@ -340,6 +352,8 @@ static int vexpress_syscfg_probe(struct platform_device *pdev) · 274 unmodified lines | ||
| 340 | 352 | struct resource *res; |
| 341 | 353 | struct vexpress_config_bridge *bridge; |
| 342 | 354 | struct device_node *node; |
| 355 | + int master; | |
| 356 | + u32 dt_hbi; | |
| 343 | 357 | |
| 344 | 358 | syscfg = devm_kzalloc(&pdev->dev, sizeof(*syscfg), GFP_KERNEL); |
| 345 | 359 | if (!syscfg) |
| @@ -361,6 +375,21 @@ static int vexpress_syscfg_probe(struct platform_device *pdev) · 15 unmodified lines | ||
| 361 | 375 | |
| 362 | 376 | dev_set_drvdata(&pdev->dev, bridge); |
| 363 | 377 | |
| 378 | + master = readl(syscfg->base + SYS_MISC) & SYS_MISC_MASTERSITE ? | |
| 379 | + VEXPRESS_SITE_DB2 : VEXPRESS_SITE_DB1; | |
| 380 | + vexpress_config_set_master(master); | |
| 381 | + | |
| 382 | + /* Confirm board type against DT property, if available */ | |
| 383 | + if (of_property_read_u32(of_root, "arm,hbi", &dt_hbi) == 0) { | |
| 384 | + u32 id = readl(syscfg->base + (master == VEXPRESS_SITE_DB1 ? | |
| 385 | + SYS_PROCID0 : SYS_PROCID1)); | |
| 386 | + u32 hbi = (id >> SYS_PROCIDx_HBI_SHIFT) & SYS_HBI_MASK; | |
| 387 | + | |
| 388 | + if (WARN_ON(dt_hbi != hbi)) | |
| 389 | + dev_warn(&pdev->dev, "DT HBI (%x) is not matching hardware (%x)!\n", | |
| 390 | + dt_hbi, hbi); | |
| 391 | + } | |
| 392 | + | |
| 364 | 393 | for_each_compatible_node(node, NULL, "arm,vexpress,config-bus") { |
| 365 | 394 | struct device_node *bridge_np; |
| 366 | 395 | |
| @@ -14,7 +14,6 @@ · 13 unmodified lines | ||
| 14 | 14 | #include <linux/platform_device.h> |
| 15 | 15 | #include <linux/slab.h> |
| 16 | 16 | #include <linux/stat.h> |
| 17 | −#include <linux/vexpress.h> | |
| 18 | 17 | |
| 19 | 18 | #define SYS_ID 0x000 |
| 20 | 19 | #define SYS_SW 0x004 |
| @@ -37,11 +36,6 @@ · 16 unmodified lines | ||
| 37 | 36 | #define SYS_CFGCTRL 0x0a4 |
| 38 | 37 | #define SYS_CFGSTAT 0x0a8 |
| 39 | 38 | |
| 40 | −#define SYS_HBI_MASK 0xfff | |
| 41 | −#define SYS_PROCIDx_HBI_SHIFT 0 | |
| 42 | − | |
| 43 | −#define SYS_MISC_MASTERSITE (1 << 14) | |
| 44 | − | |
| 45 | 39 | /* The sysreg block is just a random collection of various functions... */ |
| 46 | 40 | |
| 47 | 41 | static struct bgpio_pdata vexpress_sysreg_sys_led_pdata = { |
| @@ -94,7 +88,7 @@ static struct mfd_cell vexpress_sysreg_cells[] = { · 46 unmodified lines | ||
| 94 | 88 | .name = "vexpress-syscfg", |
| 95 | 89 | .num_resources = 1, |
| 96 | 90 | .resources = (struct resource []) { |
| 97 | − DEFINE_RES_MEM(SYS_CFGDATA, 0xc), | |
| 91 | + DEFINE_RES_MEM(SYS_MISC, 0x4c), | |
| 98 | 92 | }, |
| 99 | 93 | } |
| 100 | 94 | }; |
| @@ -104,8 +98,6 @@ static int vexpress_sysreg_probe(struct platform_device *pdev) · 3 unmodified lines | ||
| 104 | 98 | struct resource *mem; |
| 105 | 99 | void __iomem *base; |
| 106 | 100 | struct gpio_chip *mmc_gpio_chip; |
| 107 | − int master; | |
| 108 | − u32 dt_hbi; | |
| 109 | 101 | |
| 110 | 102 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 111 | 103 | if (!mem) |
| @@ -115,21 +107,6 @@ static int vexpress_sysreg_probe(struct platform_device *pdev) · 3 unmodified lines | ||
| 115 | 107 | if (!base) |
| 116 | 108 | return -ENOMEM; |
| 117 | 109 | |
| 118 | − master = readl(base + SYS_MISC) & SYS_MISC_MASTERSITE ? | |
| 119 | − VEXPRESS_SITE_DB2 : VEXPRESS_SITE_DB1; | |
| 120 | − vexpress_config_set_master(master); | |
| 121 | − | |
| 122 | − /* Confirm board type against DT property, if available */ | |
| 123 | − if (of_property_read_u32(of_root, "arm,hbi", &dt_hbi) == 0) { | |
| 124 | − u32 id = readl(base + (master == VEXPRESS_SITE_DB1 ? | |
| 125 | − SYS_PROCID0 : SYS_PROCID1)); | |
| 126 | − u32 hbi = (id >> SYS_PROCIDx_HBI_SHIFT) & SYS_HBI_MASK; | |
| 127 | − | |
| 128 | − if (WARN_ON(dt_hbi != hbi)) | |
| 129 | − dev_warn(&pdev->dev, "DT HBI (%x) is not matching hardware (%x)!\n", | |
| 130 | − dt_hbi, hbi); | |
| 131 | − } | |
| 132 | − | |
| 133 | 110 | /* |
| 134 | 111 | * Duplicated SYS_MCI pseudo-GPIO controller for compatibility with |
| 135 | 112 | * older trees using sysreg node for MMC control lines. |
| @@ -10,15 +10,6 @@ · 9 unmodified lines | ||
| 10 | 10 | #include <linux/device.h> |
| 11 | 11 | #include <linux/regmap.h> |
| 12 | 12 | |
| 13 | −#define VEXPRESS_SITE_MB 0 | |
| 14 | −#define VEXPRESS_SITE_DB1 1 | |
| 15 | −#define VEXPRESS_SITE_DB2 2 | |
| 16 | −#define VEXPRESS_SITE_MASTER 0xf | |
| 17 | − | |
| 18 | −/* Config infrastructure */ | |
| 19 | − | |
| 20 | −void vexpress_config_set_master(u32 site); | |
| 21 | − | |
| 22 | 13 | /* Config regmap API */ |
| 23 | 14 | |
| 24 | 15 | struct regmap *devm_regmap_init_vexpress_config(struct device *dev); |