summaryrefslogtreecommitdiff
path: root/drivers/pinctrl/pinctrl-single.c
diff options
context:
space:
mode:
authorDario Binacchi <dariobin@libero.it>2021-04-11 10:39:50 +0300
committerLokesh Vutla <lokeshvutla@ti.com>2021-04-12 08:47:15 +0300
commit5532262d46a38dc5b973d7ac0977241b4c850e71 (patch)
tree9d32c519811c3480dc155c05bb46b237d11c2078 /drivers/pinctrl/pinctrl-single.c
parent76d470de1a3c323823f5c4096a797e366cd225b0 (diff)
downloadu-boot-5532262d46a38dc5b973d7ac0977241b4c850e71.tar.xz
test: pinmux: add test for 'pinctrl-single' driver
The test adds two pinmux nodes to the device tree, one to test when a register changes only one pin's mux (pinctrl-single,pins), and the other to test when more than one pin's mux is changed (pinctrl-single,bits). This required replacing the controller's register access functions when the driver is used on sandbox. Signed-off-by: Dario Binacchi <dariobin@libero.it> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-single.c')
-rw-r--r--drivers/pinctrl/pinctrl-single.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index 3ddb637ab7..48bdd0f6f5 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -51,6 +51,9 @@ struct single_func {
* @pin_name: temporary buffer to store the pin name
*/
struct single_priv {
+#if (IS_ENABLED(CONFIG_SANDBOX))
+ u32 *sandbox_regs;
+#endif
unsigned int bits_per_pin;
unsigned int npins;
char pin_name[PINNAME_SIZE];
@@ -87,6 +90,8 @@ struct single_fdt_bits_cfg {
fdt32_t mask;
};
+#if (!IS_ENABLED(CONFIG_SANDBOX))
+
static unsigned int single_read(struct udevice *dev, fdt_addr_t reg)
{
struct single_pdata *pdata = dev_get_plat(dev);
@@ -119,6 +124,24 @@ static void single_write(struct udevice *dev, unsigned int val, fdt_addr_t reg)
}
}
+#else /* CONFIG_SANDBOX */
+
+static unsigned int single_read(struct udevice *dev, fdt_addr_t reg)
+{
+ struct single_priv *priv = dev_get_priv(dev);
+
+ return priv->sandbox_regs[reg];
+}
+
+static void single_write(struct udevice *dev, unsigned int val, fdt_addr_t reg)
+{
+ struct single_priv *priv = dev_get_priv(dev);
+
+ priv->sandbox_regs[reg] = val;
+}
+
+#endif /* CONFIG_SANDBOX */
+
/**
* single_get_pin_by_offset() - get a pin based on the register offset
* @dev: single driver instance
@@ -436,6 +459,14 @@ static int single_probe(struct udevice *dev)
INIT_LIST_HEAD(&priv->functions);
size = pdata->offset + pdata->width / BITS_PER_BYTE;
+ #if (CONFIG_IS_ENABLED(SANDBOX))
+ priv->sandbox_regs =
+ devm_kzalloc(dev, size * sizeof(*priv->sandbox_regs),
+ GFP_KERNEL);
+ if (!priv->sandbox_regs)
+ return -ENOMEM;
+ #endif
+
priv->npins = size / (pdata->width / BITS_PER_BYTE);
if (pdata->bits_per_mux) {
priv->bits_per_pin = fls(pdata->mask);