123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- From edd25a77e69b7c546c28077e5dffe72c54c0afe8 Mon Sep 17 00:00:00 2001
- From: Linus Walleij <[email protected]>
- Date: Thu, 21 Sep 2023 22:18:12 +0200
- Subject: [PATCH 2/4] rtc: rtc7301: Support byte-addressed IO
- The old RTC7301 driver in OpenWrt used byte access, but the
- current mainline Linux driver uses 32bit word access.
- Make this configurable using device properties using the
- standard property "reg-io-width" in e.g. device tree.
- This is needed for the USRobotics USR8200 which has the
- chip connected using byte accesses.
- Debugging and testing by Howard Harte.
- Signed-off-by: Linus Walleij <[email protected]>
- ---
- drivers/rtc/rtc-r7301.c | 35 +++++++++++++++++++++++++++++++++--
- 1 file changed, 33 insertions(+), 2 deletions(-)
- --- a/drivers/rtc/rtc-r7301.c
- +++ b/drivers/rtc/rtc-r7301.c
- @@ -14,6 +14,7 @@
- #include <linux/module.h>
- #include <linux/mod_devicetable.h>
- #include <linux/delay.h>
- +#include <linux/property.h>
- #include <linux/regmap.h>
- #include <linux/platform_device.h>
- #include <linux/rtc.h>
- @@ -55,12 +56,23 @@ struct rtc7301_priv {
- u8 bank;
- };
-
- -static const struct regmap_config rtc7301_regmap_config = {
- +/*
- + * When the device is memory-mapped, some platforms pack the registers into
- + * 32-bit access using the lower 8 bits at each 4-byte stride, while others
- + * expose them as simply consecutive bytes.
- + */
- +static const struct regmap_config rtc7301_regmap_32_config = {
- .reg_bits = 32,
- .val_bits = 8,
- .reg_stride = 4,
- };
-
- +static const struct regmap_config rtc7301_regmap_8_config = {
- + .reg_bits = 8,
- + .val_bits = 8,
- + .reg_stride = 1,
- +};
- +
- static u8 rtc7301_read(struct rtc7301_priv *priv, unsigned int reg)
- {
- int reg_stride = regmap_get_reg_stride(priv->regmap);
- @@ -356,7 +368,9 @@ static int __init rtc7301_rtc_probe(stru
- void __iomem *regs;
- struct rtc7301_priv *priv;
- struct rtc_device *rtc;
- + static const struct regmap_config *mapconf;
- int ret;
- + u32 val;
-
- priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- @@ -366,8 +380,25 @@ static int __init rtc7301_rtc_probe(stru
- if (IS_ERR(regs))
- return PTR_ERR(regs);
-
- + ret = device_property_read_u32(&dev->dev, "reg-io-width", &val);
- + if (ret)
- + /* Default to 32bit accesses */
- + val = 4;
- +
- + switch (val) {
- + case 1:
- + mapconf = &rtc7301_regmap_8_config;
- + break;
- + case 4:
- + mapconf = &rtc7301_regmap_32_config;
- + break;
- + default:
- + dev_err(&dev->dev, "invalid reg-io-width %d\n", val);
- + return -EINVAL;
- + }
- +
- priv->regmap = devm_regmap_init_mmio(&dev->dev, regs,
- - &rtc7301_regmap_config);
- + mapconf);
- if (IS_ERR(priv->regmap))
- return PTR_ERR(priv->regmap);
-
|