sfctemp
ret = reset_control_deassert(sfctemp->rst_bus);
ret = clk_prepare_enable(sfctemp->clk_sense);
ret = reset_control_deassert(sfctemp->rst_sense);
sfctemp_power_up(sfctemp);
sfctemp_run(sfctemp);
sfctemp->enabled = true;
clk_disable_unprepare(sfctemp->clk_sense);
reset_control_assert(sfctemp->rst_bus);
clk_disable_unprepare(sfctemp->clk_bus);
static int sfctemp_disable(struct sfctemp *sfctemp)
if (!sfctemp->enabled)
sfctemp_stop(sfctemp);
sfctemp_power_down(sfctemp);
reset_control_assert(sfctemp->rst_sense);
clk_disable_unprepare(sfctemp->clk_sense);
reset_control_assert(sfctemp->rst_bus);
clk_disable_unprepare(sfctemp->clk_bus);
sfctemp->enabled = false;
static int sfctemp_convert(struct sfctemp *sfctemp, long *val)
if (!sfctemp->enabled)
*val = (long)((readl(sfctemp->regs) & SFCTEMP_DOUT_MSK) >> SFCTEMP_DOUT_POS)
struct sfctemp *sfctemp = dev_get_drvdata(dev);
*val = sfctemp->enabled;
return sfctemp_convert(sfctemp, val);
struct sfctemp *sfctemp = dev_get_drvdata(dev);
return sfctemp_disable(sfctemp);
return sfctemp_enable(sfctemp);
struct sfctemp *sfctemp;
sfctemp = devm_kzalloc(dev, sizeof(*sfctemp), GFP_KERNEL);
if (!sfctemp)
dev_set_drvdata(dev, sfctemp);
sfctemp->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(sfctemp->regs))
return PTR_ERR(sfctemp->regs);
sfctemp->clk_sense = devm_clk_get(dev, "sense");
if (IS_ERR(sfctemp->clk_sense))
return dev_err_probe(dev, PTR_ERR(sfctemp->clk_sense),
sfctemp->clk_bus = devm_clk_get(dev, "bus");
if (IS_ERR(sfctemp->clk_bus))
return dev_err_probe(dev, PTR_ERR(sfctemp->clk_bus),
sfctemp->rst_sense = devm_reset_control_get_exclusive(dev, "sense");
if (IS_ERR(sfctemp->rst_sense))
return dev_err_probe(dev, PTR_ERR(sfctemp->rst_sense),
sfctemp->rst_bus = devm_reset_control_get_exclusive(dev, "bus");
if (IS_ERR(sfctemp->rst_bus))
return dev_err_probe(dev, PTR_ERR(sfctemp->rst_bus),
ret = reset_control_assert(sfctemp->rst_sense);
ret = reset_control_assert(sfctemp->rst_bus);
ret = devm_add_action(dev, sfctemp_disable_action, sfctemp);
ret = sfctemp_enable(sfctemp);
hwmon_dev = devm_hwmon_device_register_with_info(dev, "sfctemp", sfctemp,
static void sfctemp_power_up(struct sfctemp *sfctemp)
writel(SFCTEMP_PD, sfctemp->regs);
writel(0, sfctemp->regs);
writel(SFCTEMP_RSTN, sfctemp->regs);
static void sfctemp_power_down(struct sfctemp *sfctemp)
writel(SFCTEMP_PD, sfctemp->regs);
static void sfctemp_run(struct sfctemp *sfctemp)
writel(SFCTEMP_RSTN | SFCTEMP_RUN, sfctemp->regs);
static void sfctemp_stop(struct sfctemp *sfctemp)
writel(SFCTEMP_RSTN, sfctemp->regs);
static int sfctemp_enable(struct sfctemp *sfctemp)
if (sfctemp->enabled)
ret = clk_prepare_enable(sfctemp->clk_bus);