0001
0002
0003
0004
0005
0006
0007 #include <linux/module.h>
0008 #include <linux/platform_device.h>
0009 #include <linux/interrupt.h>
0010 #include <linux/io.h>
0011 #include <linux/of.h>
0012 #include <linux/of_device.h>
0013 #include <linux/clk.h>
0014 #include <linux/completion.h>
0015 #include <linux/delay.h>
0016 #include <linux/reset.h>
0017 #include <linux/regulator/consumer.h>
0018 #include <linux/iio/buffer.h>
0019 #include <linux/iio/iio.h>
0020 #include <linux/iio/trigger_consumer.h>
0021 #include <linux/iio/triggered_buffer.h>
0022
0023 #define SARADC_DATA 0x00
0024
0025 #define SARADC_STAS 0x04
0026 #define SARADC_STAS_BUSY BIT(0)
0027
0028 #define SARADC_CTRL 0x08
0029 #define SARADC_CTRL_IRQ_STATUS BIT(6)
0030 #define SARADC_CTRL_IRQ_ENABLE BIT(5)
0031 #define SARADC_CTRL_POWER_CTRL BIT(3)
0032 #define SARADC_CTRL_CHN_MASK 0x7
0033
0034 #define SARADC_DLY_PU_SOC 0x0c
0035 #define SARADC_DLY_PU_SOC_MASK 0x3f
0036
0037 #define SARADC_TIMEOUT msecs_to_jiffies(100)
0038 #define SARADC_MAX_CHANNELS 8
0039
0040 struct rockchip_saradc_data {
0041 const struct iio_chan_spec *channels;
0042 int num_channels;
0043 unsigned long clk_rate;
0044 };
0045
0046 struct rockchip_saradc {
0047 void __iomem *regs;
0048 struct clk *pclk;
0049 struct clk *clk;
0050 struct completion completion;
0051 struct regulator *vref;
0052 int uv_vref;
0053 struct reset_control *reset;
0054 const struct rockchip_saradc_data *data;
0055 u16 last_val;
0056 const struct iio_chan_spec *last_chan;
0057 struct notifier_block nb;
0058 };
0059
0060 static void rockchip_saradc_power_down(struct rockchip_saradc *info)
0061 {
0062
0063 writel_relaxed(0, info->regs + SARADC_CTRL);
0064 }
0065
0066 static int rockchip_saradc_conversion(struct rockchip_saradc *info,
0067 struct iio_chan_spec const *chan)
0068 {
0069 reinit_completion(&info->completion);
0070
0071
0072 writel_relaxed(8, info->regs + SARADC_DLY_PU_SOC);
0073
0074 info->last_chan = chan;
0075
0076
0077 writel(SARADC_CTRL_POWER_CTRL
0078 | (chan->channel & SARADC_CTRL_CHN_MASK)
0079 | SARADC_CTRL_IRQ_ENABLE,
0080 info->regs + SARADC_CTRL);
0081
0082 if (!wait_for_completion_timeout(&info->completion, SARADC_TIMEOUT))
0083 return -ETIMEDOUT;
0084
0085 return 0;
0086 }
0087
0088 static int rockchip_saradc_read_raw(struct iio_dev *indio_dev,
0089 struct iio_chan_spec const *chan,
0090 int *val, int *val2, long mask)
0091 {
0092 struct rockchip_saradc *info = iio_priv(indio_dev);
0093 int ret;
0094
0095 switch (mask) {
0096 case IIO_CHAN_INFO_RAW:
0097 mutex_lock(&indio_dev->mlock);
0098
0099 ret = rockchip_saradc_conversion(info, chan);
0100 if (ret) {
0101 rockchip_saradc_power_down(info);
0102 mutex_unlock(&indio_dev->mlock);
0103 return ret;
0104 }
0105
0106 *val = info->last_val;
0107 mutex_unlock(&indio_dev->mlock);
0108 return IIO_VAL_INT;
0109 case IIO_CHAN_INFO_SCALE:
0110 *val = info->uv_vref / 1000;
0111 *val2 = chan->scan_type.realbits;
0112 return IIO_VAL_FRACTIONAL_LOG2;
0113 default:
0114 return -EINVAL;
0115 }
0116 }
0117
0118 static irqreturn_t rockchip_saradc_isr(int irq, void *dev_id)
0119 {
0120 struct rockchip_saradc *info = dev_id;
0121
0122
0123 info->last_val = readl_relaxed(info->regs + SARADC_DATA);
0124 info->last_val &= GENMASK(info->last_chan->scan_type.realbits - 1, 0);
0125
0126 rockchip_saradc_power_down(info);
0127
0128 complete(&info->completion);
0129
0130 return IRQ_HANDLED;
0131 }
0132
0133 static const struct iio_info rockchip_saradc_iio_info = {
0134 .read_raw = rockchip_saradc_read_raw,
0135 };
0136
0137 #define SARADC_CHANNEL(_index, _id, _res) { \
0138 .type = IIO_VOLTAGE, \
0139 .indexed = 1, \
0140 .channel = _index, \
0141 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
0142 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
0143 .datasheet_name = _id, \
0144 .scan_index = _index, \
0145 .scan_type = { \
0146 .sign = 'u', \
0147 .realbits = _res, \
0148 .storagebits = 16, \
0149 .endianness = IIO_CPU, \
0150 }, \
0151 }
0152
0153 static const struct iio_chan_spec rockchip_saradc_iio_channels[] = {
0154 SARADC_CHANNEL(0, "adc0", 10),
0155 SARADC_CHANNEL(1, "adc1", 10),
0156 SARADC_CHANNEL(2, "adc2", 10),
0157 };
0158
0159 static const struct rockchip_saradc_data saradc_data = {
0160 .channels = rockchip_saradc_iio_channels,
0161 .num_channels = ARRAY_SIZE(rockchip_saradc_iio_channels),
0162 .clk_rate = 1000000,
0163 };
0164
0165 static const struct iio_chan_spec rockchip_rk3066_tsadc_iio_channels[] = {
0166 SARADC_CHANNEL(0, "adc0", 12),
0167 SARADC_CHANNEL(1, "adc1", 12),
0168 };
0169
0170 static const struct rockchip_saradc_data rk3066_tsadc_data = {
0171 .channels = rockchip_rk3066_tsadc_iio_channels,
0172 .num_channels = ARRAY_SIZE(rockchip_rk3066_tsadc_iio_channels),
0173 .clk_rate = 50000,
0174 };
0175
0176 static const struct iio_chan_spec rockchip_rk3399_saradc_iio_channels[] = {
0177 SARADC_CHANNEL(0, "adc0", 10),
0178 SARADC_CHANNEL(1, "adc1", 10),
0179 SARADC_CHANNEL(2, "adc2", 10),
0180 SARADC_CHANNEL(3, "adc3", 10),
0181 SARADC_CHANNEL(4, "adc4", 10),
0182 SARADC_CHANNEL(5, "adc5", 10),
0183 };
0184
0185 static const struct rockchip_saradc_data rk3399_saradc_data = {
0186 .channels = rockchip_rk3399_saradc_iio_channels,
0187 .num_channels = ARRAY_SIZE(rockchip_rk3399_saradc_iio_channels),
0188 .clk_rate = 1000000,
0189 };
0190
0191 static const struct iio_chan_spec rockchip_rk3568_saradc_iio_channels[] = {
0192 SARADC_CHANNEL(0, "adc0", 10),
0193 SARADC_CHANNEL(1, "adc1", 10),
0194 SARADC_CHANNEL(2, "adc2", 10),
0195 SARADC_CHANNEL(3, "adc3", 10),
0196 SARADC_CHANNEL(4, "adc4", 10),
0197 SARADC_CHANNEL(5, "adc5", 10),
0198 SARADC_CHANNEL(6, "adc6", 10),
0199 SARADC_CHANNEL(7, "adc7", 10),
0200 };
0201
0202 static const struct rockchip_saradc_data rk3568_saradc_data = {
0203 .channels = rockchip_rk3568_saradc_iio_channels,
0204 .num_channels = ARRAY_SIZE(rockchip_rk3568_saradc_iio_channels),
0205 .clk_rate = 1000000,
0206 };
0207
0208 static const struct of_device_id rockchip_saradc_match[] = {
0209 {
0210 .compatible = "rockchip,saradc",
0211 .data = &saradc_data,
0212 }, {
0213 .compatible = "rockchip,rk3066-tsadc",
0214 .data = &rk3066_tsadc_data,
0215 }, {
0216 .compatible = "rockchip,rk3399-saradc",
0217 .data = &rk3399_saradc_data,
0218 }, {
0219 .compatible = "rockchip,rk3568-saradc",
0220 .data = &rk3568_saradc_data,
0221 },
0222 {},
0223 };
0224 MODULE_DEVICE_TABLE(of, rockchip_saradc_match);
0225
0226
0227
0228
0229 static void rockchip_saradc_reset_controller(struct reset_control *reset)
0230 {
0231 reset_control_assert(reset);
0232 usleep_range(10, 20);
0233 reset_control_deassert(reset);
0234 }
0235
0236 static void rockchip_saradc_clk_disable(void *data)
0237 {
0238 struct rockchip_saradc *info = data;
0239
0240 clk_disable_unprepare(info->clk);
0241 }
0242
0243 static void rockchip_saradc_pclk_disable(void *data)
0244 {
0245 struct rockchip_saradc *info = data;
0246
0247 clk_disable_unprepare(info->pclk);
0248 }
0249
0250 static void rockchip_saradc_regulator_disable(void *data)
0251 {
0252 struct rockchip_saradc *info = data;
0253
0254 regulator_disable(info->vref);
0255 }
0256
0257 static irqreturn_t rockchip_saradc_trigger_handler(int irq, void *p)
0258 {
0259 struct iio_poll_func *pf = p;
0260 struct iio_dev *i_dev = pf->indio_dev;
0261 struct rockchip_saradc *info = iio_priv(i_dev);
0262
0263
0264
0265
0266 struct {
0267 u16 values[SARADC_MAX_CHANNELS];
0268 int64_t timestamp;
0269 } data;
0270 int ret;
0271 int i, j = 0;
0272
0273 mutex_lock(&i_dev->mlock);
0274
0275 for_each_set_bit(i, i_dev->active_scan_mask, i_dev->masklength) {
0276 const struct iio_chan_spec *chan = &i_dev->channels[i];
0277
0278 ret = rockchip_saradc_conversion(info, chan);
0279 if (ret) {
0280 rockchip_saradc_power_down(info);
0281 goto out;
0282 }
0283
0284 data.values[j] = info->last_val;
0285 j++;
0286 }
0287
0288 iio_push_to_buffers_with_timestamp(i_dev, &data, iio_get_time_ns(i_dev));
0289 out:
0290 mutex_unlock(&i_dev->mlock);
0291
0292 iio_trigger_notify_done(i_dev->trig);
0293
0294 return IRQ_HANDLED;
0295 }
0296
0297 static int rockchip_saradc_volt_notify(struct notifier_block *nb,
0298 unsigned long event,
0299 void *data)
0300 {
0301 struct rockchip_saradc *info =
0302 container_of(nb, struct rockchip_saradc, nb);
0303
0304 if (event & REGULATOR_EVENT_VOLTAGE_CHANGE)
0305 info->uv_vref = (unsigned long)data;
0306
0307 return NOTIFY_OK;
0308 }
0309
0310 static void rockchip_saradc_regulator_unreg_notifier(void *data)
0311 {
0312 struct rockchip_saradc *info = data;
0313
0314 regulator_unregister_notifier(info->vref, &info->nb);
0315 }
0316
0317 static int rockchip_saradc_probe(struct platform_device *pdev)
0318 {
0319 struct rockchip_saradc *info = NULL;
0320 struct device_node *np = pdev->dev.of_node;
0321 struct iio_dev *indio_dev = NULL;
0322 const struct of_device_id *match;
0323 int ret;
0324 int irq;
0325
0326 if (!np)
0327 return -ENODEV;
0328
0329 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
0330 if (!indio_dev) {
0331 dev_err(&pdev->dev, "failed allocating iio device\n");
0332 return -ENOMEM;
0333 }
0334 info = iio_priv(indio_dev);
0335
0336 match = of_match_device(rockchip_saradc_match, &pdev->dev);
0337 if (!match) {
0338 dev_err(&pdev->dev, "failed to match device\n");
0339 return -ENODEV;
0340 }
0341
0342 info->data = match->data;
0343
0344
0345 if (info->data->num_channels > SARADC_MAX_CHANNELS) {
0346 dev_err(&pdev->dev, "max channels exceeded");
0347 return -EINVAL;
0348 }
0349
0350 info->regs = devm_platform_ioremap_resource(pdev, 0);
0351 if (IS_ERR(info->regs))
0352 return PTR_ERR(info->regs);
0353
0354
0355
0356
0357
0358 info->reset = devm_reset_control_get_exclusive(&pdev->dev,
0359 "saradc-apb");
0360 if (IS_ERR(info->reset)) {
0361 ret = PTR_ERR(info->reset);
0362 if (ret != -ENOENT)
0363 return dev_err_probe(&pdev->dev, ret,
0364 "failed to get saradc-apb\n");
0365
0366 dev_dbg(&pdev->dev, "no reset control found\n");
0367 info->reset = NULL;
0368 }
0369
0370 init_completion(&info->completion);
0371
0372 irq = platform_get_irq(pdev, 0);
0373 if (irq < 0)
0374 return dev_err_probe(&pdev->dev, irq, "failed to get irq\n");
0375
0376 ret = devm_request_irq(&pdev->dev, irq, rockchip_saradc_isr,
0377 0, dev_name(&pdev->dev), info);
0378 if (ret < 0) {
0379 dev_err(&pdev->dev, "failed requesting irq %d\n", irq);
0380 return ret;
0381 }
0382
0383 info->pclk = devm_clk_get(&pdev->dev, "apb_pclk");
0384 if (IS_ERR(info->pclk))
0385 return dev_err_probe(&pdev->dev, PTR_ERR(info->pclk),
0386 "failed to get pclk\n");
0387
0388 info->clk = devm_clk_get(&pdev->dev, "saradc");
0389 if (IS_ERR(info->clk))
0390 return dev_err_probe(&pdev->dev, PTR_ERR(info->clk),
0391 "failed to get adc clock\n");
0392
0393 info->vref = devm_regulator_get(&pdev->dev, "vref");
0394 if (IS_ERR(info->vref))
0395 return dev_err_probe(&pdev->dev, PTR_ERR(info->vref),
0396 "failed to get regulator\n");
0397
0398 if (info->reset)
0399 rockchip_saradc_reset_controller(info->reset);
0400
0401
0402
0403
0404
0405 ret = clk_set_rate(info->clk, info->data->clk_rate);
0406 if (ret < 0) {
0407 dev_err(&pdev->dev, "failed to set adc clk rate, %d\n", ret);
0408 return ret;
0409 }
0410
0411 ret = regulator_enable(info->vref);
0412 if (ret < 0) {
0413 dev_err(&pdev->dev, "failed to enable vref regulator\n");
0414 return ret;
0415 }
0416 ret = devm_add_action_or_reset(&pdev->dev,
0417 rockchip_saradc_regulator_disable, info);
0418 if (ret) {
0419 dev_err(&pdev->dev, "failed to register devm action, %d\n",
0420 ret);
0421 return ret;
0422 }
0423
0424 ret = regulator_get_voltage(info->vref);
0425 if (ret < 0)
0426 return ret;
0427
0428 info->uv_vref = ret;
0429
0430 ret = clk_prepare_enable(info->pclk);
0431 if (ret < 0) {
0432 dev_err(&pdev->dev, "failed to enable pclk\n");
0433 return ret;
0434 }
0435 ret = devm_add_action_or_reset(&pdev->dev,
0436 rockchip_saradc_pclk_disable, info);
0437 if (ret) {
0438 dev_err(&pdev->dev, "failed to register devm action, %d\n",
0439 ret);
0440 return ret;
0441 }
0442
0443 ret = clk_prepare_enable(info->clk);
0444 if (ret < 0) {
0445 dev_err(&pdev->dev, "failed to enable converter clock\n");
0446 return ret;
0447 }
0448 ret = devm_add_action_or_reset(&pdev->dev,
0449 rockchip_saradc_clk_disable, info);
0450 if (ret) {
0451 dev_err(&pdev->dev, "failed to register devm action, %d\n",
0452 ret);
0453 return ret;
0454 }
0455
0456 platform_set_drvdata(pdev, indio_dev);
0457
0458 indio_dev->name = dev_name(&pdev->dev);
0459 indio_dev->info = &rockchip_saradc_iio_info;
0460 indio_dev->modes = INDIO_DIRECT_MODE;
0461
0462 indio_dev->channels = info->data->channels;
0463 indio_dev->num_channels = info->data->num_channels;
0464 ret = devm_iio_triggered_buffer_setup(&indio_dev->dev, indio_dev, NULL,
0465 rockchip_saradc_trigger_handler,
0466 NULL);
0467 if (ret)
0468 return ret;
0469
0470 info->nb.notifier_call = rockchip_saradc_volt_notify;
0471 ret = regulator_register_notifier(info->vref, &info->nb);
0472 if (ret)
0473 return ret;
0474
0475 ret = devm_add_action_or_reset(&pdev->dev,
0476 rockchip_saradc_regulator_unreg_notifier,
0477 info);
0478 if (ret)
0479 return ret;
0480
0481 return devm_iio_device_register(&pdev->dev, indio_dev);
0482 }
0483
0484 static int rockchip_saradc_suspend(struct device *dev)
0485 {
0486 struct iio_dev *indio_dev = dev_get_drvdata(dev);
0487 struct rockchip_saradc *info = iio_priv(indio_dev);
0488
0489 clk_disable_unprepare(info->clk);
0490 clk_disable_unprepare(info->pclk);
0491 regulator_disable(info->vref);
0492
0493 return 0;
0494 }
0495
0496 static int rockchip_saradc_resume(struct device *dev)
0497 {
0498 struct iio_dev *indio_dev = dev_get_drvdata(dev);
0499 struct rockchip_saradc *info = iio_priv(indio_dev);
0500 int ret;
0501
0502 ret = regulator_enable(info->vref);
0503 if (ret)
0504 return ret;
0505
0506 ret = clk_prepare_enable(info->pclk);
0507 if (ret)
0508 return ret;
0509
0510 ret = clk_prepare_enable(info->clk);
0511 if (ret)
0512 clk_disable_unprepare(info->pclk);
0513
0514 return ret;
0515 }
0516
0517 static DEFINE_SIMPLE_DEV_PM_OPS(rockchip_saradc_pm_ops,
0518 rockchip_saradc_suspend,
0519 rockchip_saradc_resume);
0520
0521 static struct platform_driver rockchip_saradc_driver = {
0522 .probe = rockchip_saradc_probe,
0523 .driver = {
0524 .name = "rockchip-saradc",
0525 .of_match_table = rockchip_saradc_match,
0526 .pm = pm_sleep_ptr(&rockchip_saradc_pm_ops),
0527 },
0528 };
0529
0530 module_platform_driver(rockchip_saradc_driver);
0531
0532 MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
0533 MODULE_DESCRIPTION("Rockchip SARADC driver");
0534 MODULE_LICENSE("GPL v2");