dsa: microchip: ksz9477_sysfs: move to regmap

Signed-off-by: Heinrich Toews <ht@twx-software.de>
This commit is contained in:
Heinrich Toews
2026-02-26 15:48:11 +01:00
parent c6b83a8a18
commit 84f6b6b2b4
+26 -37
View File
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* KSZ9477 Sysfs Register Access
*
* KSZ9477 Sysfs Register Access (Bypassing Regmap Whitelist)
*/
#include <linux/device.h>
#include <linux/regmap.h> // NOTE: Required for direct regmap access
#include "ksz_common.h"
#include "ksz9477_reg.h"
@@ -18,44 +18,42 @@ static ssize_t ksz_read_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
u32 reg, value;
u32 reg, value = 0;
int ret, bit;
char end;
if (!g_kdev)
if (!g_kdev || !g_kdev->regmap)
return -EINVAL;
/* Parse remaining parameters, reject extra parameters */
ret = sscanf(buf, "%d %x%c", &bit, &reg, &end);
if (ret < 1) {
dev_err(dev, "%s: Can't parse REG address\n", __func__);
return -EINVAL;
}
if (ret > 1 && end != '\n') {
dev_err(dev, "%s: Extra parameters\n", __func__);
return -EINVAL;
}
if (ret < 1) return -EINVAL;
/*
* Use regmap_bulk_read to bypass the kernel's internal address
* validation. regmap_read would immediately return -EIO for
* 'illegal' addresses.
*/
switch(bit) {
case 8:
ret = ksz_read8(g_kdev, reg, (u8*)&value);
ret = regmap_bulk_read(g_kdev->regmap[0], reg, (u8*)&value, 1);
break;
case 16:
ret = ksz_read16(g_kdev, reg, (u16*)&value);
/* KSZ expects big-endian on the bus, regmap bulk handles that */
ret = regmap_bulk_read(g_kdev->regmap[1], reg, (u16*)&value, 1);
break;
case 32:
ret = ksz_read32(g_kdev, reg, &value);
ret = regmap_bulk_read(g_kdev->regmap[2], reg, &value, 1);
break;
default:
return -EINVAL;
}
if (ret < 0) {
dev_err(dev, "%s: read failed.\n", __func__);
dev_err(dev, "Read failed at 0x%x with error %d\n", reg, ret);
return ret;
}
dev_info(dev, "%d-bit read: reg 0x%04x: 0x%08x.\n", bit, reg, value);
return count;
}
static DEVICE_ATTR_WO(ksz_read);
@@ -68,41 +66,32 @@ static ssize_t ksz_write_store(struct device *dev,
int ret, bit;
char end;
if (!g_kdev)
if (!g_kdev || !g_kdev->regmap)
return -EINVAL;
/* Parse remaining parameters, reject extra parameters */
ret = sscanf(buf, "%d %x %x%c", &bit, &reg, &value, &end);
if (ret < 1) {
dev_err(dev, "%s: Can't parse register command\n", __func__);
return -EINVAL;
}
if (ret > 1 && end != '\n') {
dev_err(dev, "%s: Extra parameters\n", __func__);
return -EINVAL;
}
if (ret < 1) return -EINVAL;
switch(bit) {
case 8:
ret = ksz_write8(g_kdev, reg, (u8)value);
ret = regmap_bulk_write(g_kdev->regmap[0], reg, (u8*)&value, 1);
break;
case 16:
ret = ksz_write16(g_kdev, reg, (u16)value);
ret = regmap_bulk_write(g_kdev->regmap[1], reg, (u16*)&value, 1);
break;
case 32:
ret = ksz_write32(g_kdev, reg, value);
ret = regmap_bulk_write(g_kdev->regmap[2], reg, &value, 1);
break;
default:
return -EINVAL;
}
if (ret < 0) {
dev_err(dev, "%s: read failed.\n", __func__);
dev_err(dev, "Write failed at 0x%x\n", reg);
return ret;
}
dev_info(dev, "%d-bit write: reg 0x%04x value 0x%08x.\n",
bit, reg, value);
dev_info(dev, "%d-bit write: reg 0x%04x value 0x%08x.\n", bit, reg, value);
return count;
}
static DEVICE_ATTR_WO(ksz_write);