You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'mfd-for-linus-4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
Pull MFD updates from Lee Jones: "New Drivers: - Freescale Touch Screen ADC - X-Powers AXP PMIC with RSB - TI TPS65086 Power Management IC (PMIC) New Device Support: - Supply device PCI IDs for Intel Broxton Fix-ups: - Move to clkdev_create() API; intel_quark_i2c_gpio - Complete re-write of TI's TPS65912 Power Management IC (PMIC) - Remove unnecessary function argument; axp20x - Separate out bus related code; axp20x - Coding Style changes; axp20x - Allow more drivers to be compiled as modules - Work around false positive 'used uninitialised' warning; db8500-prcmu Bug Fixes: - Remove do_div(); fsl-imx25-gcq - Fix driver init when built-in; tps65010 - Fix clock-unregister leak; intel-lpss" * tag 'mfd-for-linus-4.6' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (53 commits) mfd: intel-lpss: Pass I2C configuration via properties on BXT mfd: imx6sx: Add PCIe register definitions for iomuxc gpr mfd: ipaq-micro: Use __maybe_unused to hide pm functions mfd: max77686: Add max77802 to I2C device ID table mfd: max77686: Export OF module alias information mfd: max77686: Allow driver to be built as a module mfd: stmpe: Add the proper PWM resources mfd: tps65090: Set regmap config reg counts properly mfd: syscon: Return ENOTSUPP instead of ENOSYS when disabled mfd: as3711: Set regmap config reg counts properly mfd: rc5t583: Set regmap config reg counts properly gpio: tps65086: Add GPO driver for the TPS65086 PMIC mfd: mt6397: Add platform device ID table mfd: da9063: Fix missing volatile registers in the core regmap_range volatile lists mfd: mt6397: Add MT6323 support to MT6397 driver mfd: mt6397: Add support for different Slave types mfd: mt6397: int_con and int_status may vary in location dt-bindings: mfd: Add bindings for the MediaTek MT6323 PMIC mfd: da9062: Fix missing volatile registers in the core regmap_range volatile lists mfd: Add documentation for ACT8945A DT bindings ...
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
Freescale i.MX25 ADC GCQ device
|
||||
|
||||
This is a generic conversion queue device that can convert any of the
|
||||
analog inputs using the ADC unit of the i.MX25.
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "fsl,imx25-gcq".
|
||||
- reg: Should be the register range of the module.
|
||||
- interrupts: Should be the interrupt number of the module.
|
||||
Typically this is <1>.
|
||||
- interrupt-parent: phandle to the tsadc module of the i.MX25.
|
||||
- #address-cells: Should be <1> (setting for the subnodes)
|
||||
- #size-cells: Should be <0> (setting for the subnodes)
|
||||
|
||||
Optional properties:
|
||||
- vref-ext-supply: The regulator supplying the ADC reference voltage.
|
||||
Required when at least one subnode uses the this reference.
|
||||
- vref-xp-supply: The regulator supplying the ADC reference voltage on pin XP.
|
||||
Required when at least one subnode uses this reference.
|
||||
- vref-yp-supply: The regulator supplying the ADC reference voltage on pin YP.
|
||||
Required when at least one subnode uses this reference.
|
||||
|
||||
Sub-nodes:
|
||||
Optionally you can define subnodes which define the reference voltage
|
||||
for the analog inputs.
|
||||
|
||||
Required properties for subnodes:
|
||||
- reg: Should be the number of the analog input.
|
||||
0: xp
|
||||
1: yp
|
||||
2: xn
|
||||
3: yn
|
||||
4: wiper
|
||||
5: inaux0
|
||||
6: inaux1
|
||||
7: inaux2
|
||||
Optional properties for subnodes:
|
||||
- fsl,adc-refp: specifies the positive reference input as defined in
|
||||
<dt-bindings/iio/adc/fsl-imx25-gcq.h>
|
||||
- fsl,adc-refn: specifies the negative reference input as defined in
|
||||
<dt-bindings/iio/adc/fsl-imx25-gcq.h>
|
||||
|
||||
Example:
|
||||
|
||||
adc: adc@50030800 {
|
||||
compatible = "fsl,imx25-gcq";
|
||||
reg = <0x50030800 0x60>;
|
||||
interrupt-parent = <&tscadc>;
|
||||
interrupts = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
inaux@5 {
|
||||
reg = <5>;
|
||||
fsl,adc-refp = <MX25_ADC_REFP_INT>;
|
||||
fsl,adc-refn = <MX25_ADC_REFN_NGND>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,35 @@
|
||||
Freescale mx25 TS conversion queue module
|
||||
|
||||
mx25 touchscreen conversion queue module which controls the ADC unit of the
|
||||
mx25 for attached touchscreens.
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "fsl,imx25-tcq".
|
||||
- reg: Memory range of the device.
|
||||
- interrupts: Should be the interrupt number associated with this module within
|
||||
the tscadc unit (<0>).
|
||||
- interrupt-parent: Should be a phandle to the tscadc unit.
|
||||
- fsl,wires: Should be '<4>' or '<5>'
|
||||
|
||||
Optional properties:
|
||||
- fsl,pen-debounce-ns: Pen debounce time in nanoseconds.
|
||||
- fsl,pen-threshold: Pen-down threshold for the touchscreen. This is a value
|
||||
between 1 and 4096. It is the ratio between the internal reference voltage
|
||||
and the measured voltage after the plate was precharged. Resistence between
|
||||
plates and therefore the voltage decreases with pressure so that a smaller
|
||||
value is equivalent to a higher pressure.
|
||||
- fsl,settling-time-ns: Settling time in nanoseconds. The settling time is before
|
||||
the actual touch detection to wait for an even charge distribution in the
|
||||
plate.
|
||||
|
||||
This device includes two conversion queues which can be added as subnodes.
|
||||
The first queue is for the touchscreen, the second for general purpose ADC.
|
||||
|
||||
Example:
|
||||
tsc: tcq@50030400 {
|
||||
compatible = "fsl,imx25-tcq";
|
||||
reg = <0x50030400 0x60>;
|
||||
interrupt-parent = <&tscadc>;
|
||||
interrupts = <0>;
|
||||
fsl,wires = <4>;
|
||||
};
|
||||
@@ -0,0 +1,76 @@
|
||||
Device-Tree bindings for Active-semi ACT8945A MFD driver
|
||||
|
||||
Required properties:
|
||||
- compatible: "active-semi,act8945a".
|
||||
- reg: the I2C slave address for the ACT8945A chip
|
||||
|
||||
The chip exposes two subdevices:
|
||||
- a regulators: see ../regulator/act8945a-regulator.txt
|
||||
- a charger: see ../power/act8945a-charger.txt
|
||||
|
||||
Example:
|
||||
pmic@5b {
|
||||
compatible = "active-semi,act8945a";
|
||||
reg = <0x5b>;
|
||||
status = "okay";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_charger_chglev>;
|
||||
active-semi,chglev-gpio = <&pioA 12 GPIO_ACTIVE_HIGH>;
|
||||
active-semi,input-voltage-threshold-microvolt = <6600>;
|
||||
active-semi,precondition-timeout = <40>;
|
||||
active-semi,total-timeout = <3>;
|
||||
|
||||
active-semi,vsel-high;
|
||||
|
||||
regulators {
|
||||
vdd_1v35_reg: REG_DCDC1 {
|
||||
regulator-name = "VDD_1V35";
|
||||
regulator-min-microvolt = <1350000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_1v2_reg: REG_DCDC2 {
|
||||
regulator-name = "VDD_1V2";
|
||||
regulator-min-microvolt = <1100000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_3v3_reg: REG_DCDC3 {
|
||||
regulator-name = "VDD_3V3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_fuse_reg: REG_LDO1 {
|
||||
regulator-name = "VDD_FUSE";
|
||||
regulator-min-microvolt = <2500000>;
|
||||
regulator-max-microvolt = <2500000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_3v3_lp_reg: REG_LDO2 {
|
||||
regulator-name = "VDD_3V3_LP";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_led_reg: REG_LDO3 {
|
||||
regulator-name = "VDD_LED";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
vdd_sdhc_1v8_reg: REG_LDO4 {
|
||||
regulator-name = "VDD_SDHC_1V8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -5,11 +5,12 @@ axp152 (X-Powers)
|
||||
axp202 (X-Powers)
|
||||
axp209 (X-Powers)
|
||||
axp221 (X-Powers)
|
||||
axp223 (X-Powers)
|
||||
|
||||
Required properties:
|
||||
- compatible: "x-powers,axp152", "x-powers,axp202", "x-powers,axp209",
|
||||
"x-powers,axp221"
|
||||
- reg: The I2C slave address for the AXP chip
|
||||
"x-powers,axp221", "x-powers,axp223"
|
||||
- reg: The I2C slave address or RSB hardware address for the AXP chip
|
||||
- interrupt-parent: The parent interrupt controller
|
||||
- interrupts: SoC NMI / GPIO interrupt connected to the PMIC's IRQ pin
|
||||
- interrupt-controller: The PMIC has its own internal IRQs
|
||||
@@ -51,7 +52,7 @@ LDO3 : LDO : ldo3in-supply
|
||||
LDO4 : LDO : ldo24in-supply : shared supply
|
||||
LDO5 : LDO : ldo5in-supply
|
||||
|
||||
AXP221 regulators, type, and corresponding input supply names:
|
||||
AXP221/AXP223 regulators, type, and corresponding input supply names:
|
||||
|
||||
Regulator Type Supply Name Notes
|
||||
--------- ---- ----------- -----
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
Freescale MX25 ADC/TSC MultiFunction Device (MFD)
|
||||
|
||||
This device combines two general purpose conversion queues one used for general
|
||||
ADC and the other used for touchscreens.
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "fsl,imx25-tsadc".
|
||||
- reg: Start address and size of the memory area of
|
||||
the device
|
||||
- interrupts: Interrupt for this device
|
||||
(See: ../interrupt-controller/interrupts.txt)
|
||||
- clocks: An 'ipg' clock (See: ../clock/clock-bindings.txt)
|
||||
- interrupt-controller: This device is an interrupt controller. It
|
||||
controls the interrupts of both
|
||||
conversion queues.
|
||||
- #interrupt-cells: Should be '<1>'.
|
||||
- #address-cells: Should be '<1>'.
|
||||
- #size-cells: Should be '<1>'.
|
||||
|
||||
This device includes two conversion queues which can be added as subnodes.
|
||||
The first queue is for the touchscreen, the second for general purpose ADC.
|
||||
|
||||
Example:
|
||||
tscadc: tscadc@50030000 {
|
||||
compatible = "fsl,imx25-tsadc";
|
||||
reg = <0x50030000 0xc>;
|
||||
interrupts = <46>;
|
||||
clocks = <&clks 119>;
|
||||
clock-names = "ipg";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
tsc: tcq@50030400 {
|
||||
compatible = "fsl,imx25-tcq";
|
||||
reg = <0x50030400 0x60>;
|
||||
...
|
||||
};
|
||||
|
||||
adc: gcq@50030800 {
|
||||
compatible = "fsl,imx25-gcq";
|
||||
reg = <0x50030800 0x60>;
|
||||
...
|
||||
};
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
MediaTek MT6397 Multifunction Device Driver
|
||||
MediaTek MT6397/MT6323 Multifunction Device Driver
|
||||
|
||||
MT6397 is a multifunction device with the following sub modules:
|
||||
MT6397/MT6323 is a multifunction device with the following sub modules:
|
||||
- Regulator
|
||||
- RTC
|
||||
- Audio codec
|
||||
@@ -8,14 +8,14 @@ MT6397 is a multifunction device with the following sub modules:
|
||||
- Clock
|
||||
|
||||
It is interfaced to host controller using SPI interface by a proprietary hardware
|
||||
called PMIC wrapper or pwrap. MT6397 MFD is a child device of pwrap.
|
||||
called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
|
||||
See the following for pwarp node definitions:
|
||||
Documentation/devicetree/bindings/soc/pwrap.txt
|
||||
|
||||
This document describes the binding for MFD device and its sub module.
|
||||
|
||||
Required properties:
|
||||
compatible: "mediatek,mt6397"
|
||||
compatible: "mediatek,mt6397" or "mediatek,mt6323"
|
||||
|
||||
Optional subnodes:
|
||||
|
||||
@@ -26,6 +26,8 @@ Optional subnodes:
|
||||
Required properties:
|
||||
- compatible: "mediatek,mt6397-regulator"
|
||||
see Documentation/devicetree/bindings/regulator/mt6397-regulator.txt
|
||||
- compatible: "mediatek,mt6323-regulator"
|
||||
see Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
|
||||
- codec
|
||||
Required properties:
|
||||
- compatible: "mediatek,mt6397-codec"
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
* TPS65086 Power Management Integrated Circuit (PMIC) bindings
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "ti,tps65086".
|
||||
- reg : I2C slave address.
|
||||
- interrupt-parent : Phandle to the parent interrupt controller.
|
||||
- interrupts : The interrupt line the device is connected to.
|
||||
- interrupt-controller : Marks the device node as an interrupt controller.
|
||||
- #interrupt-cells : The number of cells to describe an IRQ, should be 2.
|
||||
The first cell is the IRQ number.
|
||||
The second cell is the flags, encoded as trigger
|
||||
masks from ../interrupt-controller/interrupts.txt.
|
||||
- gpio-controller : Marks the device node as a GPIO Controller.
|
||||
- #gpio-cells : Should be two. The first cell is the pin number and
|
||||
the second cell is used to specify flags.
|
||||
See ../gpio/gpio.txt for more information.
|
||||
- regulators: : List of child nodes that specify the regulator
|
||||
initialization data. Child nodes must be named
|
||||
after their hardware counterparts: buck[1-6],
|
||||
ldoa[1-3], swa1, swb[1-2], and vtt. Each child
|
||||
node is defined using the standard binding for
|
||||
regulators and the optional regulator properties
|
||||
defined below.
|
||||
|
||||
Optional regulator properties:
|
||||
- ti,regulator-step-size-25mv : This is applicable for buck[1,2,6], set this
|
||||
if the regulator is factory set with a 25mv
|
||||
step voltage mapping.
|
||||
- ti,regulator-decay : This is applicable for buck[1-6], set this if
|
||||
the output needs to decay, default is for
|
||||
the output to slew down.
|
||||
|
||||
Example:
|
||||
|
||||
pmic: tps65086@5e {
|
||||
compatible = "ti,tps65086";
|
||||
reg = <0x5e>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <28 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
|
||||
regulators {
|
||||
buck1 {
|
||||
regulator-name = "vcc1";
|
||||
regulator-min-microvolt = <1600000>;
|
||||
regulator-max-microvolt = <1600000>;
|
||||
regulator-boot-on;
|
||||
ti,regulator-decay;
|
||||
ti,regulator-step-size-25mv;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -898,6 +898,12 @@ config GPIO_TIMBERDALE
|
||||
---help---
|
||||
Add support for the GPIO IP in the timberdale FPGA.
|
||||
|
||||
config GPIO_TPS65086
|
||||
tristate "TI TPS65086 GPO"
|
||||
depends on MFD_TPS65086
|
||||
help
|
||||
This driver supports the GPO on TI TPS65086x PMICs.
|
||||
|
||||
config GPIO_TPS65218
|
||||
tristate "TPS65218 GPIO"
|
||||
depends on MFD_TPS65218
|
||||
|
||||
@@ -99,6 +99,7 @@ obj-$(CONFIG_ARCH_TEGRA) += gpio-tegra.o
|
||||
obj-$(CONFIG_GPIO_TIMBERDALE) += gpio-timberdale.o
|
||||
obj-$(CONFIG_GPIO_PALMAS) += gpio-palmas.o
|
||||
obj-$(CONFIG_GPIO_TPIC2810) += gpio-tpic2810.o
|
||||
obj-$(CONFIG_GPIO_TPS65086) += gpio-tps65086.o
|
||||
obj-$(CONFIG_GPIO_TPS65218) += gpio-tps65218.o
|
||||
obj-$(CONFIG_GPIO_TPS6586X) += gpio-tps6586x.o
|
||||
obj-$(CONFIG_GPIO_TPS65910) += gpio-tps65910.o
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
|
||||
* Andrew F. Davis <afd@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
* kind, whether expressed or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License version 2 for more details.
|
||||
*
|
||||
* Based on the TPS65912 driver
|
||||
*/
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/mfd/tps65086.h>
|
||||
|
||||
struct tps65086_gpio {
|
||||
struct gpio_chip chip;
|
||||
struct tps65086 *tps;
|
||||
};
|
||||
|
||||
static int tps65086_gpio_get_direction(struct gpio_chip *chip,
|
||||
unsigned offset)
|
||||
{
|
||||
/* This device is output only */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tps65086_gpio_direction_input(struct gpio_chip *chip,
|
||||
unsigned offset)
|
||||
{
|
||||
/* This device is output only */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int tps65086_gpio_direction_output(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
struct tps65086_gpio *gpio = gpiochip_get_data(chip);
|
||||
|
||||
/* Set the initial value */
|
||||
regmap_update_bits(gpio->tps->regmap, TPS65086_GPOCTRL,
|
||||
BIT(4 + offset), value ? BIT(4 + offset) : 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tps65086_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct tps65086_gpio *gpio = gpiochip_get_data(chip);
|
||||
int ret, val;
|
||||
|
||||
ret = regmap_read(gpio->tps->regmap, TPS65086_GPOCTRL, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return val & BIT(4 + offset);
|
||||
}
|
||||
|
||||
static void tps65086_gpio_set(struct gpio_chip *chip, unsigned offset,
|
||||
int value)
|
||||
{
|
||||
struct tps65086_gpio *gpio = gpiochip_get_data(chip);
|
||||
|
||||
regmap_update_bits(gpio->tps->regmap, TPS65086_GPOCTRL,
|
||||
BIT(4 + offset), value ? BIT(4 + offset) : 0);
|
||||
}
|
||||
|
||||
static struct gpio_chip template_chip = {
|
||||
.label = "tps65086-gpio",
|
||||
.owner = THIS_MODULE,
|
||||
.get_direction = tps65086_gpio_get_direction,
|
||||
.direction_input = tps65086_gpio_direction_input,
|
||||
.direction_output = tps65086_gpio_direction_output,
|
||||
.get = tps65086_gpio_get,
|
||||
.set = tps65086_gpio_set,
|
||||
.base = -1,
|
||||
.ngpio = 4,
|
||||
.can_sleep = true,
|
||||
};
|
||||
|
||||
static int tps65086_gpio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct tps65086_gpio *gpio;
|
||||
int ret;
|
||||
|
||||
gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
|
||||
if (!gpio)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, gpio);
|
||||
|
||||
gpio->tps = dev_get_drvdata(pdev->dev.parent);
|
||||
gpio->chip = template_chip;
|
||||
gpio->chip.parent = gpio->tps->dev;
|
||||
|
||||
ret = gpiochip_add_data(&gpio->chip, gpio);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Could not register gpiochip, %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tps65086_gpio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct tps65086_gpio *gpio = platform_get_drvdata(pdev);
|
||||
|
||||
gpiochip_remove(&gpio->chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct platform_device_id tps65086_gpio_id_table[] = {
|
||||
{ "tps65086-gpio", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(platform, tps65086_gpio_id_table);
|
||||
|
||||
static struct platform_driver tps65086_gpio_driver = {
|
||||
.driver = {
|
||||
.name = "tps65086-gpio",
|
||||
},
|
||||
.probe = tps65086_gpio_probe,
|
||||
.remove = tps65086_gpio_remove,
|
||||
.id_table = tps65086_gpio_id_table,
|
||||
};
|
||||
module_platform_driver(tps65086_gpio_driver);
|
||||
|
||||
MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
|
||||
MODULE_DESCRIPTION("TPS65086 GPIO driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
@@ -194,6 +194,13 @@ config EXYNOS_ADC
|
||||
To compile this driver as a module, choose M here: the module will be
|
||||
called exynos_adc.
|
||||
|
||||
config FSL_MX25_ADC
|
||||
tristate "Freescale MX25 ADC driver"
|
||||
depends on MFD_MX25_TSADC
|
||||
help
|
||||
Generic Conversion Queue driver used for general purpose ADC in the
|
||||
MX25. This driver supports single measurements using the MX25 ADC.
|
||||
|
||||
config HI8435
|
||||
tristate "Holt Integrated Circuits HI-8435 threshold detector"
|
||||
select IIO_TRIGGERED_EVENT
|
||||
|
||||
@@ -20,6 +20,7 @@ obj-$(CONFIG_BERLIN2_ADC) += berlin2-adc.o
|
||||
obj-$(CONFIG_CC10001_ADC) += cc10001_adc.o
|
||||
obj-$(CONFIG_DA9150_GPADC) += da9150-gpadc.o
|
||||
obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o
|
||||
obj-$(CONFIG_FSL_MX25_ADC) += fsl-imx25-gcq.o
|
||||
obj-$(CONFIG_HI8435) += hi8435.o
|
||||
obj-$(CONFIG_IMX7D_ADC) += imx7d_adc.o
|
||||
obj-$(CONFIG_INA2XX_ADC) += ina2xx-adc.o
|
||||
|
||||
@@ -0,0 +1,417 @@
|
||||
/*
|
||||
* Copyright (C) 2014-2015 Pengutronix, Markus Pargmann <mpa@pengutronix.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License version 2 as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This is the driver for the imx25 GCQ (Generic Conversion Queue)
|
||||
* connected to the imx25 ADC.
|
||||
*/
|
||||
|
||||
#include <dt-bindings/iio/adc/fsl-imx25-gcq.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/iio/iio.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mfd/imx25-tsadc.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#define MX25_GCQ_TIMEOUT (msecs_to_jiffies(2000))
|
||||
|
||||
static const char * const driver_name = "mx25-gcq";
|
||||
|
||||
enum mx25_gcq_cfgs {
|
||||
MX25_CFG_XP = 0,
|
||||
MX25_CFG_YP,
|
||||
MX25_CFG_XN,
|
||||
MX25_CFG_YN,
|
||||
MX25_CFG_WIPER,
|
||||
MX25_CFG_INAUX0,
|
||||
MX25_CFG_INAUX1,
|
||||
MX25_CFG_INAUX2,
|
||||
MX25_NUM_CFGS,
|
||||
};
|
||||
|
||||
struct mx25_gcq_priv {
|
||||
struct regmap *regs;
|
||||
struct completion completed;
|
||||
struct clk *clk;
|
||||
int irq;
|
||||
struct regulator *vref[4];
|
||||
u32 channel_vref_mv[MX25_NUM_CFGS];
|
||||
};
|
||||
|
||||
#define MX25_CQG_CHAN(chan, id) {\
|
||||
.type = IIO_VOLTAGE,\
|
||||
.indexed = 1,\
|
||||
.channel = chan,\
|
||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
||||
BIT(IIO_CHAN_INFO_SCALE),\
|
||||
.datasheet_name = id,\
|
||||
}
|
||||
|
||||
static const struct iio_chan_spec mx25_gcq_channels[MX25_NUM_CFGS] = {
|
||||
MX25_CQG_CHAN(MX25_CFG_XP, "xp"),
|
||||
MX25_CQG_CHAN(MX25_CFG_YP, "yp"),
|
||||
MX25_CQG_CHAN(MX25_CFG_XN, "xn"),
|
||||
MX25_CQG_CHAN(MX25_CFG_YN, "yn"),
|
||||
MX25_CQG_CHAN(MX25_CFG_WIPER, "wiper"),
|
||||
MX25_CQG_CHAN(MX25_CFG_INAUX0, "inaux0"),
|
||||
MX25_CQG_CHAN(MX25_CFG_INAUX1, "inaux1"),
|
||||
MX25_CQG_CHAN(MX25_CFG_INAUX2, "inaux2"),
|
||||
};
|
||||
|
||||
static const char * const mx25_gcq_refp_names[] = {
|
||||
[MX25_ADC_REFP_YP] = "yp",
|
||||
[MX25_ADC_REFP_XP] = "xp",
|
||||
[MX25_ADC_REFP_INT] = "int",
|
||||
[MX25_ADC_REFP_EXT] = "ext",
|
||||
};
|
||||
|
||||
static irqreturn_t mx25_gcq_irq(int irq, void *data)
|
||||
{
|
||||
struct mx25_gcq_priv *priv = data;
|
||||
u32 stats;
|
||||
|
||||
regmap_read(priv->regs, MX25_ADCQ_SR, &stats);
|
||||
|
||||
if (stats & MX25_ADCQ_SR_EOQ) {
|
||||
regmap_update_bits(priv->regs, MX25_ADCQ_MR,
|
||||
MX25_ADCQ_MR_EOQ_IRQ, MX25_ADCQ_MR_EOQ_IRQ);
|
||||
complete(&priv->completed);
|
||||
}
|
||||
|
||||
/* Disable conversion queue run */
|
||||
regmap_update_bits(priv->regs, MX25_ADCQ_CR, MX25_ADCQ_CR_FQS, 0);
|
||||
|
||||
/* Acknowledge all possible irqs */
|
||||
regmap_write(priv->regs, MX25_ADCQ_SR, MX25_ADCQ_SR_FRR |
|
||||
MX25_ADCQ_SR_FUR | MX25_ADCQ_SR_FOR |
|
||||
MX25_ADCQ_SR_EOQ | MX25_ADCQ_SR_PD);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int mx25_gcq_get_raw_value(struct device *dev,
|
||||
struct iio_chan_spec const *chan,
|
||||
struct mx25_gcq_priv *priv,
|
||||
int *val)
|
||||
{
|
||||
long timeout;
|
||||
u32 data;
|
||||
|
||||
/* Setup the configuration we want to use */
|
||||
regmap_write(priv->regs, MX25_ADCQ_ITEM_7_0,
|
||||
MX25_ADCQ_ITEM(0, chan->channel));
|
||||
|
||||
regmap_update_bits(priv->regs, MX25_ADCQ_MR, MX25_ADCQ_MR_EOQ_IRQ, 0);
|
||||
|
||||
/* Trigger queue for one run */
|
||||
regmap_update_bits(priv->regs, MX25_ADCQ_CR, MX25_ADCQ_CR_FQS,
|
||||
MX25_ADCQ_CR_FQS);
|
||||
|
||||
timeout = wait_for_completion_interruptible_timeout(
|
||||
&priv->completed, MX25_GCQ_TIMEOUT);
|
||||
if (timeout < 0) {
|
||||
dev_err(dev, "ADC wait for measurement failed\n");
|
||||
return timeout;
|
||||
} else if (timeout == 0) {
|
||||
dev_err(dev, "ADC timed out\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
regmap_read(priv->regs, MX25_ADCQ_FIFO, &data);
|
||||
|
||||
*val = MX25_ADCQ_FIFO_DATA(data);
|
||||
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
||||
static int mx25_gcq_read_raw(struct iio_dev *indio_dev,
|
||||
struct iio_chan_spec const *chan, int *val,
|
||||
int *val2, long mask)
|
||||
{
|
||||
struct mx25_gcq_priv *priv = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
ret = mx25_gcq_get_raw_value(&indio_dev->dev, chan, priv, val);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
return ret;
|
||||
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
*val = priv->channel_vref_mv[chan->channel];
|
||||
*val2 = 12;
|
||||
return IIO_VAL_FRACTIONAL_LOG2;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct iio_info mx25_gcq_iio_info = {
|
||||
.read_raw = mx25_gcq_read_raw,
|
||||
};
|
||||
|
||||
static const struct regmap_config mx25_gcq_regconfig = {
|
||||
.max_register = 0x5c,
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
};
|
||||
|
||||
static int mx25_gcq_setup_cfgs(struct platform_device *pdev,
|
||||
struct mx25_gcq_priv *priv)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *child;
|
||||
struct device *dev = &pdev->dev;
|
||||
unsigned int refp_used[4] = {};
|
||||
int ret, i;
|
||||
|
||||
/*
|
||||
* Setup all configurations registers with a default conversion
|
||||
* configuration for each input
|
||||
*/
|
||||
for (i = 0; i < MX25_NUM_CFGS; ++i)
|
||||
regmap_write(priv->regs, MX25_ADCQ_CFG(i),
|
||||
MX25_ADCQ_CFG_YPLL_OFF |
|
||||
MX25_ADCQ_CFG_XNUR_OFF |
|
||||
MX25_ADCQ_CFG_XPUL_OFF |
|
||||
MX25_ADCQ_CFG_REFP_INT |
|
||||
MX25_ADCQ_CFG_IN(i) |
|
||||
MX25_ADCQ_CFG_REFN_NGND2);
|
||||
|
||||
/*
|
||||
* First get all regulators to store them in channel_vref_mv if
|
||||
* necessary. Later we use that information for proper IIO scale
|
||||
* information.
|
||||
*/
|
||||
priv->vref[MX25_ADC_REFP_INT] = NULL;
|
||||
priv->vref[MX25_ADC_REFP_EXT] =
|
||||
devm_regulator_get_optional(&pdev->dev, "vref-ext");
|
||||
priv->vref[MX25_ADC_REFP_XP] =
|
||||
devm_regulator_get_optional(&pdev->dev, "vref-xp");
|
||||
priv->vref[MX25_ADC_REFP_YP] =
|
||||
devm_regulator_get_optional(&pdev->dev, "vref-yp");
|
||||
|
||||
for_each_child_of_node(np, child) {
|
||||
u32 reg;
|
||||
u32 refp = MX25_ADCQ_CFG_REFP_INT;
|
||||
u32 refn = MX25_ADCQ_CFG_REFN_NGND2;
|
||||
|
||||
ret = of_property_read_u32(child, "reg", ®);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to get reg property\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (reg >= MX25_NUM_CFGS) {
|
||||
dev_err(dev,
|
||||
"reg value is greater than the number of available configuration registers\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
of_property_read_u32(child, "fsl,adc-refp", &refp);
|
||||
of_property_read_u32(child, "fsl,adc-refn", &refn);
|
||||
|
||||
switch (refp) {
|
||||
case MX25_ADC_REFP_EXT:
|
||||
case MX25_ADC_REFP_XP:
|
||||
case MX25_ADC_REFP_YP:
|
||||
if (IS_ERR(priv->vref[refp])) {
|
||||
dev_err(dev, "Error, trying to use external voltage reference without a vref-%s regulator.",
|
||||
mx25_gcq_refp_names[refp]);
|
||||
return PTR_ERR(priv->vref[refp]);
|
||||
}
|
||||
priv->channel_vref_mv[reg] =
|
||||
regulator_get_voltage(priv->vref[refp]);
|
||||
/* Conversion from uV to mV */
|
||||
priv->channel_vref_mv[reg] /= 1000;
|
||||
break;
|
||||
case MX25_ADC_REFP_INT:
|
||||
priv->channel_vref_mv[reg] = 2500;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "Invalid positive reference %d\n", refp);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
++refp_used[refp];
|
||||
|
||||
/*
|
||||
* Shift the read values to the correct positions within the
|
||||
* register.
|
||||
*/
|
||||
refp = MX25_ADCQ_CFG_REFP(refp);
|
||||
refn = MX25_ADCQ_CFG_REFN(refn);
|
||||
|
||||
if ((refp & MX25_ADCQ_CFG_REFP_MASK) != refp) {
|
||||
dev_err(dev, "Invalid fsl,adc-refp property value\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if ((refn & MX25_ADCQ_CFG_REFN_MASK) != refn) {
|
||||
dev_err(dev, "Invalid fsl,adc-refn property value\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
regmap_update_bits(priv->regs, MX25_ADCQ_CFG(reg),
|
||||
MX25_ADCQ_CFG_REFP_MASK |
|
||||
MX25_ADCQ_CFG_REFN_MASK,
|
||||
refp | refn);
|
||||
}
|
||||
regmap_update_bits(priv->regs, MX25_ADCQ_CR,
|
||||
MX25_ADCQ_CR_FRST | MX25_ADCQ_CR_QRST,
|
||||
MX25_ADCQ_CR_FRST | MX25_ADCQ_CR_QRST);
|
||||
|
||||
regmap_write(priv->regs, MX25_ADCQ_CR,
|
||||
MX25_ADCQ_CR_PDMSK | MX25_ADCQ_CR_QSM_FQS);
|
||||
|
||||
/* Remove unused regulators */
|
||||
for (i = 0; i != 4; ++i) {
|
||||
if (!refp_used[i]) {
|
||||
if (!IS_ERR_OR_NULL(priv->vref[i]))
|
||||
devm_regulator_put(priv->vref[i]);
|
||||
priv->vref[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mx25_gcq_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct iio_dev *indio_dev;
|
||||
struct mx25_gcq_priv *priv;
|
||||
struct mx25_tsadc *tsadc = dev_get_drvdata(pdev->dev.parent);
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
void __iomem *mem;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv));
|
||||
if (!indio_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
priv = iio_priv(indio_dev);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
mem = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(mem))
|
||||
return PTR_ERR(mem);
|
||||
|
||||
priv->regs = devm_regmap_init_mmio(dev, mem, &mx25_gcq_regconfig);
|
||||
if (IS_ERR(priv->regs)) {
|
||||
dev_err(dev, "Failed to initialize regmap\n");
|
||||
return PTR_ERR(priv->regs);
|
||||
}
|
||||
|
||||
init_completion(&priv->completed);
|
||||
|
||||
ret = mx25_gcq_setup_cfgs(pdev, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i != 4; ++i) {
|
||||
if (!priv->vref[i])
|
||||
continue;
|
||||
|
||||
ret = regulator_enable(priv->vref[i]);
|
||||
if (ret)
|
||||
goto err_regulator_disable;
|
||||
}
|
||||
|
||||
priv->clk = tsadc->clk;
|
||||
ret = clk_prepare_enable(priv->clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to enable clock\n");
|
||||
goto err_vref_disable;
|
||||
}
|
||||
|
||||
priv->irq = platform_get_irq(pdev, 0);
|
||||
if (priv->irq <= 0) {
|
||||
dev_err(dev, "Failed to get IRQ\n");
|
||||
ret = priv->irq;
|
||||
if (!ret)
|
||||
ret = -ENXIO;
|
||||
goto err_clk_unprepare;
|
||||
}
|
||||
|
||||
ret = request_irq(priv->irq, mx25_gcq_irq, 0, pdev->name, priv);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed requesting IRQ\n");
|
||||
goto err_clk_unprepare;
|
||||
}
|
||||
|
||||
indio_dev->dev.parent = &pdev->dev;
|
||||
indio_dev->channels = mx25_gcq_channels;
|
||||
indio_dev->num_channels = ARRAY_SIZE(mx25_gcq_channels);
|
||||
indio_dev->info = &mx25_gcq_iio_info;
|
||||
indio_dev->name = driver_name;
|
||||
|
||||
ret = iio_device_register(indio_dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register iio device\n");
|
||||
goto err_irq_free;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, indio_dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_irq_free:
|
||||
free_irq(priv->irq, priv);
|
||||
err_clk_unprepare:
|
||||
clk_disable_unprepare(priv->clk);
|
||||
err_vref_disable:
|
||||
i = 4;
|
||||
err_regulator_disable:
|
||||
for (; i-- > 0;) {
|
||||
if (priv->vref[i])
|
||||
regulator_disable(priv->vref[i]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mx25_gcq_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
|
||||
struct mx25_gcq_priv *priv = iio_priv(indio_dev);
|
||||
int i;
|
||||
|
||||
iio_device_unregister(indio_dev);
|
||||
free_irq(priv->irq, priv);
|
||||
clk_disable_unprepare(priv->clk);
|
||||
for (i = 4; i-- > 0;) {
|
||||
if (priv->vref[i])
|
||||
regulator_disable(priv->vref[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id mx25_gcq_ids[] = {
|
||||
{ .compatible = "fsl,imx25-gcq", },
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static struct platform_driver mx25_gcq_driver = {
|
||||
.driver = {
|
||||
.name = "mx25-gcq",
|
||||
.of_match_table = mx25_gcq_ids,
|
||||
},
|
||||
.probe = mx25_gcq_probe,
|
||||
.remove = mx25_gcq_remove,
|
||||
};
|
||||
module_platform_driver(mx25_gcq_driver);
|
||||
|
||||
MODULE_DESCRIPTION("ADC driver for Freescale mx25");
|
||||
MODULE_AUTHOR("Markus Pargmann <mpa@pengutronix.de>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
@@ -833,6 +833,15 @@ config TOUCHSCREEN_USB_COMPOSITE
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called usbtouchscreen.
|
||||
|
||||
config TOUCHSCREEN_MX25
|
||||
tristate "Freescale i.MX25 touchscreen input driver"
|
||||
depends on MFD_MX25_TSADC
|
||||
help
|
||||
Enable support for touchscreen connected to your i.MX25.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called fsl-imx25-tcq.
|
||||
|
||||
config TOUCHSCREEN_MC13783
|
||||
tristate "Freescale MC13783 touchscreen input driver"
|
||||
depends on MFD_MC13XXX
|
||||
|
||||
@@ -46,6 +46,7 @@ obj-$(CONFIG_TOUCHSCREEN_INTEL_MID) += intel-mid-touch.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_IPROC) += bcm_iproc_tsc.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_LPC32XX) += lpc32xx_ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_MAX11801) += max11801_ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_MX25) += fsl-imx25-tcq.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_MC13783) += mc13783_ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_MCS5000) += mcs5000_ts.o
|
||||
obj-$(CONFIG_TOUCHSCREEN_MELFAS_MIP4) += melfas_mip4.o
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+63
-17
@@ -18,6 +18,17 @@ config MFD_CS5535
|
||||
This is the core driver for CS5535/CS5536 MFD functions. This is
|
||||
necessary for using the board's GPIO and MFGPT functionality.
|
||||
|
||||
config MFD_ACT8945A
|
||||
tristate "Active-semi ACT8945A"
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
depends on I2C && OF
|
||||
help
|
||||
Support for the ACT8945A PMIC from Active-semi. This device
|
||||
features three step-down DC/DC converters and four low-dropout
|
||||
linear regulators, along with a complete ActivePath battery
|
||||
charger.
|
||||
|
||||
config MFD_AS3711
|
||||
bool "AMS AS3711"
|
||||
select MFD_CORE
|
||||
@@ -91,14 +102,29 @@ config MFD_BCM590XX
|
||||
Support for the BCM590xx PMUs from Broadcom
|
||||
|
||||
config MFD_AXP20X
|
||||
bool "X-Powers AXP20X"
|
||||
tristate
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
depends on I2C=y
|
||||
|
||||
config MFD_AXP20X_I2C
|
||||
tristate "X-Powers AXP series PMICs with I2C"
|
||||
select MFD_AXP20X
|
||||
select REGMAP_I2C
|
||||
depends on I2C
|
||||
help
|
||||
If you say Y here you get support for the X-Powers AXP202, AXP209 and
|
||||
AXP288 power management IC (PMIC).
|
||||
If you say Y here you get support for the X-Powers AXP series power
|
||||
management ICs (PMICs) controlled with I2C.
|
||||
This driver include only the core APIs. You have to select individual
|
||||
components like regulators or the PEK (Power Enable Key) under the
|
||||
corresponding menus.
|
||||
|
||||
config MFD_AXP20X_RSB
|
||||
tristate "X-Powers AXP series PMICs with RSB"
|
||||
select MFD_AXP20X
|
||||
depends on SUNXI_RSB
|
||||
help
|
||||
If you say Y here you get support for the X-Powers AXP series power
|
||||
management ICs (PMICs) controlled with RSB.
|
||||
This driver include only the core APIs. You have to select individual
|
||||
components like regulators or the PEK (Power Enable Key) under the
|
||||
corresponding menus.
|
||||
@@ -203,7 +229,7 @@ config MFD_DA9062
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
help
|
||||
Say yes here for support for the Dialog Semiconductor DA9062 PMIC.
|
||||
This includes the I2C driver and core APIs.
|
||||
@@ -215,7 +241,7 @@ config MFD_DA9063
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
help
|
||||
Say yes here for support for the Dialog Semiconductor DA9063 PMIC.
|
||||
This includes the I2C driver and core APIs.
|
||||
@@ -224,7 +250,7 @@ config MFD_DA9063
|
||||
|
||||
config MFD_DA9150
|
||||
tristate "Dialog Semiconductor DA9150 Charger Fuel-Gauge chip"
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
@@ -271,6 +297,15 @@ config MFD_MC13XXX_I2C
|
||||
help
|
||||
Select this if your MC13xxx is connected via an I2C bus.
|
||||
|
||||
config MFD_MX25_TSADC
|
||||
tristate "Freescale i.MX25 integrated Touchscreen and ADC unit"
|
||||
select REGMAP_MMIO
|
||||
depends on (SOC_IMX25 && OF) || COMPILE_TEST
|
||||
help
|
||||
Enable support for the integrated Touchscreen and ADC unit of the
|
||||
i.MX25 processors. They consist of a conversion queue for general
|
||||
purpose ADC and a queue for Touchscreens.
|
||||
|
||||
config MFD_HI6421_PMIC
|
||||
tristate "HiSilicon Hi6421 PMU/Codec IC"
|
||||
depends on OF
|
||||
@@ -445,7 +480,7 @@ config MFD_KEMPLD
|
||||
|
||||
config MFD_88PM800
|
||||
tristate "Marvell 88PM800"
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
select MFD_CORE
|
||||
@@ -457,7 +492,7 @@ config MFD_88PM800
|
||||
|
||||
config MFD_88PM805
|
||||
tristate "Marvell 88PM805"
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
select MFD_CORE
|
||||
@@ -493,8 +528,8 @@ config MFD_MAX14577
|
||||
of the device.
|
||||
|
||||
config MFD_MAX77686
|
||||
bool "Maxim Semiconductor MAX77686/802 PMIC Support"
|
||||
depends on I2C=y
|
||||
tristate "Maxim Semiconductor MAX77686/802 PMIC Support"
|
||||
depends on I2C
|
||||
depends on OF
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
@@ -538,7 +573,7 @@ config MFD_MAX77843
|
||||
config MFD_MAX8907
|
||||
tristate "Maxim Semiconductor MAX8907 PMIC Support"
|
||||
select MFD_CORE
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
help
|
||||
@@ -743,7 +778,7 @@ config MFD_RTSX_PCI
|
||||
|
||||
config MFD_RT5033
|
||||
tristate "Richtek RT5033 Power Management IC"
|
||||
depends on I2C=y
|
||||
depends on I2C
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
@@ -1106,6 +1141,19 @@ config TPS6507X
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called tps6507x.
|
||||
|
||||
config MFD_TPS65086
|
||||
tristate "TI TPS65086 Power Management Integrated Chips (PMICs)"
|
||||
select REGMAP
|
||||
select REGMAP_IRQ
|
||||
select REGMAP_I2C
|
||||
depends on I2C
|
||||
help
|
||||
If you say yes here you get support for the TPS65086 series of
|
||||
Power Management chips.
|
||||
This driver provides common support for accessing the device,
|
||||
additional drivers must be enabled in order to use the
|
||||
functionality of the device.
|
||||
|
||||
config TPS65911_COMPARATOR
|
||||
tristate
|
||||
|
||||
@@ -1370,7 +1418,6 @@ config MFD_ARIZONA
|
||||
config MFD_ARIZONA_I2C
|
||||
tristate "Cirrus Logic/Wolfson Microelectronics Arizona platform with I2C"
|
||||
select MFD_ARIZONA
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
depends on I2C
|
||||
help
|
||||
@@ -1380,12 +1427,11 @@ config MFD_ARIZONA_I2C
|
||||
config MFD_ARIZONA_SPI
|
||||
tristate "Cirrus Logic/Wolfson Microelectronics Arizona platform with SPI"
|
||||
select MFD_ARIZONA
|
||||
select MFD_CORE
|
||||
select REGMAP_SPI
|
||||
depends on SPI_MASTER
|
||||
help
|
||||
Support for the Cirrus Logic/Wolfson Microelectronics Arizona platform
|
||||
audio SoC core functionality controlled via I2C.
|
||||
audio SoC core functionality controlled via SPI.
|
||||
|
||||
config MFD_CS47L24
|
||||
bool "Cirrus Logic CS47L24 and WM1831"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
obj-$(CONFIG_MFD_88PM860X) += 88pm860x.o
|
||||
obj-$(CONFIG_MFD_88PM800) += 88pm800.o 88pm80x.o
|
||||
obj-$(CONFIG_MFD_88PM805) += 88pm805.o 88pm80x.o
|
||||
obj-$(CONFIG_MFD_ACT8945A) += act8945a.o
|
||||
obj-$(CONFIG_MFD_SM501) += sm501.o
|
||||
obj-$(CONFIG_MFD_ASIC3) += asic3.o tmio_core.o
|
||||
obj-$(CONFIG_MFD_BCM590XX) += bcm590xx.o
|
||||
@@ -70,6 +71,7 @@ obj-$(CONFIG_MFD_WM8994) += wm8994.o
|
||||
obj-$(CONFIG_TPS6105X) += tps6105x.o
|
||||
obj-$(CONFIG_TPS65010) += tps65010.o
|
||||
obj-$(CONFIG_TPS6507X) += tps6507x.o
|
||||
obj-$(CONFIG_MFD_TPS65086) += tps65086.o
|
||||
obj-$(CONFIG_MFD_TPS65217) += tps65217.o
|
||||
obj-$(CONFIG_MFD_TPS65218) += tps65218.o
|
||||
obj-$(CONFIG_MFD_TPS65910) += tps65910.o
|
||||
@@ -84,6 +86,8 @@ obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o
|
||||
obj-$(CONFIG_MFD_TWL4030_AUDIO) += twl4030-audio.o
|
||||
obj-$(CONFIG_TWL6040_CORE) += twl6040.o
|
||||
|
||||
obj-$(CONFIG_MFD_MX25_TSADC) += fsl-imx25-tsadc.o
|
||||
|
||||
obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o
|
||||
obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o
|
||||
obj-$(CONFIG_MFD_MC13XXX_I2C) += mc13xxx-i2c.o
|
||||
@@ -110,6 +114,8 @@ obj-$(CONFIG_PMIC_DA9052) += da9052-core.o
|
||||
obj-$(CONFIG_MFD_DA9052_SPI) += da9052-spi.o
|
||||
obj-$(CONFIG_MFD_DA9052_I2C) += da9052-i2c.o
|
||||
obj-$(CONFIG_MFD_AXP20X) += axp20x.o
|
||||
obj-$(CONFIG_MFD_AXP20X_I2C) += axp20x-i2c.o
|
||||
obj-$(CONFIG_MFD_AXP20X_RSB) += axp20x-rsb.o
|
||||
|
||||
obj-$(CONFIG_MFD_LP3943) += lp3943.o
|
||||
obj-$(CONFIG_MFD_LP8788) += lp8788.o lp8788-irq.o
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* MFD driver for Active-semi ACT8945a PMIC
|
||||
*
|
||||
* Copyright (C) 2015 Atmel Corporation.
|
||||
*
|
||||
* Author: Wenyou Yang <wenyou.yang@atmel.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
static const struct mfd_cell act8945a_devs[] = {
|
||||
{
|
||||
.name = "act8945a-regulator",
|
||||
},
|
||||
{
|
||||
.name = "act8945a-charger",
|
||||
},
|
||||
};
|
||||
|
||||
static const struct regmap_config act8945a_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
};
|
||||
|
||||
static int act8945a_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
struct regmap *regmap;
|
||||
|
||||
regmap = devm_regmap_init_i2c(i2c, &act8945a_regmap_config);
|
||||
if (IS_ERR(regmap)) {
|
||||
ret = PTR_ERR(regmap);
|
||||
dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
i2c_set_clientdata(i2c, regmap);
|
||||
|
||||
ret = mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE, act8945a_devs,
|
||||
ARRAY_SIZE(act8945a_devs), NULL, 0, NULL);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "Failed to add sub devices\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int act8945a_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
mfd_remove_devices(&i2c->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id act8945a_i2c_id[] = {
|
||||
{ "act8945a", 0 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, act8945a_i2c_id);
|
||||
|
||||
static const struct of_device_id act8945a_of_match[] = {
|
||||
{ .compatible = "active-semi,act8945a", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, act8945a_of_match);
|
||||
|
||||
static struct i2c_driver act8945a_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "act8945a",
|
||||
.of_match_table = of_match_ptr(act8945a_of_match),
|
||||
},
|
||||
.probe = act8945a_i2c_probe,
|
||||
.remove = act8945a_i2c_remove,
|
||||
.id_table = act8945a_i2c_id,
|
||||
};
|
||||
|
||||
static int __init act8945a_i2c_init(void)
|
||||
{
|
||||
return i2c_add_driver(&act8945a_i2c_driver);
|
||||
}
|
||||
subsys_initcall(act8945a_i2c_init);
|
||||
|
||||
static void __exit act8945a_i2c_exit(void)
|
||||
{
|
||||
i2c_del_driver(&act8945a_i2c_driver);
|
||||
}
|
||||
module_exit(act8945a_i2c_exit);
|
||||
|
||||
MODULE_DESCRIPTION("ACT8945A PMIC multi-function driver");
|
||||
MODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -108,8 +108,8 @@ static const struct regmap_config as3711_regmap_config = {
|
||||
.volatile_reg = as3711_volatile_reg,
|
||||
.readable_reg = as3711_readable_reg,
|
||||
.precious_reg = as3711_precious_reg,
|
||||
.max_register = AS3711_MAX_REGS,
|
||||
.num_reg_defaults_raw = AS3711_MAX_REGS,
|
||||
.max_register = AS3711_MAX_REG,
|
||||
.num_reg_defaults_raw = AS3711_NUM_REGS,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
};
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user