[PATCH 07/11] rockchip: efuse: Add support for RK3328
Kever Yang
kever.yang at rock-chips.com
Wed Feb 22 09:56:21 CET 2023
On 2023/2/16 07:48, Jonas Karlman wrote:
> Add support for rk3328 compatible.
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
> ---
> drivers/misc/rockchip-efuse.c | 45 +++++++++++++++++++++++++++++++++++
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> 1 file changed, 45 insertions(+)
>
> diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c
> index 808246e92230..7aa3dc1b3868 100644
> --- a/drivers/misc/rockchip-efuse.c
> +++ b/drivers/misc/rockchip-efuse.c
> @@ -13,6 +13,7 @@
> #include <dm.h>
> #include <linux/bitops.h>
> #include <linux/delay.h>
> +#include <linux/iopoll.h>
> #include <malloc.h>
> #include <misc.h>
>
> @@ -31,6 +32,12 @@
> #define EFUSE_STROBE BIT(1)
> #define EFUSE_CSB BIT(0)
> #define EFUSE_DOUT 0x0004
> +#define RK3328_INT_STATUS 0x0018
> +#define RK3328_INT_FINISH BIT(0)
> +#define RK3328_DOUT 0x0020
> +#define RK3328_AUTO_CTRL 0x0024
> +#define RK3328_AUTO_RD BIT(1)
> +#define RK3328_AUTO_ENB BIT(0)
>
> struct rockchip_efuse_plat {
> void __iomem *base;
> @@ -38,6 +45,7 @@ struct rockchip_efuse_plat {
>
> struct rockchip_efuse_data {
> int (*read)(struct udevice *dev, int offset, void *buf, int size);
> + int offset;
> int size;
> int block_size;
> };
> @@ -103,6 +111,30 @@ static int rockchip_rk3288_efuse_read(struct udevice *dev, int offset,
> return 0;
> }
>
> +static int rockchip_rk3328_efuse_read(struct udevice *dev, int offset,
> + void *buf, int size)
> +{
> + struct rockchip_efuse_plat *efuse = dev_get_plat(dev);
> + u32 status, *buffer = buf;
> + int ret;
> +
> + while (size--) {
> + writel(RK3328_AUTO_RD | RK3328_AUTO_ENB | RK3399_ADDR(offset++),
> + efuse->base + RK3328_AUTO_CTRL);
> + udelay(1);
> +
> + ret = readl_poll_sleep_timeout(efuse->base + RK3328_INT_STATUS,
> + status, (status & RK3328_INT_FINISH), 1, 50);
> + if (ret)
> + return ret;
> +
> + *buffer++ = readl(efuse->base + RK3328_DOUT);
> + writel(RK3328_INT_FINISH, efuse->base + RK3328_INT_STATUS);
> + }
> +
> + return 0;
> +}
> +
> static int rockchip_rk3399_efuse_read(struct udevice *dev, int offset,
> void *buf, int size)
> {
> @@ -144,6 +176,8 @@ static int rockchip_efuse_read(struct udevice *dev, int offset,
> if (!data->read)
> return -ENOSYS;
>
> + offset += data->offset;
> +
> if (data->block_size <= 1)
> return data->read(dev, offset, buf, size);
>
> @@ -182,6 +216,13 @@ static const struct rockchip_efuse_data rk3288_data = {
> .size = 0x20,
> };
>
> +static const struct rockchip_efuse_data rk3328_data = {
> + .read = rockchip_rk3328_efuse_read,
> + .offset = 0x60,
> + .size = 0x20,
> + .block_size = 4,
> +};
> +
> static const struct rockchip_efuse_data rk3399_data = {
> .read = rockchip_rk3399_efuse_read,
> .size = 0x80,
> @@ -205,6 +246,10 @@ static const struct udevice_id rockchip_efuse_ids[] = {
> .compatible = "rockchip,rk3288-efuse",
> .data = (ulong)&rk3288_data,
> },
> + {
> + .compatible = "rockchip,rk3328-efuse",
> + .data = (ulong)&rk3328_data,
> + },
> {
> .compatible = "rockchip,rk3399-efuse",
> .data = (ulong)&rk3399_data,
More information about the U-Boot
mailing list