On Fri, May 17, 2019 at 01:51:56AM +0800, Frank Lee wrote: > > > +struct sun50i_thermal_chip { > > > + int sensor_num; > > > + int offset; > > > + int scale; > > > + int ft_deviation; > > > + int temp_calib_base; > > > + int temp_data_base; > > > + int (*enable)(struct tsens_device *tmdev); > > > + int (*disable)(struct tsens_device *tmdev); > > > +}; > > > > I'm not super fond of having a lot of quirks that are not needed. If > > we ever need those quirks when adding support for a new SoC, then > > yeah, we should totally have some, but only when and if it's needed. > > > > Otherwise, the driver is more complicated for no particular reason. > > This is unavoidable because of the difference in soc. I know, but this isn't my point. My point is that at this time of the driver development, we don't know what is going to be needed to support all of those SoCs. Some of the parameters you added might not be needed, some parameters might be missing, we don't know. So let's keep it simple for now. > > > +static int tsens_probe(struct platform_device *pdev) > > > +{ > > > + struct tsens_device *tmdev; > > > + struct device *dev = &pdev->dev; > > > + int ret; > > > + > > > + tmdev = devm_kzalloc(dev, sizeof(*tmdev), GFP_KERNEL); > > > + if (!tmdev) > > > + return -ENOMEM; > > > + > > > + tmdev->dev = dev; > > > + tmdev->chip = of_device_get_match_data(&pdev->dev); > > > + if (!tmdev->chip) > > > + return -EINVAL; > > > + > > > + ret = tsens_init(tmdev); > > > + if (ret) > > > + return ret; > > > + > > > + ret = tsens_register(tmdev); > > > + if (ret) > > > + return ret; > > > + > > > + ret = tmdev->chip->enable(tmdev); > > > + if (ret) > > > + return ret; > > > > > > + platform_set_drvdata(pdev, tmdev); > > > > Your registration should be the very last thing you do. Otherwise, you > > have a small window where the get_temp callback can be called, but the > > driver will not be functional yet. > > No. Anyway, ths data qcquisition is ms level. That's kind of irrelevant. There's nothing preventing get_temp to be called right away. > > > + ret = tsens_calibrate(tmdev); > > > + if (ret) > > > + return ret; > > > + > > > + /* > > > + * clkin = 24MHz > > > + * T acquire = clkin / (SUN50I_THS_CTRL0_T_ACQ + 1) > > > + * = 20us > > > + */ > > > + regmap_write(tmdev->regmap, SUN50I_THS_CTRL0, > > > + SUN50I_THS_CTRL0_T_ACQ(479)); > > > + /* average over 4 samples */ > > > + regmap_write(tmdev->regmap, SUN50I_H6_THS_MFC, > > > + SUN50I_THS_FILTER_EN | > > > + SUN50I_THS_FILTER_TYPE(1)); > > > + /* period = (SUN50I_H6_THS_PC_TEMP_PERIOD + 1) * 4096 / clkin; ~10ms */ > > > + regmap_write(tmdev->regmap, SUN50I_H6_THS_PC, > > > + SUN50I_H6_THS_PC_TEMP_PERIOD(58)); > > > + /* enable sensor */ > > > + val = GENMASK(tmdev->chip->sensor_num - 1, 0); > > > + regmap_write(tmdev->regmap, SUN50I_H6_THS_ENABLE, val); > > > + > > > + return 0; > > > + > > > +assert_reset: > > > + reset_control_assert(tmdev->reset); > > > + > > > + return ret; > > > > Can't we do that with runtime_pm? > > Saving energy doesn't make much sense compared to system security. I'm not sure what you mean by security. Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
Attachment:
signature.asc
Description: PGP signature