struct reset_control_ops{
int (*reset)(struct reset_controller_dev *rcdev, unsigned long id);//复位+解复位
int (*assert)(struct reset_controller_dev *rcdev, unsigned long id);//复位
int (*deassert)(struct reset_controller_dev *rcdev, unsigned long id);//解复位
int (*status)(struct reset_controller_dev *rcdev, unsigned long id);//复位状态查询
}
驱动核心接口(assert、deassert)实现
//file: linux_5.10/drivers/reset/reset-xxx.c
static int xx_reset_assert(struct reset_controller_dev *rcdev,
unsigned long id)
{
// 将reset id转换为对应的 寄存器和bit,对该bit写0。
// soc xx181x实现
int bank = id / 32;
int offset = id % 32;
spin_lock_irqsave(&data->lock, flags);
// 将该bit置 0
reg = readl(data->membase + (bank * 4));
writel(reg & ~BIT(offset), data->membase + (bank * 4));
spin_unlock_irqrestore(&data->lock, flags);
return 0;
}
static int xx_reset_deassert(struct reset_controller_dev *rcdev,
unsigned long id)
{
// 将reset id转换为对应的 寄存器和bit,对该bit写1。
// soc xx181x实现同上,置0改为置1
return 0;
}
static const struct reset_control_ops bm_reset_ops = {
.assert = xxx_reset_assert,
.deassert = xxx_reset_deassert,
};