^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * max1111.c - +2.7V, Low-Power, Multichannel, Serial 8-bit ADCs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Based on arch/arm/mach-pxa/corgi_ssp.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2004-2005 Richard Purdie
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2008 Marvell International Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Eric Miao <eric.miao@marvell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/hwmon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/hwmon-sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/spi/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) enum chips { max1110, max1111, max1112, max1113 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define MAX1111_TX_BUF_SIZE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define MAX1111_RX_BUF_SIZE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* MAX1111 Commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define MAX1111_CTRL_PD0 (1u << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define MAX1111_CTRL_PD1 (1u << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define MAX1111_CTRL_SGL (1u << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MAX1111_CTRL_UNI (1u << 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define MAX1110_CTRL_SEL_SH (4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define MAX1111_CTRL_SEL_SH (5) /* NOTE: bit 4 is ignored */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define MAX1111_CTRL_STR (1u << 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct max1111_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct spi_device *spi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct device *hwmon_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct spi_message msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct spi_transfer xfer[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) uint8_t tx_buf[MAX1111_TX_BUF_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) uint8_t rx_buf[MAX1111_RX_BUF_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct mutex drvdata_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* protect msg, xfer and buffers from multiple access */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) int sel_sh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) int lsb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static int max1111_read(struct device *dev, int channel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct max1111_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) uint8_t v1, v2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /* writing to drvdata struct is not thread safe, wait on mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) mutex_lock(&data->drvdata_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) data->tx_buf[0] = (channel << data->sel_sh) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) MAX1111_CTRL_PD0 | MAX1111_CTRL_PD1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) MAX1111_CTRL_SGL | MAX1111_CTRL_UNI | MAX1111_CTRL_STR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) err = spi_sync(data->spi, &data->msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) dev_err(dev, "spi_sync failed with %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) mutex_unlock(&data->drvdata_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) v1 = data->rx_buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) v2 = data->rx_buf[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) mutex_unlock(&data->drvdata_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if ((v1 & 0xc0) || (v2 & 0x3f))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return (v1 << 2) | (v2 >> 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #ifdef CONFIG_SHARPSL_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static struct max1111_data *the_max1111;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) int max1111_read_channel(int channel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (!the_max1111 || !the_max1111->spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) return max1111_read(&the_max1111->spi->dev, channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) EXPORT_SYMBOL(max1111_read_channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * NOTE: SPI devices do not have a default 'name' attribute, which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * likely to be used by hwmon applications to distinguish between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * different devices, explicitly add a name attribute here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static ssize_t name_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return sprintf(buf, "%s\n", to_spi_device(dev)->modalias);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static ssize_t show_adc(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct max1111_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int channel = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ret = max1111_read(dev, channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * Assume the reference voltage to be 2.048V or 4.096V, with an 8-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * sample. The LSB weight is 8mV or 16mV depending on the chip type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return sprintf(buf, "%d\n", ret * data->lsb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define MAX1111_ADC_ATTR(_id) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) SENSOR_DEVICE_ATTR(in##_id##_input, S_IRUGO, show_adc, NULL, _id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static DEVICE_ATTR_RO(name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) static MAX1111_ADC_ATTR(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) static MAX1111_ADC_ATTR(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static MAX1111_ADC_ATTR(2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) static MAX1111_ADC_ATTR(3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) static MAX1111_ADC_ATTR(4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static MAX1111_ADC_ATTR(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static MAX1111_ADC_ATTR(6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static MAX1111_ADC_ATTR(7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static struct attribute *max1111_attributes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) &dev_attr_name.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) &sensor_dev_attr_in0_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) &sensor_dev_attr_in1_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) &sensor_dev_attr_in2_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) &sensor_dev_attr_in3_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static const struct attribute_group max1111_attr_group = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .attrs = max1111_attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static struct attribute *max1110_attributes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) &sensor_dev_attr_in4_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) &sensor_dev_attr_in5_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) &sensor_dev_attr_in6_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) &sensor_dev_attr_in7_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static const struct attribute_group max1110_attr_group = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .attrs = max1110_attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static int setup_transfer(struct max1111_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct spi_message *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) struct spi_transfer *x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) m = &data->msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) x = &data->xfer[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) spi_message_init(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) x->tx_buf = &data->tx_buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) x->len = MAX1111_TX_BUF_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) spi_message_add_tail(x, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) x++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) x->rx_buf = &data->rx_buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) x->len = MAX1111_RX_BUF_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) spi_message_add_tail(x, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static int max1111_probe(struct spi_device *spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) enum chips chip = spi_get_device_id(spi)->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct max1111_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) spi->bits_per_word = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) spi->mode = SPI_MODE_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) err = spi_setup(spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) data = devm_kzalloc(&spi->dev, sizeof(struct max1111_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) if (data == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) switch (chip) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) case max1110:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) data->lsb = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) data->sel_sh = MAX1110_CTRL_SEL_SH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) case max1111:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) data->lsb = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) data->sel_sh = MAX1111_CTRL_SEL_SH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) case max1112:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) data->lsb = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) data->sel_sh = MAX1110_CTRL_SEL_SH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) case max1113:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) data->lsb = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) data->sel_sh = MAX1111_CTRL_SEL_SH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) err = setup_transfer(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) mutex_init(&data->drvdata_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) data->spi = spi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) spi_set_drvdata(spi, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) err = sysfs_create_group(&spi->dev.kobj, &max1111_attr_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) dev_err(&spi->dev, "failed to create attribute group\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (chip == max1110 || chip == max1112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) err = sysfs_create_group(&spi->dev.kobj, &max1110_attr_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) dev_err(&spi->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) "failed to create extended attribute group\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) goto err_remove;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) data->hwmon_dev = hwmon_device_register(&spi->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) if (IS_ERR(data->hwmon_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) dev_err(&spi->dev, "failed to create hwmon device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) err = PTR_ERR(data->hwmon_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) goto err_remove;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #ifdef CONFIG_SHARPSL_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) the_max1111 = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) err_remove:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) sysfs_remove_group(&spi->dev.kobj, &max1110_attr_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static int max1111_remove(struct spi_device *spi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) struct max1111_data *data = spi_get_drvdata(spi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #ifdef CONFIG_SHARPSL_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) the_max1111 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) hwmon_device_unregister(data->hwmon_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) sysfs_remove_group(&spi->dev.kobj, &max1110_attr_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) mutex_destroy(&data->drvdata_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) static const struct spi_device_id max1111_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) { "max1110", max1110 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { "max1111", max1111 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { "max1112", max1112 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { "max1113", max1113 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) MODULE_DEVICE_TABLE(spi, max1111_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) static struct spi_driver max1111_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) .name = "max1111",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) .id_table = max1111_ids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) .probe = max1111_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) .remove = max1111_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) module_spi_driver(max1111_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) MODULE_DESCRIPTION("MAX1110/MAX1111/MAX1112/MAX1113 ADC Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) MODULE_LICENSE("GPL");