0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/kernel.h>
0011 #include <linux/slab.h>
0012 #include <linux/module.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/interrupt.h>
0015 #include <linux/mutex.h>
0016 #include <linux/completion.h>
0017 #include <linux/iio/iio.h>
0018 #include <linux/iio/machine.h>
0019 #include <linux/iio/driver.h>
0020 #include <linux/mfd/da9150/core.h>
0021 #include <linux/mfd/da9150/registers.h>
0022
0023
0024 enum da9150_gpadc_hw_channel {
0025 DA9150_GPADC_HW_CHAN_GPIOA_2V = 0,
0026 DA9150_GPADC_HW_CHAN_GPIOA_2V_,
0027 DA9150_GPADC_HW_CHAN_GPIOB_2V,
0028 DA9150_GPADC_HW_CHAN_GPIOB_2V_,
0029 DA9150_GPADC_HW_CHAN_GPIOC_2V,
0030 DA9150_GPADC_HW_CHAN_GPIOC_2V_,
0031 DA9150_GPADC_HW_CHAN_GPIOD_2V,
0032 DA9150_GPADC_HW_CHAN_GPIOD_2V_,
0033 DA9150_GPADC_HW_CHAN_IBUS_SENSE,
0034 DA9150_GPADC_HW_CHAN_IBUS_SENSE_,
0035 DA9150_GPADC_HW_CHAN_VBUS_DIV,
0036 DA9150_GPADC_HW_CHAN_VBUS_DIV_,
0037 DA9150_GPADC_HW_CHAN_ID,
0038 DA9150_GPADC_HW_CHAN_ID_,
0039 DA9150_GPADC_HW_CHAN_VSYS,
0040 DA9150_GPADC_HW_CHAN_VSYS_,
0041 DA9150_GPADC_HW_CHAN_GPIOA_6V,
0042 DA9150_GPADC_HW_CHAN_GPIOA_6V_,
0043 DA9150_GPADC_HW_CHAN_GPIOB_6V,
0044 DA9150_GPADC_HW_CHAN_GPIOB_6V_,
0045 DA9150_GPADC_HW_CHAN_GPIOC_6V,
0046 DA9150_GPADC_HW_CHAN_GPIOC_6V_,
0047 DA9150_GPADC_HW_CHAN_GPIOD_6V,
0048 DA9150_GPADC_HW_CHAN_GPIOD_6V_,
0049 DA9150_GPADC_HW_CHAN_VBAT,
0050 DA9150_GPADC_HW_CHAN_VBAT_,
0051 DA9150_GPADC_HW_CHAN_TBAT,
0052 DA9150_GPADC_HW_CHAN_TBAT_,
0053 DA9150_GPADC_HW_CHAN_TJUNC_CORE,
0054 DA9150_GPADC_HW_CHAN_TJUNC_CORE_,
0055 DA9150_GPADC_HW_CHAN_TJUNC_OVP,
0056 DA9150_GPADC_HW_CHAN_TJUNC_OVP_,
0057 };
0058
0059 enum da9150_gpadc_channel {
0060 DA9150_GPADC_CHAN_GPIOA = 0,
0061 DA9150_GPADC_CHAN_GPIOB,
0062 DA9150_GPADC_CHAN_GPIOC,
0063 DA9150_GPADC_CHAN_GPIOD,
0064 DA9150_GPADC_CHAN_IBUS,
0065 DA9150_GPADC_CHAN_VBUS,
0066 DA9150_GPADC_CHAN_VSYS,
0067 DA9150_GPADC_CHAN_VBAT,
0068 DA9150_GPADC_CHAN_TBAT,
0069 DA9150_GPADC_CHAN_TJUNC_CORE,
0070 DA9150_GPADC_CHAN_TJUNC_OVP,
0071 };
0072
0073
0074 struct da9150_gpadc {
0075 struct da9150 *da9150;
0076 struct device *dev;
0077
0078 struct mutex lock;
0079 struct completion complete;
0080 };
0081
0082
0083 static irqreturn_t da9150_gpadc_irq(int irq, void *data)
0084 {
0085
0086 struct da9150_gpadc *gpadc = data;
0087
0088 complete(&gpadc->complete);
0089
0090 return IRQ_HANDLED;
0091 }
0092
0093 static int da9150_gpadc_read_adc(struct da9150_gpadc *gpadc, int hw_chan)
0094 {
0095 u8 result_regs[2];
0096 int result;
0097
0098 mutex_lock(&gpadc->lock);
0099
0100
0101 da9150_reg_write(gpadc->da9150, DA9150_GPADC_MAN,
0102 (DA9150_GPADC_EN_MASK |
0103 hw_chan << DA9150_GPADC_MUX_SHIFT));
0104
0105
0106 try_wait_for_completion(&gpadc->complete);
0107
0108
0109 wait_for_completion_timeout(&gpadc->complete, msecs_to_jiffies(5));
0110
0111
0112 da9150_bulk_read(gpadc->da9150, DA9150_GPADC_RES_A, 2, result_regs);
0113
0114 mutex_unlock(&gpadc->lock);
0115
0116
0117 if (result_regs[1] & DA9150_GPADC_RUN_MASK) {
0118 dev_err(gpadc->dev, "Timeout on channel %d of GPADC\n",
0119 hw_chan);
0120 return -ETIMEDOUT;
0121 }
0122
0123
0124 result = (result_regs[1] & DA9150_GPADC_RES_L_MASK) >>
0125 DA9150_GPADC_RES_L_SHIFT;
0126
0127 result |= result_regs[0] << DA9150_GPADC_RES_L_BITS;
0128
0129 return result;
0130 }
0131
0132 static inline int da9150_gpadc_gpio_6v_voltage_now(int raw_val)
0133 {
0134
0135 return (6 * ((raw_val * 1000) + 500)) / 1024;
0136 }
0137
0138 static inline int da9150_gpadc_ibus_current_avg(int raw_val)
0139 {
0140
0141 return (4 * ((raw_val * 1000) + 500)) / 2048;
0142 }
0143
0144 static inline int da9150_gpadc_vbus_21v_voltage_now(int raw_val)
0145 {
0146
0147 return (21 * ((raw_val * 1000) + 500)) / 1024;
0148 }
0149
0150 static inline int da9150_gpadc_vsys_6v_voltage_now(int raw_val)
0151 {
0152
0153 return (3 * ((raw_val * 1000) + 500)) / 512;
0154 }
0155
0156 static int da9150_gpadc_read_processed(struct da9150_gpadc *gpadc, int channel,
0157 int hw_chan, int *val)
0158 {
0159 int raw_val;
0160
0161 raw_val = da9150_gpadc_read_adc(gpadc, hw_chan);
0162 if (raw_val < 0)
0163 return raw_val;
0164
0165 switch (channel) {
0166 case DA9150_GPADC_CHAN_GPIOA:
0167 case DA9150_GPADC_CHAN_GPIOB:
0168 case DA9150_GPADC_CHAN_GPIOC:
0169 case DA9150_GPADC_CHAN_GPIOD:
0170 *val = da9150_gpadc_gpio_6v_voltage_now(raw_val);
0171 break;
0172 case DA9150_GPADC_CHAN_IBUS:
0173 *val = da9150_gpadc_ibus_current_avg(raw_val);
0174 break;
0175 case DA9150_GPADC_CHAN_VBUS:
0176 *val = da9150_gpadc_vbus_21v_voltage_now(raw_val);
0177 break;
0178 case DA9150_GPADC_CHAN_VSYS:
0179 *val = da9150_gpadc_vsys_6v_voltage_now(raw_val);
0180 break;
0181 default:
0182
0183 *val = raw_val;
0184 break;
0185 }
0186
0187 return IIO_VAL_INT;
0188 }
0189
0190 static int da9150_gpadc_read_scale(int channel, int *val, int *val2)
0191 {
0192 switch (channel) {
0193 case DA9150_GPADC_CHAN_VBAT:
0194 *val = 2932;
0195 *val2 = 1000;
0196 return IIO_VAL_FRACTIONAL;
0197 case DA9150_GPADC_CHAN_TJUNC_CORE:
0198 case DA9150_GPADC_CHAN_TJUNC_OVP:
0199 *val = 1000000;
0200 *val2 = 4420;
0201 return IIO_VAL_FRACTIONAL;
0202 default:
0203 return -EINVAL;
0204 }
0205 }
0206
0207 static int da9150_gpadc_read_offset(int channel, int *val)
0208 {
0209 switch (channel) {
0210 case DA9150_GPADC_CHAN_VBAT:
0211 *val = 1500000 / 2932;
0212 return IIO_VAL_INT;
0213 case DA9150_GPADC_CHAN_TJUNC_CORE:
0214 case DA9150_GPADC_CHAN_TJUNC_OVP:
0215 *val = -144;
0216 return IIO_VAL_INT;
0217 default:
0218 return -EINVAL;
0219 }
0220 }
0221
0222 static int da9150_gpadc_read_raw(struct iio_dev *indio_dev,
0223 struct iio_chan_spec const *chan,
0224 int *val, int *val2, long mask)
0225 {
0226 struct da9150_gpadc *gpadc = iio_priv(indio_dev);
0227
0228 if ((chan->channel < DA9150_GPADC_CHAN_GPIOA) ||
0229 (chan->channel > DA9150_GPADC_CHAN_TJUNC_OVP))
0230 return -EINVAL;
0231
0232 switch (mask) {
0233 case IIO_CHAN_INFO_RAW:
0234 case IIO_CHAN_INFO_PROCESSED:
0235 return da9150_gpadc_read_processed(gpadc, chan->channel,
0236 chan->address, val);
0237 case IIO_CHAN_INFO_SCALE:
0238 return da9150_gpadc_read_scale(chan->channel, val, val2);
0239 case IIO_CHAN_INFO_OFFSET:
0240 return da9150_gpadc_read_offset(chan->channel, val);
0241 default:
0242 return -EINVAL;
0243 }
0244 }
0245
0246 static const struct iio_info da9150_gpadc_info = {
0247 .read_raw = &da9150_gpadc_read_raw,
0248 };
0249
0250 #define DA9150_GPADC_CHANNEL(_id, _hw_id, _type, chan_info, \
0251 _ext_name) { \
0252 .type = _type, \
0253 .indexed = 1, \
0254 .channel = DA9150_GPADC_CHAN_##_id, \
0255 .address = DA9150_GPADC_HW_CHAN_##_hw_id, \
0256 .info_mask_separate = chan_info, \
0257 .extend_name = _ext_name, \
0258 .datasheet_name = #_id, \
0259 }
0260
0261 #define DA9150_GPADC_CHANNEL_RAW(_id, _hw_id, _type, _ext_name) \
0262 DA9150_GPADC_CHANNEL(_id, _hw_id, _type, \
0263 BIT(IIO_CHAN_INFO_RAW), _ext_name)
0264
0265 #define DA9150_GPADC_CHANNEL_SCALED(_id, _hw_id, _type, _ext_name) \
0266 DA9150_GPADC_CHANNEL(_id, _hw_id, _type, \
0267 BIT(IIO_CHAN_INFO_RAW) | \
0268 BIT(IIO_CHAN_INFO_SCALE) | \
0269 BIT(IIO_CHAN_INFO_OFFSET), \
0270 _ext_name)
0271
0272 #define DA9150_GPADC_CHANNEL_PROCESSED(_id, _hw_id, _type, _ext_name) \
0273 DA9150_GPADC_CHANNEL(_id, _hw_id, _type, \
0274 BIT(IIO_CHAN_INFO_PROCESSED), _ext_name)
0275
0276
0277 static const struct iio_chan_spec da9150_gpadc_channels[] = {
0278 DA9150_GPADC_CHANNEL_PROCESSED(GPIOA, GPIOA_6V, IIO_VOLTAGE, NULL),
0279 DA9150_GPADC_CHANNEL_PROCESSED(GPIOB, GPIOB_6V, IIO_VOLTAGE, NULL),
0280 DA9150_GPADC_CHANNEL_PROCESSED(GPIOC, GPIOC_6V, IIO_VOLTAGE, NULL),
0281 DA9150_GPADC_CHANNEL_PROCESSED(GPIOD, GPIOD_6V, IIO_VOLTAGE, NULL),
0282 DA9150_GPADC_CHANNEL_PROCESSED(IBUS, IBUS_SENSE, IIO_CURRENT, "ibus"),
0283 DA9150_GPADC_CHANNEL_PROCESSED(VBUS, VBUS_DIV_, IIO_VOLTAGE, "vbus"),
0284 DA9150_GPADC_CHANNEL_PROCESSED(VSYS, VSYS, IIO_VOLTAGE, "vsys"),
0285 DA9150_GPADC_CHANNEL_SCALED(VBAT, VBAT, IIO_VOLTAGE, "vbat"),
0286 DA9150_GPADC_CHANNEL_RAW(TBAT, TBAT, IIO_VOLTAGE, "tbat"),
0287 DA9150_GPADC_CHANNEL_SCALED(TJUNC_CORE, TJUNC_CORE, IIO_TEMP,
0288 "tjunc_core"),
0289 DA9150_GPADC_CHANNEL_SCALED(TJUNC_OVP, TJUNC_OVP, IIO_TEMP,
0290 "tjunc_ovp"),
0291 };
0292
0293
0294 static struct iio_map da9150_gpadc_default_maps[] = {
0295 {
0296 .consumer_dev_name = "da9150-charger",
0297 .consumer_channel = "CHAN_IBUS",
0298 .adc_channel_label = "IBUS",
0299 },
0300 {
0301 .consumer_dev_name = "da9150-charger",
0302 .consumer_channel = "CHAN_VBUS",
0303 .adc_channel_label = "VBUS",
0304 },
0305 {
0306 .consumer_dev_name = "da9150-charger",
0307 .consumer_channel = "CHAN_TJUNC",
0308 .adc_channel_label = "TJUNC_CORE",
0309 },
0310 {
0311 .consumer_dev_name = "da9150-charger",
0312 .consumer_channel = "CHAN_VBAT",
0313 .adc_channel_label = "VBAT",
0314 },
0315 {},
0316 };
0317
0318 static int da9150_gpadc_probe(struct platform_device *pdev)
0319 {
0320 struct device *dev = &pdev->dev;
0321 struct da9150 *da9150 = dev_get_drvdata(dev->parent);
0322 struct da9150_gpadc *gpadc;
0323 struct iio_dev *indio_dev;
0324 int irq, ret;
0325
0326 indio_dev = devm_iio_device_alloc(dev, sizeof(*gpadc));
0327 if (!indio_dev) {
0328 dev_err(&pdev->dev, "Failed to allocate IIO device\n");
0329 return -ENOMEM;
0330 }
0331 gpadc = iio_priv(indio_dev);
0332
0333 gpadc->da9150 = da9150;
0334 gpadc->dev = dev;
0335 mutex_init(&gpadc->lock);
0336 init_completion(&gpadc->complete);
0337
0338 irq = platform_get_irq_byname(pdev, "GPADC");
0339 if (irq < 0)
0340 return irq;
0341
0342 ret = devm_request_threaded_irq(dev, irq, NULL, da9150_gpadc_irq,
0343 IRQF_ONESHOT, "GPADC", gpadc);
0344 if (ret) {
0345 dev_err(dev, "Failed to request IRQ %d: %d\n", irq, ret);
0346 return ret;
0347 }
0348
0349 ret = devm_iio_map_array_register(&pdev->dev, indio_dev, da9150_gpadc_default_maps);
0350 if (ret) {
0351 dev_err(dev, "Failed to register IIO maps: %d\n", ret);
0352 return ret;
0353 }
0354
0355 indio_dev->name = dev_name(dev);
0356 indio_dev->info = &da9150_gpadc_info;
0357 indio_dev->modes = INDIO_DIRECT_MODE;
0358 indio_dev->channels = da9150_gpadc_channels;
0359 indio_dev->num_channels = ARRAY_SIZE(da9150_gpadc_channels);
0360
0361 return devm_iio_device_register(&pdev->dev, indio_dev);
0362 }
0363
0364 static struct platform_driver da9150_gpadc_driver = {
0365 .driver = {
0366 .name = "da9150-gpadc",
0367 },
0368 .probe = da9150_gpadc_probe,
0369 };
0370
0371 module_platform_driver(da9150_gpadc_driver);
0372
0373 MODULE_DESCRIPTION("GPADC Driver for DA9150");
0374 MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
0375 MODULE_LICENSE("GPL");