mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From edd25a77e69b7c546c28077e5dffe72c54c0afe8 Mon Sep 17 00:00:00 2001
 | |
| From: Linus Walleij <linus.walleij@linaro.org>
 | |
| 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 <linus.walleij@linaro.org>
 | |
| ---
 | |
|  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);
 | |
|  
 |