1 // SPDX-License-Identifier: GPL-2.0
3 * MMIO register bitfield-controlled multiplexer driver
4 * Based on the linux mmio multiplexer driver
6 * Copyright (C) 2017 Pengutronix, Philipp Zabel <kernel@pengutronix.de>
7 * Copyright (C) 2019 Texas Instrument, Jean-jacques Hiblot <jjhiblot@ti.com>
11 #include <mux-internal.h>
14 #include <dm/device.h>
15 #include <dm/device-internal.h>
16 #include <dm/device_compat.h>
18 #include <dm/devres.h>
19 #include <dt-bindings/mux/mux.h>
20 #include <linux/bitops.h>
22 static int mux_mmio_set(struct mux_control *mux, int state)
24 struct regmap_field **fields = dev_get_priv(mux->dev);
26 return regmap_field_write(fields[mux_control_get_index(mux)], state);
29 static const struct mux_control_ops mux_mmio_ops = {
33 static const struct udevice_id mmio_mux_of_match[] = {
34 { .compatible = "mmio-mux" },
38 static int mmio_mux_probe(struct udevice *dev)
40 struct regmap_field **fields;
41 struct mux_chip *mux_chip = dev_get_uclass_priv(dev);
42 struct regmap *regmap;
49 regmap = syscon_node_to_regmap(dev_ofnode(dev->parent));
51 ret = PTR_ERR(regmap);
52 dev_err(dev, "failed to get regmap: %d\n", ret);
56 num_fields = dev_read_size(dev, "mux-reg-masks");
58 return log_msg_ret("mux-reg-masks missing", -EINVAL);
60 num_fields /= sizeof(u32);
61 if (num_fields == 0 || num_fields % 2)
63 num_fields = num_fields / 2;
65 ret = mux_alloc_controllers(dev, num_fields);
67 return log_msg_ret("mux_alloc_controllers", ret);
69 fields = devm_kmalloc(dev, num_fields * sizeof(*fields), __GFP_ZERO);
72 dev_set_priv(dev, fields);
74 mux_reg_masks = devm_kmalloc(dev, num_fields * 2 * sizeof(u32),
79 ret = dev_read_u32_array(dev, "mux-reg-masks", mux_reg_masks,
82 return log_msg_ret("mux-reg-masks read", ret);
84 idle_states = devm_kmalloc(dev, num_fields * sizeof(u32), __GFP_ZERO);
88 ret = dev_read_u32_array(dev, "idle-states", idle_states, num_fields);
90 log_err("idle-states");
91 devm_kfree(dev, idle_states);
95 for (i = 0; i < num_fields; i++) {
96 struct mux_control *mux = &mux_chip->mux[i];
97 struct reg_field field;
101 reg = mux_reg_masks[2 * i];
102 mask = mux_reg_masks[2 * i + 1];
105 field.msb = fls(mask) - 1;
106 field.lsb = ffs(mask) - 1;
108 if (mask != GENMASK(field.msb, field.lsb))
109 return log_msg_ret("invalid mask", -EINVAL);
111 fields[i] = devm_regmap_field_alloc(dev, regmap, field);
112 if (IS_ERR(fields[i])) {
113 ret = PTR_ERR(fields[i]);
114 return log_msg_ret("regmap_field_alloc", ret);
117 bits = 1 + field.msb - field.lsb;
118 mux->states = 1 << bits;
123 if (idle_states[i] != MUX_IDLE_AS_IS &&
124 idle_states[i] >= mux->states)
125 return log_msg_ret("idle-states range", -EINVAL);
127 mux->idle_state = idle_states[i];
130 devm_kfree(dev, mux_reg_masks);
132 devm_kfree(dev, idle_states);
137 U_BOOT_DRIVER(mmio_mux) = {
140 .of_match = mmio_mux_of_match,
141 .probe = mmio_mux_probe,
142 .ops = &mux_mmio_ops,