[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