[Armadeus-commitlog] armadeus branch, master, updated. armadeus-5.0-31-ga5415a0
Brought to you by:
sszy
|
From: jorasse <jo...@us...> - 2012-09-20 17:26:04
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "armadeus".
The branch, master has been updated
via a5415a08cf0de85b3ca448ac577c79b304a81ba7 (commit)
via ceb47362e3e6c2c6dc772aeee20b8114cb39cb3c (commit)
from 091d281114391be74fd0e297a119ba525b7be05b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit a5415a08cf0de85b3ca448ac577c79b304a81ba7
Author: Eric Jarrige <eri...@ar...>
Date: Thu Sep 20 19:28:59 2012 +0200
[LINUX] apf28: 2.6.35.3: enable ADC feature on pins LRADC0 and LRADC1
commit ceb47362e3e6c2c6dc772aeee20b8114cb39cb3c
Author: Eric Jarrige <eri...@ar...>
Date: Thu Sep 20 19:24:45 2012 +0200
[LINUX] apf28: add MXS lradc hwmon driver for kernel 2.6.35
-----------------------------------------------------------------------
Summary of changes:
.../armadeus/apf28/apf28-linux-2.6.35.config | 3 +-
...1-armadeus-add_apf28dev_baseboard_support.patch | 54 ++++-
target/linux/modules/Kconfig | 2 +
target/linux/modules/Makefile | 2 +-
target/linux/modules/mxs_lradc/Kconfig | 10 +
.../modules/{imx_counter => mxs_lradc}/Makefile | 4 +-
target/linux/modules/mxs_lradc/mxs_lradc.c | 267 ++++++++++++++++++++
.../mxs_lradc/mxs_lradc.h} | 36 ++--
target/linux/modules/pwm/Kconfig | 2 +-
9 files changed, 353 insertions(+), 27 deletions(-)
create mode 100644 target/linux/modules/mxs_lradc/Kconfig
copy target/linux/modules/{imx_counter => mxs_lradc}/Makefile (82%)
create mode 100644 target/linux/modules/mxs_lradc/mxs_lradc.c
copy target/linux/{debug/imxregs/definitions.h => modules/mxs_lradc/mxs_lradc.h} (54%)
diff --git a/buildroot/target/device/armadeus/apf28/apf28-linux-2.6.35.config b/buildroot/target/device/armadeus/apf28/apf28-linux-2.6.35.config
index 173a236..74395c0 100644
--- a/buildroot/target/device/armadeus/apf28/apf28-linux-2.6.35.config
+++ b/buildroot/target/device/armadeus/apf28/apf28-linux-2.6.35.config
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.35.3
-# Mon Sep 17 00:59:29 2012
+# Thu Sep 20 19:14:34 2012
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -1869,6 +1869,7 @@ CONFIG_ARMADEUS_DRIVERS=y
#
# CONFIG_ARMADEUS_GENERIC_DRIVER is not set
# CONFIG_ARMADEUS_AS1531_PLAT is not set
+CONFIG_ARMADEUS_SENSOR_MXS_LRADC=y
# CONFIG_ARMADEUS_GPIO_DRIVER is not set
# CONFIG_ARMADEUS_KEYPAD_DRIVER is not set
# CONFIG_ARMADEUS_MAX1027 is not set
diff --git a/patches/linux/2.6.35/451-armadeus-add_apf28dev_baseboard_support.patch b/patches/linux/2.6.35/451-armadeus-add_apf28dev_baseboard_support.patch
index 4010c97..3083e19 100644
--- a/patches/linux/2.6.35/451-armadeus-add_apf28dev_baseboard_support.patch
+++ b/patches/linux/2.6.35/451-armadeus-add_apf28dev_baseboard_support.patch
@@ -46,7 +46,7 @@ Index: linux-2.6.35.3/arch/arm/mach-mx28/apf28dev.c
===================================================================
--- /dev/null
+++ linux-2.6.35.3/arch/arm/mach-mx28/apf28dev.c
-@@ -0,0 +1,1037 @@
+@@ -0,0 +1,1085 @@
+/*
+ * Copyright (C) 2012 Armadeus systems
+ *
@@ -100,6 +100,7 @@ Index: linux-2.6.35.3/arch/arm/mach-mx28/apf28dev.c
+#include "device.h"
+#include "usb.h"
+#include "../../../drivers/armadeus/pwm/mxs-pwm.h"
++#include "../../../drivers/armadeus/mxs_lradc/mxs_lradc.h"
+
+#define USB_POWER_ENABLE MXS_PIN_TO_GPIO(PINID_LCD_D23)
+
@@ -915,7 +916,7 @@ Index: linux-2.6.35.3/arch/arm/mach-mx28/apf28dev.c
+
+#if defined(CONFIG_ARMADEUS_MXS_PWM_DRIVER) || \
+ defined(CONFIG_ARMADEUS_MXS_PWM_DRIVER_MODULE)
-+static struct resource apf28_pwm_res = {
++static struct resource mx28_pwm_res = {
+ .flags = IORESOURCE_MEM,
+ .start = PWM_PHYS_ADDR,
+ .end = PWM_PHYS_ADDR + 0x2000,
@@ -924,12 +925,54 @@ Index: linux-2.6.35.3/arch/arm/mach-mx28/apf28dev.c
+static struct platform_device apf28dev_pwm_dev = {
+ .name = "mxs_pwm",
+ .id = 4,
-+ .resource = &apf28_pwm_res,
++ .resource = &mx28_pwm_res,
+ .num_resources = 1,
+};
+#endif /* defined(CONFIG_ARMADEUS_MXS_PWM_DRIVER) ||
+ defined(CONFIG_ARMADEUS_MXS_PWM_DRIVER_MODULE) */
+
++#if defined(CONFIG_ARMADEUS_SENSOR_MXS_LRADC) || \
++ defined(CONFIG_ARMADEUS_SENSOR_MXS_LRADC_MODULE)
++static struct resource mx28_lradc_res = {
++ .flags = IORESOURCE_MEM,
++ .start = LRADC_PHYS_ADDR,
++ .end = LRADC_PHYS_ADDR + 0x2000 - 1,
++};
++
++static struct mxs_lradc_info apf28dev_lradc[] = {
++ {
++ .name = "lradc0",
++ .channel = 0, /* LRADC channel */
++ .mux_pad = 0, /* LRADC muxed pad */
++ .enable_div2 = 1, /* enable for signal up to VDDIO -50mV*/
++ .samples = 7, /* oversampling factor */
++ },
++ {
++ .name = "lradc1",
++ .channel = 1, /* LRADC channel */
++ .mux_pad = 1, /* LRADC muxed pad */
++ .enable_div2 = 1, /* enable for signal up to VDDIO -50mV*/
++ .samples = 7, /* oversampling factor */
++ },
++};
++
++static struct mxs_lradc_platform_data apf28dev_lradc_data = {
++ .num_lradc = ARRAY_SIZE(apf28dev_lradc),
++ .lradc = apf28dev_lradc
++};
++
++static struct platform_device apf28dev_lradc_dev = {
++ .name = "mxs_lradc",
++ .id = 0,
++ .resource = &mx28_lradc_res,
++ .num_resources = 1,
++ .dev = {
++ .platform_data = &apf28dev_lradc_data,
++ },
++};
++#endif /* defined(CONFIG_ARMADEUS_SENSOR_MXS_LRADC) ||
++ defined(CONFIG_ARMADEUS_SENSOR_MXS_LRADC_MODULE) */
++
+static struct platform_device *apf28dev_platform_devices[] __initdata = {
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+ &apf28dev_gpio_keys_device,
@@ -942,6 +985,11 @@ Index: linux-2.6.35.3/arch/arm/mach-mx28/apf28dev.c
+ &apf28dev_pwm_dev,
+
+#endif
++#if defined(CONFIG_ARMADEUS_SENSOR_MXS_LRADC) || \
++ defined(CONFIG_ARMADEUS_SENSOR_MXS_LRADC_MODULE)
++ &apf28dev_lradc_dev,
++
++#endif
+};
+
+#if defined(CONFIG_FEC2) || defined(CONFIG_FEC2_MODULE)\
diff --git a/target/linux/modules/Kconfig b/target/linux/modules/Kconfig
index 82abbe5..298ea6a 100644
--- a/target/linux/modules/Kconfig
+++ b/target/linux/modules/Kconfig
@@ -17,6 +17,8 @@ source "drivers/armadeus/generic/Kconfig"
source "drivers/armadeus/as1531_platform/Kconfig"
+source "drivers/armadeus/mxs_lradc/Kconfig"
+
source "drivers/armadeus/gpio/Kconfig"
source "drivers/armadeus/imxlkeypad/Kconfig"
diff --git a/target/linux/modules/Makefile b/target/linux/modules/Makefile
index 245ea86..f83dc54 100755
--- a/target/linux/modules/Makefile
+++ b/target/linux/modules/Makefile
@@ -9,7 +9,7 @@ ifneq ($(KERNELRELEASE),)
obj-$(CONFIG_ARMADEUS_DRIVERS) += gpio/ pwm/ backlight/ isp1761/ \
imxlkeypad/ fpga/ max1027/ max9768/ display/ as1531_platform/ \
- imx_counter/
+ mxs_lradc/ imx_counter/
else
# Part executed when called from standard make in this directory:
diff --git a/target/linux/modules/mxs_lradc/Kconfig b/target/linux/modules/mxs_lradc/Kconfig
new file mode 100644
index 0000000..b768c83
--- /dev/null
+++ b/target/linux/modules/mxs_lradc/Kconfig
@@ -0,0 +1,10 @@
+#
+#
+
+config ARMADEUS_SENSOR_MXS_LRADC
+ tristate "MXS LRADC"
+ default n
+ depends on ARMADEUS_DRIVERS && MXS_LRADC && HWMON
+ ---help---
+ Use MXS LRADC as generic hardware monitor device.
+
diff --git a/target/linux/modules/imx_counter/Makefile b/target/linux/modules/mxs_lradc/Makefile
similarity index 82%
copy from target/linux/modules/imx_counter/Makefile
copy to target/linux/modules/mxs_lradc/Makefile
index a9c0ef6..24fd8aa 100755
--- a/target/linux/modules/imx_counter/Makefile
+++ b/target/linux/modules/mxs_lradc/Makefile
@@ -1,11 +1,11 @@
#
-# Makefile for the ...
+# Makefile for the MXS LRADC module
#
# Part executed when called from kernel build system:
ifneq ($(KERNELRELEASE),)
-obj-$(CONFIG_APF27_GPT2) += gpt2_plat.o
+obj-$(CONFIG_ARMADEUS_SENSOR_MXS_LRADC) += mxs_lradc.o
# Part executed when called from standard make in this directory:
# (preferably use Makefile in parent directory)
diff --git a/target/linux/modules/mxs_lradc/mxs_lradc.c b/target/linux/modules/mxs_lradc/mxs_lradc.c
new file mode 100644
index 0000000..1e334b1
--- /dev/null
+++ b/target/linux/modules/mxs_lradc/mxs_lradc.c
@@ -0,0 +1,267 @@
+/*
+ * mxs_lradc.c - driver for the MXS LRADC module
+ *
+ * Copyright (c) 2012 Eric Jarrige <eri...@ar...>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/sysfs.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/mutex.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#include <mach/hardware.h>
+#include <mach/lradc.h>
+#include <mach/device.h>
+#include <mach/regs-lradc.h>
+
+#include "mxs_lradc.h"
+
+#define MXS_MAX_VALUE 3700 /* mV */
+
+struct mxs_lradc {
+ struct device *hwmon_dev;
+ struct mutex lock;
+ unsigned int base;
+};
+
+static ssize_t mxs_lradc_read(struct device *dev,
+ struct device_attribute *devattr, char *buf)
+{
+ struct mxs_lradc *adc = dev_get_drvdata(dev);
+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+ int status = 0;
+ int ret_value;
+
+ if (mutex_lock_interruptible(&adc->lock))
+ return -ERESTARTSYS;
+
+ /* Clear the Soft Reset and Clock Gate for normal operation */
+ __raw_writel(BM_LRADC_CTRL0_SFTRST | BM_LRADC_CTRL0_CLKGATE,
+ adc->base + HW_LRADC_CTRL0_CLR);
+
+ /* Clear the accumulator & NUM_SAMPLES */
+ __raw_writel(0xFFFFFFFF,
+ adc->base + HW_LRADC_CHn_CLR(attr->index));
+
+ /* Clear the interrupt flag */
+ __raw_writel(BM_LRADC_CTRL1_LRADC0_IRQ_EN << attr->index,
+ adc->base + HW_LRADC_CTRL1_CLR);
+
+ /*
+ * Get value; this is the max scale value schedule the channel:
+ */
+ __raw_writel(BF_LRADC_CTRL0_SCHEDULE(1 << attr->index),
+ adc->base + HW_LRADC_CTRL0_SET);
+
+ /* wait for completion */
+ while ((__raw_readl(adc->base + HW_LRADC_CTRL1)
+ & (BM_LRADC_CTRL1_LRADC0_IRQ << attr->index)) !=
+ (BM_LRADC_CTRL1_LRADC0_IRQ << attr->index))
+ cpu_relax();
+
+ /* Clear the interrupt flag */
+ __raw_writel((BM_LRADC_CTRL1_LRADC0_IRQ << attr->index),
+ adc->base + HW_LRADC_CTRL1_CLR);
+
+ /* read channel value. */
+ ret_value = __raw_readl(adc->base + HW_LRADC_CHn(attr->index));
+ ret_value = (ret_value & BM_LRADC_CHn_VALUE) /
+ ((ret_value & BM_LRADC_CHn_NUM_SAMPLES) + 1);
+
+ /* Adjust scaling factor */
+ if (!(__raw_readl(adc->base + HW_LRADC_CTRL2)
+ & BF_LRADC_CTRL2_DIVIDE_BY_TWO(1 << attr->index)))
+ ret_value /= 2;
+
+ status = sprintf(buf, "%d\n", ret_value * MXS_MAX_VALUE / 4096);
+
+ mutex_unlock(&adc->lock);
+ return status;
+}
+
+static ssize_t mxs_lradc_show_min(struct device *dev,
+ struct device_attribute *devattr, char *buf)
+{
+ return sprintf(buf, "0\n");
+}
+
+static ssize_t mxs_lradc_show_max(struct device *dev,
+ struct device_attribute *devattr, char *buf)
+{
+ return sprintf(buf, "%d\n", MXS_MAX_VALUE);
+}
+
+static ssize_t mxs_lradc_show_name(struct device *dev, struct device_attribute
+ *devattr, char *buf)
+{
+ return sprintf(buf, "mxs_lradc\n");
+}
+
+static struct sensor_device_attribute mxs_lradc_attr[] = {
+ SENSOR_ATTR(name, S_IRUGO, mxs_lradc_show_name, NULL, 0),
+ SENSOR_ATTR(in_min, S_IRUGO, mxs_lradc_show_min, NULL, 0),
+ SENSOR_ATTR(in_max, S_IRUGO, mxs_lradc_show_max, NULL, 0),
+};
+
+static struct sensor_device_attribute mxs_lradc_input[] = {
+ SENSOR_ATTR(in0_input, S_IRUGO, mxs_lradc_read, NULL, 0),
+ SENSOR_ATTR(in1_input, S_IRUGO, mxs_lradc_read, NULL, 1),
+ SENSOR_ATTR(in2_input, S_IRUGO, mxs_lradc_read, NULL, 2),
+ SENSOR_ATTR(in3_input, S_IRUGO, mxs_lradc_read, NULL, 3),
+ SENSOR_ATTR(in4_input, S_IRUGO, mxs_lradc_read, NULL, 4),
+ SENSOR_ATTR(in5_input, S_IRUGO, mxs_lradc_read, NULL, 5),
+ SENSOR_ATTR(in6_input, S_IRUGO, mxs_lradc_read, NULL, 6),
+ SENSOR_ATTR(in7_input, S_IRUGO, mxs_lradc_read, NULL, 7),
+};
+/*----------------------------------------------------------------------*/
+
+static int __devinit mxs_lradc_probe(struct platform_device *pdev)
+{
+ struct mxs_lradc *adc;
+ struct resource *res;
+ struct mxs_lradc_platform_data *pdata = pdev->dev.platform_data;
+ int status;
+ int i;
+
+ adc = kzalloc(sizeof(struct mxs_lradc), GFP_KERNEL);
+ if (adc == NULL)
+ return -ENOMEM;
+
+ mutex_init(&adc->lock);
+ mutex_lock(&adc->lock);
+
+ platform_set_drvdata(pdev, adc);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "%s: couldn't get MEM resource\n", __func__);
+ status = -ENODEV;
+ goto exit_free;
+ }
+ adc->base = (unsigned int)IO_ADDRESS(res->start);
+
+ if (pdata) {
+ for (i = 0; i < pdata->num_lradc; i++) {
+ hw_lradc_use_channel(pdata->lradc[i].channel);
+ hw_lradc_configure_channel(pdata->lradc[i].channel,
+ pdata->lradc[i].enable_div2,
+ pdata->lradc[i].samples,
+ pdata->lradc[i].samples);
+ __raw_writel(0x0F << (4 * pdata->lradc[i].channel),
+ adc->base + HW_LRADC_CTRL4_CLR);
+ __raw_writel( pdata->lradc[i].mux_pad <<
+ (4 * pdata->lradc[i].channel),
+ adc->base + HW_LRADC_CTRL4_SET);
+ status = device_create_file(&pdev->dev,
+ &mxs_lradc_input[pdata->lradc[i].channel].dev_attr);
+ if (status) {
+ dev_err(&pdev->dev, "device_create_file failed.\n");
+ goto exit_free;
+ }
+ }
+ }
+
+ /* Register sysfs hooks */
+ for (i = 0; i < ARRAY_SIZE(mxs_lradc_attr); i++) {
+ status = device_create_file(&pdev->dev,
+ &mxs_lradc_attr[i].dev_attr);
+ if (status) {
+ dev_err(&pdev->dev, "device_create_file failed.\n");
+ goto exit_free;
+ }
+ }
+
+ adc->hwmon_dev = hwmon_device_register(&pdev->dev);
+ if (IS_ERR(adc->hwmon_dev)) {
+ dev_err(&pdev->dev, "hwmon_device_register failed.\n");
+ status = PTR_ERR(adc->hwmon_dev);
+ goto exit_remove;
+ }
+
+ mutex_unlock(&adc->lock);
+ return 0;
+
+exit_remove:
+ for (i--; i >= 0; i--)
+ device_remove_file(&pdev->dev, &mxs_lradc_attr[i].dev_attr);
+exit_free:
+ dev_set_drvdata(&pdev->dev, NULL);
+ mutex_unlock(&adc->lock);
+ kfree(adc);
+ return status;
+}
+
+static int __devexit mxs_lradc_remove(struct platform_device *pdev)
+{
+ struct mxs_lradc *adc = dev_get_drvdata(&pdev->dev);
+ struct mxs_lradc_platform_data *pdata = pdev->dev.platform_data;
+ int i;
+
+ mutex_lock(&adc->lock);
+ hwmon_device_unregister(adc->hwmon_dev);
+ for (i = 0; i < ARRAY_SIZE(mxs_lradc_attr); i++)
+ device_remove_file(&pdev->dev, &mxs_lradc_attr[i].dev_attr);
+
+ if (pdata) {
+ for (i = 0; i < pdata->num_lradc; i++) {
+ hw_lradc_unuse_channel(pdata->lradc[i].channel);
+ device_remove_file(&pdev->dev,
+ &mxs_lradc_input[pdata->lradc[i].channel].dev_attr);
+ }
+ }
+
+ dev_set_drvdata(&pdev->dev, NULL);
+ mutex_unlock(&adc->lock);
+ kfree(adc);
+
+ return 0;
+}
+
+static struct platform_driver mxs_lradc_driver = {
+ .probe = mxs_lradc_probe,
+ .remove = mxs_lradc_remove,
+ .driver = {
+ .name = "mxs_lradc",
+ .owner = THIS_MODULE,
+ },
+};
+
+/* Init module */
+
+static int __init init_mxs_lradc(void)
+{
+ return platform_driver_register(&mxs_lradc_driver);
+}
+
+static void __exit exit_mxs_lradc(void)
+{
+ platform_driver_unregister(&mxs_lradc_driver);
+}
+
+module_init(init_mxs_lradc);
+module_exit(exit_mxs_lradc);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Eric Jarrige <eri...@ar...>");
+MODULE_DESCRIPTION("MXC LRADC driver");
diff --git a/target/linux/debug/imxregs/definitions.h b/target/linux/modules/mxs_lradc/mxs_lradc.h
similarity index 54%
copy from target/linux/debug/imxregs/definitions.h
copy to target/linux/modules/mxs_lradc/mxs_lradc.h
index ee71db3..26f0076 100644
--- a/target/linux/debug/imxregs/definitions.h
+++ b/target/linux/modules/mxs_lradc/mxs_lradc.h
@@ -1,13 +1,8 @@
/*
- * definitions.h - imxregs common definitions
- *
- * Copyright (C) 2008 armadeus systems
- * Author: Julien Boibessot
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,20 +12,23 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
*/
-typedef unsigned int u32;
+#ifndef _ADC_DEF_H_
+#define _ADC_DEF_H_
+
+/* For the leds-gpio driver */
+struct mxs_lradc_info {
+ const char *name;
+ int channel; /* LRADC channel */
+ int mux_pad; /* LRADC muxed pad */
+ int enable_div2; /* enable for signal up to VDDIO -50mV*/
+ int samples; /* oversampling factor */
+};
-struct reg_info {
- char *name;
- u32 addr;
- int shift;
- u32 mask;
- char type;
- char *desc;
+struct mxs_lradc_platform_data {
+ int num_lradc;
+ struct mxs_lradc_info *lradc;
};
-// Size of mmapping:
-#define MAP_SIZE 4096
-#define MAP_MASK ( MAP_SIZE - 1 )
+#endif /* _ADC_DEF_H_*/
diff --git a/target/linux/modules/pwm/Kconfig b/target/linux/modules/pwm/Kconfig
index 7786335..2a2d47c 100644
--- a/target/linux/modules/pwm/Kconfig
+++ b/target/linux/modules/pwm/Kconfig
@@ -10,7 +10,7 @@ config ARMADEUS_PWM_DRIVER
PWM is useful to play sound or control motors
config ARMADEUS_MXS_PWM_DRIVER
- tristate "Armadeus MXS PWM driver"
+ tristate "MXS PWM driver"
default n
depends on ARMADEUS_DRIVERS
---help---
hooks/post-receive
--
armadeus
|