This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TPS65217 SysFs support for Analog Mux selection

Other Parts Discussed in Thread: TPS65217

Hi, thought someone would find this useful.  I added sysfs support to the AM335x kernel TPS65217 driver so I can select the analog mux output selection from user space.  I wanted to be able to read the various signals using the AM335x ADC inputs.

Forum won't let us upload .patch files...so here it is as .txt.

1643.tps65217_analog_mux_sysfs.txt
Index: linux-3.2.0-psp05.06.00.00/drivers/mfd/tps65217.c
===================================================================
--- linux-3.2.0-psp05.06.00.00/drivers/mfd/tps65217.c   (revision 26)
+++ linux-3.2.0-psp05.06.00.00/drivers/mfd/tps65217.c   (working copy)
@@ -137,6 +137,78 @@
        .val_bits = 8,
 };
 
+/* Sys Fs Entries */
+static char* tps65217_mux_table[8] = {
+       "none",
+       "vbat",
+       "vsys",
+       "vts",
+       "vicharge",
+       "mux_in",
+       "none_6",
+       "none_7",
+};
+
+static ssize_t tps65217_analog_mux_show(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+{
+        struct tps65217 *tps = dev_get_drvdata(dev);
+       int mux_value;
+       int ret;
+
+       /* Read and output the current analog mux selection */
+       ret = tps65217_reg_read(tps, TPS65217_REG_MUXCTRL, &mux_value);
+       if (ret)
+       {
+               return sprintf(buf, "error\n"); 
+       }
+
+       return sprintf(buf, "%s\n", tps65217_mux_table[mux_value]);
+}
+
+static ssize_t tps65217_analog_mux_store(struct device *dev,
+                                        struct device_attribute *attr,
+                                        const char *buf, size_t size)
+{
+        struct tps65217 *tps = dev_get_drvdata(dev);
+       char mux_string[10] = {0};
+       int mux_value = 0;
+       int count = 0;
+       int ret = -EINVAL;
+
+       /* Copy the signal name into our buffer */
+       while((count < size) && (*buf != '0') && (*buf != '\n'))
+               mux_string[count++] = *buf++;
+
+       /* Find the matching parameter in the mux list */
+       while(mux_value < 8)
+       {
+               if(strcmp(mux_string, tps65217_mux_table[mux_value]) == 0)
+               {       /* Match found */
+                       break;
+               }
+
+               mux_value++;
+       }
+
+       /* Check if parameter is invalid */
+       if(mux_value == 8)
+       {
+               dev_info(tps->dev, "Unknown analog mux selection, %s", buf);
+               return ret;
+       }
+
+       /* Parameter was found, write the value to the mux register */
+       ret = tps65217_reg_write(tps, TPS65217_REG_MUXCTRL, mux_value, 0);
+       if(ret)
+               dev_err(tps->dev, "Bus error writing new mux selection, %s\n", mux_string);
+
+       return size;
+}
+
+static DEVICE_ATTR(analog_mux, 0644, tps65217_analog_mux_show,
+                                tps65217_analog_mux_store);
+
 static int __devinit tps65217_probe(struct i2c_client *client,
                                const struct i2c_device_id *ids)
 {
@@ -199,6 +271,8 @@
 
                platform_device_add(pdev);
        }
+
+       ret = device_create_file(tps->dev, &dev_attr_analog_mux);
 
        return 0;
 
@@ -212,6 +286,8 @@
 {
        struct tps65217 *tps = i2c_get_clientdata(client);
        int i;
+
+       device_remove_file(tps->dev, &dev_attr_analog_mux);
 
        for (i = 0; i < TPS65217_NUM_REGULATOR; i++)
                platform_device_unregister(tps->regulator_pdev[i]);