- New Drivers

- Add support for USART SPI to AT91*
 
  - New Functionality
    - Add support for Audio CODECs to motorola-cpcap
 
  - Fix-ups
    - DT documentation fix-ups; atmel-usart
    - Staticise functions/structs; spi-at91-usart, arizona-core
    - Constify; ti-lmu
    - Fix memory leaks; menelaus
    - Change device 'wake-up' status; ti_am335x_tscadc, max8997
    - Power Management (suspend/resume) semantic changes; ti_am335x_adc, cros_ec, max8997
    - SPDX churn; sec-core (+ headers), max* (+ headers), intel* (+ headers),
    - Trivial (whitespace, email addresses, alphabetisise); Kconfig, adp5520, intel_soc_pmic_*
    - Build as module; sec-irq
    - Use new %pOFn printk format for device_node.name; max77620
    - Remove unused code; madera
    - Use generic MACROs; intel_msic, intel_soc_pmic_crc
    - Move to GPIOD; ti-lmu
    - Use managed resources; ti-lmu
 
  - Bug Fixes
    - Add missing headers; at91-usart
    - Prevent device from entering low-power mode; arizona-core
    - Poll for BOOT_DONE to avoid still-booting NACK; madera-core
    - Prevent ADC read from shutting down device; mc13xxx-core
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEdrbJNaO+IJqU8IdIUa+KL4f8d2EFAlvO94AACgkQUa+KL4f8
 d2GCaQ//XKJZ14EVT8gHVWekwUCJoqqLDDZH5Y+MDZkyq8ZnWZ3Iz2DeQ/g7KIAv
 EwtmWm4+TmfBMHziZSK3lZc/VBdhOWsFqi7/B1vQQ3n7RWHvhRcvFWASSzqCPpQP
 L7WbUtZWaeHx/26OKz1okbQbMuHEv11z8seXEX6axtSXlCbAF72fUaHDTAY0dCHD
 LAkomYee6wF3ohSwaPEH5FsgGRJ5ihnFmK8uGML+vBMq9IfrFOmOitrJmpOwPHud
 wKSEsKmVALeX/fP0kqcvaYOWTpNQecKEnJXH4uw0CC3QOIpL5nMmfKOjMfMF6wAq
 m76s5ZBt0UUMDZSiex+mzYQyfEXaP6bExtiUIfkXOii9uuaIIJ2J8rRLzoUrwpLy
 qTuGiIoUr3aoUFNx1uzmzeYVNLcQ2JeIrRw+MKlP60RiYDYyk8Ip96/ay+vLZXOl
 WTGFr9T5CnfjaHkoSgVcBu+F5q0v6qbvv0tBpjgYaRe9OClEEFqCSHqLo0oYwyeQ
 L4Y+tmGaDtUeRFdRyLp45X0y/DiThVkkDdOfRi3Fxn3PW4OxMOsU/GLCMQrbGXOr
 q5pJuSFjimu+JDZ2ibmMOtWrgtJ2EjTiBYLcDZNP2sujSWFE8azoEqGMXcQFDw/a
 Ltc6b474UNp9SGB4IC97f/B6EFUJ/TQWjo4WJXVEHdCRilRWBgM=
 =7B+Y
 -----END PGP SIGNATURE-----

Merge tag 'mfd-next-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd

Pull MFD updates from Lee Jones:
 "New Drivers
   - Add support for USART SPI to AT91*

  New Functionality
   - Add support for Audio CODECs to motorola-cpcap

  Fix-ups
   - DT documentation fix-ups; atmel-usart
   - Staticise functions/structs; spi-at91-usart, arizona-core
   - Constify; ti-lmu
   - Fix memory leaks; menelaus
   - Change device 'wake-up' status; ti_am335x_tscadc, max8997
   - Power Management (suspend/resume) semantic changes; ti_am335x_adc, cros_ec, max8997
   - SPDX churn; sec-core (+ headers), max* (+ headers), intel* (+ headers),
   - Trivial (whitespace, email addresses, alphabetisise); Kconfig, adp5520, intel_soc_pmic_*
   - Build as module; sec-irq
   - Use new %pOFn printk format for device_node.name; max77620
   - Remove unused code; madera
   - Use generic MACROs; intel_msic, intel_soc_pmic_crc
   - Move to GPIOD; ti-lmu
   - Use managed resources; ti-lmu

  Bug Fixes
   - Add missing headers; at91-usart
   - Prevent device from entering low-power mode; arizona-core
   - Poll for BOOT_DONE to avoid still-booting NACK; madera-core
   - Prevent ADC read from shutting down device; mc13xxx-core"

* tag 'mfd-next-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (45 commits)
  mfd: cros_ec: Avoid unneeded internal declaration warning
  mfd: ti-lmu: Use of_device_get_match_data() helper
  mfd: ti-lmu: Use managed resource for everything
  mfd: ti-lmu: Switch to GPIOD
  mfd: ti-lmu: constify mfd_cell tables
  mfd: max8997: Disable interrupt handling for suspend/resume cycle
  mfd: max8997: Enale irq-wakeup unconditionally
  mfd: arizona: Make array mclk_name static, shrinks object size
  MAINTAINERS: Add myself as designated reviewer of Intel MFD PMIC
  mfd: Convert Intel PMIC drivers to use SPDX identifier 1;5201;0c Reduce size of duplicated comments by switching to use SPDX identifier.
  mfd: Sort headers alphabetically for Intel PMIC drivers
  mfd: intel_soc_pmic_bxtwc: Chain power button IRQs as well
  mfd: intel_soc_pmic_crc: Use REGMAP_IRQ_REG() macro
  mfd: intel_soc_pmic_crc: Use DEFINE_RES_IRQ_NAMED() macro
  mfd: intel_msic: Use DEFINE_RES_IRQ() macro
  mfd: motorola-cpcap: Add audio-codec support
  mfd: mc13xxx-core: Fix PMIC shutdown when reading ADC values
  mfd: madera: Remove unused forward reference
  mfd: max77620: Convert to using %pOFn instead of device_node.name
  mfd: madera: Don't use regmap_read_poll_timeout to poll for BOOT_DONE
  ...
This commit is contained in:
Linus Torvalds 2018-10-25 06:19:15 -07:00
commit 3ea172c84d
72 changed files with 1044 additions and 732 deletions

View File

@ -1,6 +1,6 @@
* Atmel Universal Synchronous Asynchronous Receiver/Transmitter (USART) * Atmel Universal Synchronous Asynchronous Receiver/Transmitter (USART)
Required properties: Required properties for USART:
- compatible: Should be "atmel,<chip>-usart" or "atmel,<chip>-dbgu" - compatible: Should be "atmel,<chip>-usart" or "atmel,<chip>-dbgu"
The compatible <chip> indicated will be the first SoC to support an The compatible <chip> indicated will be the first SoC to support an
additional mode or an USART new feature. additional mode or an USART new feature.
@ -11,7 +11,13 @@ Required properties:
Required elements: "usart" Required elements: "usart"
- clocks: phandles to input clocks. - clocks: phandles to input clocks.
Optional properties: Required properties for USART in SPI mode:
- #size-cells : Must be <0>
- #address-cells : Must be <1>
- cs-gpios: chipselects (internal cs not supported)
- atmel,usart-mode : Must be <AT91_USART_MODE_SPI> (found in dt-bindings/mfd/at91-usart.h)
Optional properties in serial mode:
- atmel,use-dma-rx: use of PDC or DMA for receiving data - atmel,use-dma-rx: use of PDC or DMA for receiving data
- atmel,use-dma-tx: use of PDC or DMA for transmitting data - atmel,use-dma-tx: use of PDC or DMA for transmitting data
- {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD line respectively. - {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD line respectively.
@ -62,3 +68,18 @@ Example:
dma-names = "tx", "rx"; dma-names = "tx", "rx";
atmel,fifo-size = <32>; atmel,fifo-size = <32>;
}; };
- SPI mode:
#include <dt-bindings/mfd/at91-usart.h>
spi0: spi@f001c000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "atmel,at91rm9200-usart", "atmel,at91sam9260-usart";
atmel,usart-mode = <AT91_USART_MODE_SPI>;
reg = <0xf001c000 0x100>;
interrupts = <12 IRQ_TYPE_LEVEL_HIGH 5>;
clocks = <&usart0_clk>;
clock-names = "usart";
cs-gpios = <&pioB 3 0>;
};

View File

@ -7546,6 +7546,14 @@ F: drivers/platform/x86/intel_punit_ipc.c
F: arch/x86/include/asm/intel_pmc_ipc.h F: arch/x86/include/asm/intel_pmc_ipc.h
F: arch/x86/include/asm/intel_punit_ipc.h F: arch/x86/include/asm/intel_punit_ipc.h
INTEL MULTIFUNCTION PMIC DEVICE DRIVERS
R: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
S: Maintained
F: drivers/mfd/intel_msic.c
F: drivers/mfd/intel_soc_pmic*
F: include/linux/mfd/intel_msic.h
F: include/linux/mfd/intel_soc_pmic*
INTEL PRO/WIRELESS 2100, 2200BG, 2915ABG NETWORK CONNECTION SUPPORT INTEL PRO/WIRELESS 2100, 2200BG, 2915ABG NETWORK CONNECTION SUPPORT
M: Stanislav Yakovlev <stas.yakovlev@gmail.com> M: Stanislav Yakovlev <stas.yakovlev@gmail.com>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
@ -9589,6 +9597,7 @@ M: Richard Genoud <richard.genoud@gmail.com>
S: Maintained S: Maintained
F: drivers/tty/serial/atmel_serial.c F: drivers/tty/serial/atmel_serial.c
F: drivers/tty/serial/atmel_serial.h F: drivers/tty/serial/atmel_serial.h
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
MICROCHIP / ATMEL DMA DRIVER MICROCHIP / ATMEL DMA DRIVER
M: Ludovic Desroches <ludovic.desroches@microchip.com> M: Ludovic Desroches <ludovic.desroches@microchip.com>
@ -9620,6 +9629,21 @@ S: Supported
F: drivers/mtd/nand/raw/atmel/* F: drivers/mtd/nand/raw/atmel/*
F: Documentation/devicetree/bindings/mtd/atmel-nand.txt F: Documentation/devicetree/bindings/mtd/atmel-nand.txt
MICROCHIP AT91 USART MFD DRIVER
M: Radu Pirea <radu_nicolae.pirea@upb.ro>
L: linux-kernel@vger.kernel.org
S: Supported
F: drivers/mfd/at91-usart.c
F: include/dt-bindings/mfd/at91-usart.h
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
MICROCHIP AT91 USART SPI DRIVER
M: Radu Pirea <radu_nicolae.pirea@upb.ro>
L: linux-spi@vger.kernel.org
S: Supported
F: drivers/spi/spi-at91-usart.c
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
MICROCHIP KSZ SERIES ETHERNET SWITCH DRIVER MICROCHIP KSZ SERIES ETHERNET SWITCH DRIVER
M: Woojung Huh <Woojung.Huh@microchip.com> M: Woojung Huh <Woojung.Huh@microchip.com>
M: Microchip Linux Driver Support <UNGLinuxDriver@microchip.com> M: Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>

View File

@ -693,16 +693,12 @@ static int __maybe_unused tiadc_suspend(struct device *dev)
{ {
struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct tiadc_device *adc_dev = iio_priv(indio_dev); struct tiadc_device *adc_dev = iio_priv(indio_dev);
struct ti_tscadc_dev *tscadc_dev;
unsigned int idle; unsigned int idle;
tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev)); idle = tiadc_readl(adc_dev, REG_CTRL);
if (!device_may_wakeup(tscadc_dev->dev)) { idle &= ~(CNTRLREG_TSCSSENB);
idle = tiadc_readl(adc_dev, REG_CTRL); tiadc_writel(adc_dev, REG_CTRL, (idle |
idle &= ~(CNTRLREG_TSCSSENB); CNTRLREG_POWERDOWN));
tiadc_writel(adc_dev, REG_CTRL, (idle |
CNTRLREG_POWERDOWN));
}
return 0; return 0;
} }

View File

@ -27,6 +27,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/sort.h> #include <linux/sort.h>
#include <linux/pm_wakeirq.h>
#include <linux/mfd/ti_am335x_tscadc.h> #include <linux/mfd/ti_am335x_tscadc.h>
@ -46,6 +47,7 @@ static const int config_pins[] = {
struct titsc { struct titsc {
struct input_dev *input; struct input_dev *input;
struct ti_tscadc_dev *mfd_tscadc; struct ti_tscadc_dev *mfd_tscadc;
struct device *dev;
unsigned int irq; unsigned int irq;
unsigned int wires; unsigned int wires;
unsigned int x_plate_resistance; unsigned int x_plate_resistance;
@ -276,7 +278,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
if (status & IRQENB_HW_PEN) { if (status & IRQENB_HW_PEN) {
ts_dev->pen_down = true; ts_dev->pen_down = true;
irqclr |= IRQENB_HW_PEN; irqclr |= IRQENB_HW_PEN;
pm_stay_awake(ts_dev->mfd_tscadc->dev); pm_stay_awake(ts_dev->dev);
} }
if (status & IRQENB_PENUP) { if (status & IRQENB_PENUP) {
@ -286,7 +288,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
input_report_key(input_dev, BTN_TOUCH, 0); input_report_key(input_dev, BTN_TOUCH, 0);
input_report_abs(input_dev, ABS_PRESSURE, 0); input_report_abs(input_dev, ABS_PRESSURE, 0);
input_sync(input_dev); input_sync(input_dev);
pm_relax(ts_dev->mfd_tscadc->dev); pm_relax(ts_dev->dev);
} else { } else {
ts_dev->pen_down = true; ts_dev->pen_down = true;
} }
@ -422,6 +424,7 @@ static int titsc_probe(struct platform_device *pdev)
ts_dev->mfd_tscadc = tscadc_dev; ts_dev->mfd_tscadc = tscadc_dev;
ts_dev->input = input_dev; ts_dev->input = input_dev;
ts_dev->irq = tscadc_dev->irq; ts_dev->irq = tscadc_dev->irq;
ts_dev->dev = &pdev->dev;
err = titsc_parse_dt(pdev, ts_dev); err = titsc_parse_dt(pdev, ts_dev);
if (err) { if (err) {
@ -436,6 +439,11 @@ static int titsc_probe(struct platform_device *pdev)
goto err_free_mem; goto err_free_mem;
} }
device_init_wakeup(&pdev->dev, true);
err = dev_pm_set_wake_irq(&pdev->dev, ts_dev->irq);
if (err)
dev_err(&pdev->dev, "irq wake enable failed.\n");
titsc_writel(ts_dev, REG_IRQSTATUS, TSC_IRQENB_MASK); titsc_writel(ts_dev, REG_IRQSTATUS, TSC_IRQENB_MASK);
titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES); titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES);
titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS); titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS);
@ -467,6 +475,8 @@ static int titsc_probe(struct platform_device *pdev)
return 0; return 0;
err_free_irq: err_free_irq:
dev_pm_clear_wake_irq(&pdev->dev);
device_init_wakeup(&pdev->dev, false);
free_irq(ts_dev->irq, ts_dev); free_irq(ts_dev->irq, ts_dev);
err_free_mem: err_free_mem:
input_free_device(input_dev); input_free_device(input_dev);
@ -479,6 +489,8 @@ static int titsc_remove(struct platform_device *pdev)
struct titsc *ts_dev = platform_get_drvdata(pdev); struct titsc *ts_dev = platform_get_drvdata(pdev);
u32 steps; u32 steps;
dev_pm_clear_wake_irq(&pdev->dev);
device_init_wakeup(&pdev->dev, false);
free_irq(ts_dev->irq, ts_dev); free_irq(ts_dev->irq, ts_dev);
/* total steps followed by the enable mask */ /* total steps followed by the enable mask */
@ -499,7 +511,7 @@ static int __maybe_unused titsc_suspend(struct device *dev)
unsigned int idle; unsigned int idle;
tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev)); tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev->dev)) { if (device_may_wakeup(dev)) {
titsc_writel(ts_dev, REG_IRQSTATUS, TSC_IRQENB_MASK); titsc_writel(ts_dev, REG_IRQSTATUS, TSC_IRQENB_MASK);
idle = titsc_readl(ts_dev, REG_IRQENABLE); idle = titsc_readl(ts_dev, REG_IRQENABLE);
titsc_writel(ts_dev, REG_IRQENABLE, titsc_writel(ts_dev, REG_IRQENABLE,
@ -515,11 +527,11 @@ static int __maybe_unused titsc_resume(struct device *dev)
struct ti_tscadc_dev *tscadc_dev; struct ti_tscadc_dev *tscadc_dev;
tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev)); tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
if (device_may_wakeup(tscadc_dev->dev)) { if (device_may_wakeup(dev)) {
titsc_writel(ts_dev, REG_IRQWAKEUP, titsc_writel(ts_dev, REG_IRQWAKEUP,
0x00); 0x00);
titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN); titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
pm_relax(ts_dev->mfd_tscadc->dev); pm_relax(dev);
} }
titsc_step_config(ts_dev); titsc_step_config(ts_dev);
titsc_writel(ts_dev, REG_FIFO0THR, titsc_writel(ts_dev, REG_FIFO0THR,

View File

@ -99,6 +99,15 @@ config MFD_AAT2870_CORE
additional drivers must be enabled in order to use the additional drivers must be enabled in order to use the
functionality of the device. functionality of the device.
config MFD_AT91_USART
tristate "AT91 USART Driver"
select MFD_CORE
help
Select this to get support for AT91 USART IP. This is a wrapper
over at91-usart-serial driver and usart-spi-driver. Only one function
can be used at a time. The choice is done at boot time by the probe
function of this MFD driver according to a device tree property.
config MFD_ATMEL_FLEXCOM config MFD_ATMEL_FLEXCOM
tristate "Atmel Flexcom (Flexible Serial Communication Unit)" tristate "Atmel Flexcom (Flexible Serial Communication Unit)"
select MFD_CORE select MFD_CORE
@ -1023,16 +1032,23 @@ config MFD_RN5T618
functionality of the device. functionality of the device.
config MFD_SEC_CORE config MFD_SEC_CORE
bool "SAMSUNG Electronics PMIC Series Support" tristate "SAMSUNG Electronics PMIC Series Support"
depends on I2C=y depends on I2C=y
select MFD_CORE select MFD_CORE
select REGMAP_I2C select REGMAP_I2C
select REGMAP_IRQ select REGMAP_IRQ
help help
Support for the Samsung Electronics MFD series. Support for the Samsung Electronics PMIC devices coming
This driver provides common support for accessing the device, usually along with Samsung Exynos SoC chipset.
additional drivers must be enabled in order to use the functionality This driver provides common support for accessing the device,
of the device additional drivers must be enabled in order to use the functionality
of the device
To compile this driver as a module, choose M here: the
module will be called sec-core.
Have in mind that important core drivers (like regulators) depend
on this driver so building this as a module might require proper
initial ramdisk or might not boot up as well in certain scenarios.
config MFD_SI476X_CORE config MFD_SI476X_CORE
tristate "Silicon Laboratories 4761/64/68 AM/FM radio." tristate "Silicon Laboratories 4761/64/68 AM/FM radio."

View File

@ -196,6 +196,7 @@ obj-$(CONFIG_MFD_SPMI_PMIC) += qcom-spmi-pmic.o
obj-$(CONFIG_TPS65911_COMPARATOR) += tps65911-comparator.o obj-$(CONFIG_TPS65911_COMPARATOR) += tps65911-comparator.o
obj-$(CONFIG_MFD_TPS65090) += tps65090.o obj-$(CONFIG_MFD_TPS65090) += tps65090.o
obj-$(CONFIG_MFD_AAT2870_CORE) += aat2870-core.o obj-$(CONFIG_MFD_AAT2870_CORE) += aat2870-core.o
obj-$(CONFIG_MFD_AT91_USART) += at91-usart.o
obj-$(CONFIG_MFD_ATMEL_FLEXCOM) += atmel-flexcom.o obj-$(CONFIG_MFD_ATMEL_FLEXCOM) += atmel-flexcom.o
obj-$(CONFIG_MFD_ATMEL_HLCDC) += atmel-hlcdc.o obj-$(CONFIG_MFD_ATMEL_HLCDC) += atmel-hlcdc.o
obj-$(CONFIG_MFD_ATMEL_SMC) += atmel-smc.o obj-$(CONFIG_MFD_ATMEL_SMC) += atmel-smc.o

View File

@ -360,6 +360,6 @@ static struct i2c_driver adp5520_driver = {
module_i2c_driver(adp5520_driver); module_i2c_driver(adp5520_driver);
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
MODULE_DESCRIPTION("ADP5520(01) PMIC-MFD Driver"); MODULE_DESCRIPTION("ADP5520(01) PMIC-MFD Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -52,8 +52,10 @@ int arizona_clk32k_enable(struct arizona *arizona)
if (ret != 0) if (ret != 0)
goto err_ref; goto err_ref;
ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]); ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]);
if (ret != 0) if (ret != 0) {
goto err_pm; pm_runtime_put_sync(arizona->dev);
goto err_ref;
}
break; break;
case ARIZONA_32KZ_MCLK2: case ARIZONA_32KZ_MCLK2:
ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]); ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]);
@ -67,8 +69,6 @@ int arizona_clk32k_enable(struct arizona *arizona)
ARIZONA_CLK_32K_ENA); ARIZONA_CLK_32K_ENA);
} }
err_pm:
pm_runtime_put_sync(arizona->dev);
err_ref: err_ref:
if (ret != 0) if (ret != 0)
arizona->clk32k_ref--; arizona->clk32k_ref--;
@ -990,7 +990,7 @@ static const struct mfd_cell wm8998_devs[] = {
int arizona_dev_init(struct arizona *arizona) int arizona_dev_init(struct arizona *arizona)
{ {
const char * const mclk_name[] = { "mclk1", "mclk2" }; static const char * const mclk_name[] = { "mclk1", "mclk2" };
struct device *dev = arizona->dev; struct device *dev = arizona->dev;
const char *type_name = NULL; const char *type_name = NULL;
unsigned int reg, val; unsigned int reg, val;

72
drivers/mfd/at91-usart.c Normal file
View File

@ -0,0 +1,72 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Driver for AT91 USART
*
* Copyright (C) 2018 Microchip Technology
*
* Author: Radu Pirea <radu.pirea@microchip.com>
*
*/
#include <dt-bindings/mfd/at91-usart.h>
#include <linux/module.h>
#include <linux/mfd/core.h>
#include <linux/of.h>
#include <linux/property.h>
static struct mfd_cell at91_usart_spi_subdev = {
.name = "at91_usart_spi",
.of_compatible = "microchip,at91sam9g45-usart-spi",
};
static struct mfd_cell at91_usart_serial_subdev = {
.name = "atmel_usart_serial",
.of_compatible = "atmel,at91rm9200-usart-serial",
};
static int at91_usart_mode_probe(struct platform_device *pdev)
{
struct mfd_cell cell;
u32 opmode = AT91_USART_MODE_SERIAL;
device_property_read_u32(&pdev->dev, "atmel,usart-mode", &opmode);
switch (opmode) {
case AT91_USART_MODE_SPI:
cell = at91_usart_spi_subdev;
break;
case AT91_USART_MODE_SERIAL:
cell = at91_usart_serial_subdev;
break;
default:
dev_err(&pdev->dev, "atmel,usart-mode has an invalid value %u\n",
opmode);
return -EINVAL;
}
return devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO, &cell, 1,
NULL, 0, NULL);
}
static const struct of_device_id at91_usart_mode_of_match[] = {
{ .compatible = "atmel,at91rm9200-usart" },
{ .compatible = "atmel,at91sam9260-usart" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, at91_usart_mode_of_match);
static struct platform_driver at91_usart_mfd = {
.probe = at91_usart_mode_probe,
.driver = {
.name = "at91_usart_mode",
.of_match_table = at91_usart_mode_of_match,
},
};
module_platform_driver(at91_usart_mfd);
MODULE_AUTHOR("Radu Pirea <radu.pirea@microchip.com>");
MODULE_DESCRIPTION("AT91 USART MFD driver");
MODULE_LICENSE("GPL v2");

View File

@ -218,7 +218,8 @@ EXPORT_SYMBOL(cros_ec_suspend);
static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev) static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev)
{ {
while (cros_ec_get_next_event(ec_dev, NULL) > 0) while (ec_dev->mkbp_event_supported &&
cros_ec_get_next_event(ec_dev, NULL) > 0)
blocking_notifier_call_chain(&ec_dev->event_notifier, blocking_notifier_call_chain(&ec_dev->event_notifier,
1, ec_dev); 1, ec_dev);
} }

View File

@ -546,6 +546,7 @@ static struct platform_driver cros_ec_dev_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.pm = &cros_ec_dev_pm_ops, .pm = &cros_ec_dev_pm_ops,
}, },
.id_table = cros_ec_id,
.probe = ec_device_probe, .probe = ec_device_probe,
.remove = ec_device_remove, .remove = ec_device_remove,
.shutdown = ec_device_shutdown, .shutdown = ec_device_shutdown,

View File

@ -1,12 +1,9 @@
// SPDX-License-Identifier: GPL-2.0
/* /*
* Driver for Intel MSIC * Driver for Intel MSIC
* *
* Copyright (C) 2011, Intel Corporation * Copyright (C) 2011, Intel Corporation
* Author: Mika Westerberg <mika.westerberg@linux.intel.com> * Author: Mika Westerberg <mika.westerberg@linux.intel.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.
*/ */
#include <linux/err.h> #include <linux/err.h>
@ -54,68 +51,44 @@ struct intel_msic {
}; };
static struct resource msic_touch_resources[] = { static struct resource msic_touch_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_adc_resources[] = { static struct resource msic_adc_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_battery_resources[] = { static struct resource msic_battery_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_gpio_resources[] = { static struct resource msic_gpio_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_audio_resources[] = { static struct resource msic_audio_resources[] = {
{ DEFINE_RES_IRQ_NAMED(0, "IRQ"),
.name = "IRQ",
.flags = IORESOURCE_IRQ,
},
/* /*
* We will pass IRQ_BASE to the driver now but this can be removed * We will pass IRQ_BASE to the driver now but this can be removed
* when/if the driver starts to use intel_msic_irq_read(). * when/if the driver starts to use intel_msic_irq_read().
*/ */
{ DEFINE_RES_MEM_NAMED(MSIC_IRQ_STATUS_ACCDET, 1, "IRQ_BASE"),
.name = "IRQ_BASE",
.flags = IORESOURCE_MEM,
.start = MSIC_IRQ_STATUS_ACCDET,
.end = MSIC_IRQ_STATUS_ACCDET,
},
}; };
static struct resource msic_hdmi_resources[] = { static struct resource msic_hdmi_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_thermal_resources[] = { static struct resource msic_thermal_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_power_btn_resources[] = { static struct resource msic_power_btn_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource msic_ocd_resources[] = { static struct resource msic_ocd_resources[] = {
{ DEFINE_RES_IRQ(0),
.flags = IORESOURCE_IRQ,
},
}; };
/* /*

View File

@ -1,27 +1,20 @@
// SPDX-License-Identifier: GPL-2.0
/* /*
* MFD core driver for Intel Broxton Whiskey Cove PMIC * MFD core driver for Intel Broxton Whiskey Cove PMIC
* *
* Copyright (C) 2015 Intel Corporation. All rights reserved. * Copyright (C) 2015 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope 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.
*/ */
#include <linux/module.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/err.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/err.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/mfd/intel_soc_pmic.h> #include <linux/mfd/intel_soc_pmic.h>
#include <linux/mfd/intel_soc_pmic_bxtwc.h> #include <linux/mfd/intel_soc_pmic_bxtwc.h>
#include <linux/module.h>
#include <asm/intel_pmc_ipc.h> #include <asm/intel_pmc_ipc.h>
/* PMIC device registers */ /* PMIC device registers */
@ -31,8 +24,8 @@
/* Interrupt Status Registers */ /* Interrupt Status Registers */
#define BXTWC_IRQLVL1 0x4E02 #define BXTWC_IRQLVL1 0x4E02
#define BXTWC_PWRBTNIRQ 0x4E03
#define BXTWC_PWRBTNIRQ 0x4E03
#define BXTWC_THRM0IRQ 0x4E04 #define BXTWC_THRM0IRQ 0x4E04
#define BXTWC_THRM1IRQ 0x4E05 #define BXTWC_THRM1IRQ 0x4E05
#define BXTWC_THRM2IRQ 0x4E06 #define BXTWC_THRM2IRQ 0x4E06
@ -47,10 +40,9 @@
/* Interrupt MASK Registers */ /* Interrupt MASK Registers */
#define BXTWC_MIRQLVL1 0x4E0E #define BXTWC_MIRQLVL1 0x4E0E
#define BXTWC_MPWRTNIRQ 0x4E0F
#define BXTWC_MIRQLVL1_MCHGR BIT(5) #define BXTWC_MIRQLVL1_MCHGR BIT(5)
#define BXTWC_MPWRBTNIRQ 0x4E0F
#define BXTWC_MTHRM0IRQ 0x4E12 #define BXTWC_MTHRM0IRQ 0x4E12
#define BXTWC_MTHRM1IRQ 0x4E13 #define BXTWC_MTHRM1IRQ 0x4E13
#define BXTWC_MTHRM2IRQ 0x4E14 #define BXTWC_MTHRM2IRQ 0x4E14
@ -66,9 +58,7 @@
/* Whiskey Cove PMIC share same ACPI ID between different platforms */ /* Whiskey Cove PMIC share same ACPI ID between different platforms */
#define BROXTON_PMIC_WC_HRV 4 #define BROXTON_PMIC_WC_HRV 4
/* Manage in two IRQ chips since mask registers are not consecutive */
enum bxtwc_irqs { enum bxtwc_irqs {
/* Level 1 */
BXTWC_PWRBTN_LVL1_IRQ = 0, BXTWC_PWRBTN_LVL1_IRQ = 0,
BXTWC_TMU_LVL1_IRQ, BXTWC_TMU_LVL1_IRQ,
BXTWC_THRM_LVL1_IRQ, BXTWC_THRM_LVL1_IRQ,
@ -77,9 +67,11 @@ enum bxtwc_irqs {
BXTWC_CHGR_LVL1_IRQ, BXTWC_CHGR_LVL1_IRQ,
BXTWC_GPIO_LVL1_IRQ, BXTWC_GPIO_LVL1_IRQ,
BXTWC_CRIT_LVL1_IRQ, BXTWC_CRIT_LVL1_IRQ,
};
/* Level 2 */ enum bxtwc_irqs_pwrbtn {
BXTWC_PWRBTN_IRQ, BXTWC_PWRBTN_IRQ = 0,
BXTWC_UIBTN_IRQ,
}; };
enum bxtwc_irqs_bcu { enum bxtwc_irqs_bcu {
@ -113,7 +105,10 @@ static const struct regmap_irq bxtwc_regmap_irqs[] = {
REGMAP_IRQ_REG(BXTWC_CHGR_LVL1_IRQ, 0, BIT(5)), REGMAP_IRQ_REG(BXTWC_CHGR_LVL1_IRQ, 0, BIT(5)),
REGMAP_IRQ_REG(BXTWC_GPIO_LVL1_IRQ, 0, BIT(6)), REGMAP_IRQ_REG(BXTWC_GPIO_LVL1_IRQ, 0, BIT(6)),
REGMAP_IRQ_REG(BXTWC_CRIT_LVL1_IRQ, 0, BIT(7)), REGMAP_IRQ_REG(BXTWC_CRIT_LVL1_IRQ, 0, BIT(7)),
REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 1, 0x03), };
static const struct regmap_irq bxtwc_regmap_irqs_pwrbtn[] = {
REGMAP_IRQ_REG(BXTWC_PWRBTN_IRQ, 0, 0x01),
}; };
static const struct regmap_irq bxtwc_regmap_irqs_bcu[] = { static const struct regmap_irq bxtwc_regmap_irqs_bcu[] = {
@ -125,7 +120,7 @@ static const struct regmap_irq bxtwc_regmap_irqs_adc[] = {
}; };
static const struct regmap_irq bxtwc_regmap_irqs_chgr[] = { static const struct regmap_irq bxtwc_regmap_irqs_chgr[] = {
REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, BIT(5)), REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 0, 0x20),
REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 0, 0x1f), REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 0, 0x1f),
REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 1, 0x1f), REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 1, 0x1f),
}; };
@ -144,7 +139,16 @@ static struct regmap_irq_chip bxtwc_regmap_irq_chip = {
.mask_base = BXTWC_MIRQLVL1, .mask_base = BXTWC_MIRQLVL1,
.irqs = bxtwc_regmap_irqs, .irqs = bxtwc_regmap_irqs,
.num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs), .num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs),
.num_regs = 2, .num_regs = 1,
};
static struct regmap_irq_chip bxtwc_regmap_irq_chip_pwrbtn = {
.name = "bxtwc_irq_chip_pwrbtn",
.status_base = BXTWC_PWRBTNIRQ,
.mask_base = BXTWC_MPWRBTNIRQ,
.irqs = bxtwc_regmap_irqs_pwrbtn,
.num_irqs = ARRAY_SIZE(bxtwc_regmap_irqs_pwrbtn),
.num_regs = 1,
}; };
static struct regmap_irq_chip bxtwc_regmap_irq_chip_tmu = { static struct regmap_irq_chip bxtwc_regmap_irq_chip_tmu = {
@ -472,6 +476,16 @@ static int bxtwc_probe(struct platform_device *pdev)
return ret; return ret;
} }
ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
BXTWC_PWRBTN_LVL1_IRQ,
IRQF_ONESHOT,
&bxtwc_regmap_irq_chip_pwrbtn,
&pmic->irq_chip_data_pwrbtn);
if (ret) {
dev_err(&pdev->dev, "Failed to add PWRBTN IRQ chip\n");
return ret;
}
ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
BXTWC_TMU_LVL1_IRQ, BXTWC_TMU_LVL1_IRQ,
IRQF_ONESHOT, IRQF_ONESHOT,

View File

@ -1,3 +1,4 @@
// SPDX-License-Identifier: GPL-2.0
/* /*
* Device access for Dollar Cove TI PMIC * Device access for Dollar Cove TI PMIC
* *
@ -6,10 +7,6 @@
* *
* Cleanup and forward-ported * Cleanup and forward-ported
* Copyright (c) 2017 Takashi Iwai <tiwai@suse.de> * Copyright (c) 2017 Takashi Iwai <tiwai@suse.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.
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>

View File

@ -1,3 +1,4 @@
// SPDX-License-Identifier: GPL-2.0
/* /*
* MFD core driver for Intel Cherrytrail Whiskey Cove PMIC * MFD core driver for Intel Cherrytrail Whiskey Cove PMIC
* *
@ -5,10 +6,6 @@
* *
* Based on various non upstream patches to support the CHT Whiskey Cove PMIC: * Based on various non upstream patches to support the CHT Whiskey Cove PMIC:
* Copyright (C) 2013-2015 Intel Corporation. All rights reserved. * Copyright (C) 2013-2015 Intel Corporation. All rights reserved.
*
* 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.
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>

View File

@ -1,31 +1,24 @@
// SPDX-License-Identifier: GPL-2.0
/* /*
* intel_soc_pmic_core.c - Intel SoC PMIC MFD Driver * Intel SoC PMIC MFD Driver
* *
* Copyright (C) 2013, 2014 Intel Corporation. All rights reserved. * Copyright (C) 2013, 2014 Intel Corporation. All rights reserved.
* *
* 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 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.
*
* Author: Yang, Bin <bin.yang@intel.com> * Author: Yang, Bin <bin.yang@intel.com>
* Author: Zhu, Lejun <lejun.zhu@linux.intel.com> * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
*/ */
#include <linux/module.h> #include <linux/acpi.h>
#include <linux/mfd/core.h> #include <linux/gpio/consumer.h>
#include <linux/gpio/machine.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/gpio/consumer.h> #include <linux/module.h>
#include <linux/acpi.h> #include <linux/mfd/core.h>
#include <linux/regmap.h>
#include <linux/mfd/intel_soc_pmic.h> #include <linux/mfd/intel_soc_pmic.h>
#include <linux/gpio/machine.h>
#include <linux/pwm.h> #include <linux/pwm.h>
#include <linux/regmap.h>
#include "intel_soc_pmic_core.h" #include "intel_soc_pmic_core.h"
/* Crystal Cove PMIC shares same ACPI ID between different platforms */ /* Crystal Cove PMIC shares same ACPI ID between different platforms */

View File

@ -1,17 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* /*
* intel_soc_pmic_core.h - Intel SoC PMIC MFD Driver * Intel SoC PMIC MFD Driver
* *
* Copyright (C) 2012-2014 Intel Corporation. All rights reserved. * Copyright (C) 2012-2014 Intel Corporation. All rights reserved.
* *
* 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 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.
*
* Author: Yang, Bin <bin.yang@intel.com> * Author: Yang, Bin <bin.yang@intel.com>
* Author: Zhu, Lejun <lejun.zhu@linux.intel.com> * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
*/ */

View File

@ -1,25 +1,18 @@
// SPDX-License-Identifier: GPL-2.0
/* /*
* intel_soc_pmic_crc.c - Device access for Crystal Cove PMIC * Device access for Crystal Cove PMIC
* *
* Copyright (C) 2013, 2014 Intel Corporation. All rights reserved. * Copyright (C) 2013, 2014 Intel Corporation. All rights reserved.
* *
* 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 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.
*
* Author: Yang, Bin <bin.yang@intel.com> * Author: Yang, Bin <bin.yang@intel.com>
* Author: Zhu, Lejun <lejun.zhu@linux.intel.com> * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
*/ */
#include <linux/mfd/core.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/mfd/core.h>
#include <linux/mfd/intel_soc_pmic.h> #include <linux/mfd/intel_soc_pmic.h>
#include "intel_soc_pmic_core.h" #include "intel_soc_pmic_core.h"
#define CRYSTAL_COVE_MAX_REGISTER 0xC6 #define CRYSTAL_COVE_MAX_REGISTER 0xC6
@ -36,48 +29,23 @@
#define CRYSTAL_COVE_IRQ_VHDMIOCP 6 #define CRYSTAL_COVE_IRQ_VHDMIOCP 6
static struct resource gpio_resources[] = { static struct resource gpio_resources[] = {
{ DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_GPIO, "GPIO"),
.name = "GPIO",
.start = CRYSTAL_COVE_IRQ_GPIO,
.end = CRYSTAL_COVE_IRQ_GPIO,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource pwrsrc_resources[] = { static struct resource pwrsrc_resources[] = {
{ DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_PWRSRC, "PWRSRC"),
.name = "PWRSRC",
.start = CRYSTAL_COVE_IRQ_PWRSRC,
.end = CRYSTAL_COVE_IRQ_PWRSRC,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource adc_resources[] = { static struct resource adc_resources[] = {
{ DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_ADC, "ADC"),
.name = "ADC",
.start = CRYSTAL_COVE_IRQ_ADC,
.end = CRYSTAL_COVE_IRQ_ADC,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource thermal_resources[] = { static struct resource thermal_resources[] = {
{ DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_THRM, "THERMAL"),
.name = "THERMAL",
.start = CRYSTAL_COVE_IRQ_THRM,
.end = CRYSTAL_COVE_IRQ_THRM,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource bcu_resources[] = { static struct resource bcu_resources[] = {
{ DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_BCU, "BCU"),
.name = "BCU",
.start = CRYSTAL_COVE_IRQ_BCU,
.end = CRYSTAL_COVE_IRQ_BCU,
.flags = IORESOURCE_IRQ,
},
}; };
static struct mfd_cell crystal_cove_byt_dev[] = { static struct mfd_cell crystal_cove_byt_dev[] = {
@ -134,27 +102,13 @@ static const struct regmap_config crystal_cove_regmap_config = {
}; };
static const struct regmap_irq crystal_cove_irqs[] = { static const struct regmap_irq crystal_cove_irqs[] = {
[CRYSTAL_COVE_IRQ_PWRSRC] = { REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_PWRSRC, 0, BIT(CRYSTAL_COVE_IRQ_PWRSRC)),
.mask = BIT(CRYSTAL_COVE_IRQ_PWRSRC), REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_THRM, 0, BIT(CRYSTAL_COVE_IRQ_THRM)),
}, REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_BCU, 0, BIT(CRYSTAL_COVE_IRQ_BCU)),
[CRYSTAL_COVE_IRQ_THRM] = { REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_ADC, 0, BIT(CRYSTAL_COVE_IRQ_ADC)),
.mask = BIT(CRYSTAL_COVE_IRQ_THRM), REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_CHGR, 0, BIT(CRYSTAL_COVE_IRQ_CHGR)),
}, REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_GPIO, 0, BIT(CRYSTAL_COVE_IRQ_GPIO)),
[CRYSTAL_COVE_IRQ_BCU] = { REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_VHDMIOCP, 0, BIT(CRYSTAL_COVE_IRQ_VHDMIOCP)),
.mask = BIT(CRYSTAL_COVE_IRQ_BCU),
},
[CRYSTAL_COVE_IRQ_ADC] = {
.mask = BIT(CRYSTAL_COVE_IRQ_ADC),
},
[CRYSTAL_COVE_IRQ_CHGR] = {
.mask = BIT(CRYSTAL_COVE_IRQ_CHGR),
},
[CRYSTAL_COVE_IRQ_GPIO] = {
.mask = BIT(CRYSTAL_COVE_IRQ_GPIO),
},
[CRYSTAL_COVE_IRQ_VHDMIOCP] = {
.mask = BIT(CRYSTAL_COVE_IRQ_VHDMIOCP),
},
}; };
static const struct regmap_irq_chip crystal_cove_irq_chip = { static const struct regmap_irq_chip crystal_cove_irq_chip = {

View File

@ -132,32 +132,39 @@ const char *madera_name_from_type(enum madera_type type)
} }
EXPORT_SYMBOL_GPL(madera_name_from_type); EXPORT_SYMBOL_GPL(madera_name_from_type);
#define MADERA_BOOT_POLL_MAX_INTERVAL_US 5000 #define MADERA_BOOT_POLL_INTERVAL_USEC 5000
#define MADERA_BOOT_POLL_TIMEOUT_US 25000 #define MADERA_BOOT_POLL_TIMEOUT_USEC 25000
static int madera_wait_for_boot(struct madera *madera) static int madera_wait_for_boot(struct madera *madera)
{ {
ktime_t timeout;
unsigned int val; unsigned int val;
int ret; int ret = 0;
/* /*
* We can't use an interrupt as we need to runtime resume to do so, * We can't use an interrupt as we need to runtime resume to do so,
* so we poll the status bit. This won't race with the interrupt * so we poll the status bit. This won't race with the interrupt
* handler because it will be blocked on runtime resume. * handler because it will be blocked on runtime resume.
* The chip could NAK a read request while it is booting so ignore
* errors from regmap_read.
*/ */
ret = regmap_read_poll_timeout(madera->regmap, timeout = ktime_add_us(ktime_get(), MADERA_BOOT_POLL_TIMEOUT_USEC);
MADERA_IRQ1_RAW_STATUS_1, regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
val, while (!(val & MADERA_BOOT_DONE_STS1) &&
(val & MADERA_BOOT_DONE_STS1), !ktime_after(ktime_get(), timeout)) {
MADERA_BOOT_POLL_MAX_INTERVAL_US, usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2,
MADERA_BOOT_POLL_TIMEOUT_US); MADERA_BOOT_POLL_INTERVAL_USEC);
regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
};
if (ret) if (!(val & MADERA_BOOT_DONE_STS1)) {
dev_err(madera->dev, "Polling BOOT_DONE_STS failed: %d\n", ret); dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n");
ret = -ETIMEDOUT;
}
/* /*
* BOOT_DONE defaults to unmasked on boot so we must ack it. * BOOT_DONE defaults to unmasked on boot so we must ack it.
* Do this unconditionally to avoid interrupt storms. * Do this even after a timeout to avoid interrupt storms.
*/ */
regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1, regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1,
MADERA_BOOT_DONE_EINT1); MADERA_BOOT_DONE_EINT1);

View File

@ -1,22 +1,12 @@
/* // SPDX-License-Identifier: GPL-2.0+
* max14577.c - mfd core driver for the Maxim 14577/77836 //
* // max14577.c - mfd core driver for the Maxim 14577/77836
* Copyright (C) 2014 Samsung Electronics //
* Chanwoo Choi <cw00.choi@samsung.com> // Copyright (C) 2014 Samsung Electronics
* Krzysztof Kozlowski <krzk@kernel.org> // Chanwoo Choi <cw00.choi@samsung.com>
* // Krzysztof Kozlowski <krzk@kernel.org>
* 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 // This driver is based on max8997.c
* 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.
*
* This driver is based on max8997.c
*/
#include <linux/err.h> #include <linux/err.h>
#include <linux/module.h> #include <linux/module.h>

View File

@ -285,7 +285,7 @@ static int max77620_config_fps(struct max77620_chip *chip,
} }
if (fps_id == MAX77620_FPS_COUNT) { if (fps_id == MAX77620_FPS_COUNT) {
dev_err(dev, "FPS node name %s is not valid\n", fps_np->name); dev_err(dev, "FPS node name %pOFn is not valid\n", fps_np);
return -EINVAL; return -EINVAL;
} }

View File

@ -1,26 +1,12 @@
/* // SPDX-License-Identifier: GPL-2.0+
* max77686.c - mfd core driver for the Maxim 77686/802 //
* // max77686.c - mfd core driver for the Maxim 77686/802
* Copyright (C) 2012 Samsung Electronics //
* Chiwoong Byun <woong.byun@samsung.com> // Copyright (C) 2012 Samsung Electronics
* Jonghwa Lee <jonghwa3.lee@samsung.com> // Chiwoong Byun <woong.byun@samsung.com>
* // Jonghwa Lee <jonghwa3.lee@samsung.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 //This driver is based on max8997.c
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8997.c
*/
#include <linux/export.h> #include <linux/export.h>
#include <linux/slab.h> #include <linux/slab.h>

View File

@ -1,27 +1,13 @@
/* // SPDX-License-Identifier: GPL-2.0+
* max77693.c - mfd core driver for the MAX 77693 //
* // max77693.c - mfd core driver for the MAX 77693
* Copyright (C) 2012 Samsung Electronics //
* SangYoung Son <hello.son@samsung.com> // Copyright (C) 2012 Samsung Electronics
* // SangYoung Son <hello.son@samsung.com>
* This program is not provided / owned by Maxim Integrated Products. //
* // This program is not provided / owned by Maxim Integrated Products.
* 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 // This driver is based on max8997.c
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8997.c
*/
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>

View File

@ -1,15 +1,10 @@
/* // SPDX-License-Identifier: GPL-2.0+
* MFD core driver for the Maxim MAX77843 //
* // MFD core driver for the Maxim MAX77843
* Copyright (C) 2015 Samsung Electronics //
* Author: Jaewon Kim <jaewon02.kim@samsung.com> // Copyright (C) 2015 Samsung Electronics
* Author: Beomho Seo <beomho.seo@samsung.com> // Author: Jaewon Kim <jaewon02.kim@samsung.com>
* // Author: Beomho Seo <beomho.seo@samsung.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/err.h> #include <linux/err.h>
#include <linux/i2c.h> #include <linux/i2c.h>

View File

@ -1,25 +1,11 @@
/* // SPDX-License-Identifier: GPL-2.0+
* max8997-irq.c - Interrupt controller support for MAX8997 //
* // max8997-irq.c - Interrupt controller support for MAX8997
* Copyright (C) 2011 Samsung Electronics Co.Ltd //
* MyungJoo Ham <myungjoo.ham@samsung.com> // Copyright (C) 2011 Samsung Electronics Co.Ltd
* // MyungJoo Ham <myungjoo.ham@samsung.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 // This driver is based on max8998-irq.c
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8998-irq.c
*/
#include <linux/err.h> #include <linux/err.h>
#include <linux/irq.h> #include <linux/irq.h>

View File

@ -1,25 +1,11 @@
/* // SPDX-License-Identifier: GPL-2.0+
* max8997.c - mfd core driver for the Maxim 8966 and 8997 //
* // max8997.c - mfd core driver for the Maxim 8966 and 8997
* Copyright (C) 2011 Samsung Electronics //
* MyungJoo Ham <myungjoo.ham@samsung.com> // Copyright (C) 2011 Samsung Electronics
* // MyungJoo Ham <myungjoo.ham@samsung.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 // This driver is based on max8998.c
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8998.c
*/
#include <linux/err.h> #include <linux/err.h>
#include <linux/slab.h> #include <linux/slab.h>
@ -153,12 +139,6 @@ static struct max8997_platform_data *max8997_i2c_parse_dt_pdata(
pd->ono = irq_of_parse_and_map(dev->of_node, 1); pd->ono = irq_of_parse_and_map(dev->of_node, 1);
/*
* ToDo: the 'wakeup' member in the platform data is more of a linux
* specfic information. Hence, there is no binding for that yet and
* not parsed here.
*/
return pd; return pd;
} }
@ -246,7 +226,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
*/ */
/* MAX8997 has a power button input. */ /* MAX8997 has a power button input. */
device_init_wakeup(max8997->dev, pdata->wakeup); device_init_wakeup(max8997->dev, true);
return ret; return ret;
@ -468,6 +448,7 @@ static int max8997_suspend(struct device *dev)
struct i2c_client *i2c = to_i2c_client(dev); struct i2c_client *i2c = to_i2c_client(dev);
struct max8997_dev *max8997 = i2c_get_clientdata(i2c); struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
disable_irq(max8997->irq);
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
irq_set_irq_wake(max8997->irq, 1); irq_set_irq_wake(max8997->irq, 1);
return 0; return 0;
@ -480,6 +461,7 @@ static int max8997_resume(struct device *dev)
if (device_may_wakeup(dev)) if (device_may_wakeup(dev))
irq_set_irq_wake(max8997->irq, 0); irq_set_irq_wake(max8997->irq, 0);
enable_irq(max8997->irq);
return max8997_irq_resume(max8997); return max8997_irq_resume(max8997);
} }

View File

@ -1,15 +1,9 @@
/* // SPDX-License-Identifier: GPL-2.0+
* Interrupt controller support for MAX8998 //
* // Interrupt controller support for MAX8998
* Copyright (C) 2010 Samsung Electronics Co.Ltd //
* Author: Joonyoung Shim <jy0922.shim@samsung.com> // Copyright (C) 2010 Samsung Electronics Co.Ltd
* // Author: Joonyoung Shim <jy0922.shim@samsung.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/device.h> #include <linux/device.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>

View File

@ -1,24 +1,10 @@
/* // SPDX-License-Identifier: GPL-2.0+
* max8998.c - mfd core driver for the Maxim 8998 //
* // max8998.c - mfd core driver for the Maxim 8998
* Copyright (C) 2009-2010 Samsung Electronics //
* Kyungmin Park <kyungmin.park@samsung.com> // Copyright (C) 2009-2010 Samsung Electronics
* Marek Szyprowski <m.szyprowski@samsung.com> // Kyungmin Park <kyungmin.park@samsung.com>
* // Marek Szyprowski <m.szyprowski@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/err.h> #include <linux/err.h>
#include <linux/init.h> #include <linux/init.h>

View File

@ -276,7 +276,8 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0); mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2; adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2 |
MC13XXX_ADC0_CHRGRAWDIV;
adc1 = MC13XXX_ADC1_ADEN | MC13XXX_ADC1_ADTRIGIGN | MC13XXX_ADC1_ASC; adc1 = MC13XXX_ADC1_ADEN | MC13XXX_ADC1_ADTRIGIGN | MC13XXX_ADC1_ASC;
/* /*

View File

@ -1094,6 +1094,7 @@ static void menelaus_rtc_alarm_work(struct menelaus_chip *m)
static inline void menelaus_rtc_init(struct menelaus_chip *m) static inline void menelaus_rtc_init(struct menelaus_chip *m)
{ {
int alarm = (m->client->irq > 0); int alarm = (m->client->irq > 0);
int err;
/* assume 32KDETEN pin is pulled high */ /* assume 32KDETEN pin is pulled high */
if (!(menelaus_read_reg(MENELAUS_OSC_CTRL) & 0x80)) { if (!(menelaus_read_reg(MENELAUS_OSC_CTRL) & 0x80)) {
@ -1101,6 +1102,12 @@ static inline void menelaus_rtc_init(struct menelaus_chip *m)
return; return;
} }
m->rtc = devm_rtc_allocate_device(&m->client->dev);
if (IS_ERR(m->rtc))
return;
m->rtc->ops = &menelaus_rtc_ops;
/* support RTC alarm; it can issue wakeups */ /* support RTC alarm; it can issue wakeups */
if (alarm) { if (alarm) {
if (menelaus_add_irq_work(MENELAUS_RTCALM_IRQ, if (menelaus_add_irq_work(MENELAUS_RTCALM_IRQ,
@ -1125,10 +1132,8 @@ static inline void menelaus_rtc_init(struct menelaus_chip *m)
menelaus_write_reg(MENELAUS_RTC_CTRL, m->rtc_control); menelaus_write_reg(MENELAUS_RTC_CTRL, m->rtc_control);
} }
m->rtc = rtc_device_register(DRIVER_NAME, err = rtc_register_device(m->rtc);
&m->client->dev, if (err) {
&menelaus_rtc_ops, THIS_MODULE);
if (IS_ERR(m->rtc)) {
if (alarm) { if (alarm) {
menelaus_remove_irq_work(MENELAUS_RTCALM_IRQ); menelaus_remove_irq_work(MENELAUS_RTCALM_IRQ);
device_init_wakeup(&m->client->dev, 0); device_init_wakeup(&m->client->dev, 0);

View File

@ -18,6 +18,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/mfd/core.h>
#include <linux/mfd/motorola-cpcap.h> #include <linux/mfd/motorola-cpcap.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
@ -216,6 +217,53 @@ static const struct regmap_config cpcap_regmap_config = {
.val_format_endian = REGMAP_ENDIAN_LITTLE, .val_format_endian = REGMAP_ENDIAN_LITTLE,
}; };
static const struct mfd_cell cpcap_mfd_devices[] = {
{
.name = "cpcap_adc",
.of_compatible = "motorola,mapphone-cpcap-adc",
}, {
.name = "cpcap_battery",
.of_compatible = "motorola,cpcap-battery",
}, {
.name = "cpcap-charger",
.of_compatible = "motorola,mapphone-cpcap-charger",
}, {
.name = "cpcap-regulator",
.of_compatible = "motorola,mapphone-cpcap-regulator",
}, {
.name = "cpcap-rtc",
.of_compatible = "motorola,cpcap-rtc",
}, {
.name = "cpcap-pwrbutton",
.of_compatible = "motorola,cpcap-pwrbutton",
}, {
.name = "cpcap-usb-phy",
.of_compatible = "motorola,mapphone-cpcap-usb-phy",
}, {
.name = "cpcap-led",
.id = 0,
.of_compatible = "motorola,cpcap-led-red",
}, {
.name = "cpcap-led",
.id = 1,
.of_compatible = "motorola,cpcap-led-green",
}, {
.name = "cpcap-led",
.id = 2,
.of_compatible = "motorola,cpcap-led-blue",
}, {
.name = "cpcap-led",
.id = 3,
.of_compatible = "motorola,cpcap-led-adl",
}, {
.name = "cpcap-led",
.id = 4,
.of_compatible = "motorola,cpcap-led-cp",
}, {
.name = "cpcap-codec",
}
};
static int cpcap_probe(struct spi_device *spi) static int cpcap_probe(struct spi_device *spi)
{ {
const struct of_device_id *match; const struct of_device_id *match;
@ -260,7 +308,8 @@ static int cpcap_probe(struct spi_device *spi)
if (ret) if (ret)
return ret; return ret;
return devm_of_platform_populate(&cpcap->spi->dev); return devm_mfd_add_devices(&spi->dev, 0, cpcap_mfd_devices,
ARRAY_SIZE(cpcap_mfd_devices), NULL, 0, NULL);
} }
static struct spi_driver cpcap_driver = { static struct spi_driver cpcap_driver = {

View File

@ -1,15 +1,7 @@
/* // SPDX-License-Identifier: GPL-2.0+
* sec-core.c //
* // Copyright (c) 2012 Samsung Electronics Co., Ltd
* Copyright (c) 2012 Samsung Electronics Co., Ltd // http://www.samsung.com
* http://www.samsung.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/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>

View File

@ -1,19 +1,12 @@
/* // SPDX-License-Identifier: GPL-2.0+
* sec-irq.c //
* // Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
* Copyright (c) 2011-2014 Samsung Electronics Co., Ltd // http://www.samsung.com
* http://www.samsung.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/device.h> #include <linux/device.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/module.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/mfd/samsung/core.h> #include <linux/mfd/samsung/core.h>
@ -501,3 +494,10 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(sec_irq_init);
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>");
MODULE_DESCRIPTION("Interrupt support for the S5M MFD");
MODULE_LICENSE("GPL");

View File

@ -12,7 +12,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
@ -21,28 +21,18 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/slab.h> #include <linux/slab.h>
struct ti_lmu_data { struct ti_lmu_data {
struct mfd_cell *cells; const struct mfd_cell *cells;
int num_cells; int num_cells;
unsigned int max_register; unsigned int max_register;
}; };
static int ti_lmu_enable_hw(struct ti_lmu *lmu, enum ti_lmu_id id) static int ti_lmu_enable_hw(struct ti_lmu *lmu, enum ti_lmu_id id)
{ {
int ret; if (lmu->en_gpio)
gpiod_set_value(lmu->en_gpio, 1);
if (gpio_is_valid(lmu->en_gpio)) {
ret = devm_gpio_request_one(lmu->dev, lmu->en_gpio,
GPIOF_OUT_INIT_HIGH, "lmu_hwen");
if (ret) {
dev_err(lmu->dev, "Can not request enable GPIO: %d\n",
ret);
return ret;
}
}
/* Delay about 1ms after HW enable pin control */ /* Delay about 1ms after HW enable pin control */
usleep_range(1000, 1500); usleep_range(1000, 1500);
@ -57,13 +47,14 @@ static int ti_lmu_enable_hw(struct ti_lmu *lmu, enum ti_lmu_id id)
return 0; return 0;
} }
static void ti_lmu_disable_hw(struct ti_lmu *lmu) static void ti_lmu_disable_hw(void *data)
{ {
if (gpio_is_valid(lmu->en_gpio)) struct ti_lmu *lmu = data;
gpio_set_value(lmu->en_gpio, 0); if (lmu->en_gpio)
gpiod_set_value(lmu->en_gpio, 0);
} }
static struct mfd_cell lm3532_devices[] = { static const struct mfd_cell lm3532_devices[] = {
{ {
.name = "ti-lmu-backlight", .name = "ti-lmu-backlight",
.id = LM3532, .id = LM3532,
@ -78,7 +69,7 @@ static struct mfd_cell lm3532_devices[] = {
.of_compatible = "ti,lm363x-regulator", \ .of_compatible = "ti,lm363x-regulator", \
} \ } \
static struct mfd_cell lm3631_devices[] = { static const struct mfd_cell lm3631_devices[] = {
LM363X_REGULATOR(LM3631_BOOST), LM363X_REGULATOR(LM3631_BOOST),
LM363X_REGULATOR(LM3631_LDO_CONT), LM363X_REGULATOR(LM3631_LDO_CONT),
LM363X_REGULATOR(LM3631_LDO_OREF), LM363X_REGULATOR(LM3631_LDO_OREF),
@ -91,7 +82,7 @@ static struct mfd_cell lm3631_devices[] = {
}, },
}; };
static struct mfd_cell lm3632_devices[] = { static const struct mfd_cell lm3632_devices[] = {
LM363X_REGULATOR(LM3632_BOOST), LM363X_REGULATOR(LM3632_BOOST),
LM363X_REGULATOR(LM3632_LDO_POS), LM363X_REGULATOR(LM3632_LDO_POS),
LM363X_REGULATOR(LM3632_LDO_NEG), LM363X_REGULATOR(LM3632_LDO_NEG),
@ -102,7 +93,7 @@ static struct mfd_cell lm3632_devices[] = {
}, },
}; };
static struct mfd_cell lm3633_devices[] = { static const struct mfd_cell lm3633_devices[] = {
{ {
.name = "ti-lmu-backlight", .name = "ti-lmu-backlight",
.id = LM3633, .id = LM3633,
@ -120,7 +111,7 @@ static struct mfd_cell lm3633_devices[] = {
}, },
}; };
static struct mfd_cell lm3695_devices[] = { static const struct mfd_cell lm3695_devices[] = {
{ {
.name = "ti-lmu-backlight", .name = "ti-lmu-backlight",
.id = LM3695, .id = LM3695,
@ -128,7 +119,7 @@ static struct mfd_cell lm3695_devices[] = {
}, },
}; };
static struct mfd_cell lm3697_devices[] = { static const struct mfd_cell lm3697_devices[] = {
{ {
.name = "ti-lmu-backlight", .name = "ti-lmu-backlight",
.id = LM3697, .id = LM3697,
@ -157,34 +148,21 @@ TI_LMU_DATA(lm3633, LM3633_MAX_REG);
TI_LMU_DATA(lm3695, LM3695_MAX_REG); TI_LMU_DATA(lm3695, LM3695_MAX_REG);
TI_LMU_DATA(lm3697, LM3697_MAX_REG); TI_LMU_DATA(lm3697, LM3697_MAX_REG);
static const struct of_device_id ti_lmu_of_match[] = {
{ .compatible = "ti,lm3532", .data = &lm3532_data },
{ .compatible = "ti,lm3631", .data = &lm3631_data },
{ .compatible = "ti,lm3632", .data = &lm3632_data },
{ .compatible = "ti,lm3633", .data = &lm3633_data },
{ .compatible = "ti,lm3695", .data = &lm3695_data },
{ .compatible = "ti,lm3697", .data = &lm3697_data },
{ }
};
MODULE_DEVICE_TABLE(of, ti_lmu_of_match);
static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id) static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id)
{ {
struct device *dev = &cl->dev; struct device *dev = &cl->dev;
const struct of_device_id *match;
const struct ti_lmu_data *data; const struct ti_lmu_data *data;
struct regmap_config regmap_cfg; struct regmap_config regmap_cfg;
struct ti_lmu *lmu; struct ti_lmu *lmu;
int ret; int ret;
match = of_match_device(ti_lmu_of_match, dev);
if (!match)
return -ENODEV;
/* /*
* Get device specific data from of_match table. * Get device specific data from of_match table.
* This data is defined by using TI_LMU_DATA() macro. * This data is defined by using TI_LMU_DATA() macro.
*/ */
data = (struct ti_lmu_data *)match->data; data = of_device_get_match_data(dev);
if (!data)
return -ENODEV;
lmu = devm_kzalloc(dev, sizeof(*lmu), GFP_KERNEL); lmu = devm_kzalloc(dev, sizeof(*lmu), GFP_KERNEL);
if (!lmu) if (!lmu)
@ -204,11 +182,21 @@ static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id)
return PTR_ERR(lmu->regmap); return PTR_ERR(lmu->regmap);
/* HW enable pin control and additional power up sequence if required */ /* HW enable pin control and additional power up sequence if required */
lmu->en_gpio = of_get_named_gpio(dev->of_node, "enable-gpios", 0); lmu->en_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_HIGH);
if (IS_ERR(lmu->en_gpio)) {
ret = PTR_ERR(lmu->en_gpio);
dev_err(dev, "Can not request enable GPIO: %d\n", ret);
return ret;
}
ret = ti_lmu_enable_hw(lmu, id->driver_data); ret = ti_lmu_enable_hw(lmu, id->driver_data);
if (ret) if (ret)
return ret; return ret;
ret = devm_add_action_or_reset(dev, ti_lmu_disable_hw, lmu);
if (ret)
return ret;
/* /*
* Fault circuit(open/short) can be detected by ti-lmu-fault-monitor. * Fault circuit(open/short) can be detected by ti-lmu-fault-monitor.
* After fault detection is done, some devices should re-initialize * After fault detection is done, some devices should re-initialize
@ -218,18 +206,20 @@ static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id)
i2c_set_clientdata(cl, lmu); i2c_set_clientdata(cl, lmu);
return mfd_add_devices(lmu->dev, 0, data->cells, return devm_mfd_add_devices(lmu->dev, 0, data->cells,
data->num_cells, NULL, 0, NULL); data->num_cells, NULL, 0, NULL);
} }
static int ti_lmu_remove(struct i2c_client *cl) static const struct of_device_id ti_lmu_of_match[] = {
{ { .compatible = "ti,lm3532", .data = &lm3532_data },
struct ti_lmu *lmu = i2c_get_clientdata(cl); { .compatible = "ti,lm3631", .data = &lm3631_data },
{ .compatible = "ti,lm3632", .data = &lm3632_data },
ti_lmu_disable_hw(lmu); { .compatible = "ti,lm3633", .data = &lm3633_data },
mfd_remove_devices(lmu->dev); { .compatible = "ti,lm3695", .data = &lm3695_data },
return 0; { .compatible = "ti,lm3697", .data = &lm3697_data },
} { }
};
MODULE_DEVICE_TABLE(of, ti_lmu_of_match);
static const struct i2c_device_id ti_lmu_ids[] = { static const struct i2c_device_id ti_lmu_ids[] = {
{ "lm3532", LM3532 }, { "lm3532", LM3532 },
@ -244,7 +234,6 @@ MODULE_DEVICE_TABLE(i2c, ti_lmu_ids);
static struct i2c_driver ti_lmu_driver = { static struct i2c_driver ti_lmu_driver = {
.probe = ti_lmu_probe, .probe = ti_lmu_probe,
.remove = ti_lmu_remove,
.driver = { .driver = {
.name = "ti-lmu", .name = "ti-lmu",
.of_match_table = ti_lmu_of_match, .of_match_table = ti_lmu_of_match,

View File

@ -269,7 +269,6 @@ static int ti_tscadc_probe(struct platform_device *pdev)
if (err < 0) if (err < 0)
goto err_disable_clk; goto err_disable_clk;
device_init_wakeup(&pdev->dev, true);
platform_set_drvdata(pdev, tscadc); platform_set_drvdata(pdev, tscadc);
return 0; return 0;
@ -294,11 +293,24 @@ static int ti_tscadc_remove(struct platform_device *pdev)
return 0; return 0;
} }
static int __maybe_unused ti_tscadc_can_wakeup(struct device *dev, void *data)
{
return device_may_wakeup(dev);
}
static int __maybe_unused tscadc_suspend(struct device *dev) static int __maybe_unused tscadc_suspend(struct device *dev)
{ {
struct ti_tscadc_dev *tscadc = dev_get_drvdata(dev); struct ti_tscadc_dev *tscadc = dev_get_drvdata(dev);
regmap_write(tscadc->regmap, REG_SE, 0x00); regmap_write(tscadc->regmap, REG_SE, 0x00);
if (device_for_each_child(dev, NULL, ti_tscadc_can_wakeup)) {
u32 ctrl;
regmap_read(tscadc->regmap, REG_CTRL, &ctrl);
ctrl &= ~(CNTRLREG_POWERDOWN);
ctrl |= CNTRLREG_TSCSSENB;
regmap_write(tscadc->regmap, REG_CTRL, ctrl);
}
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
return 0; return 0;

View File

@ -83,6 +83,14 @@ config SPI_ATMEL
This selects a driver for the Atmel SPI Controller, present on This selects a driver for the Atmel SPI Controller, present on
many AT91 ARM chips. many AT91 ARM chips.
config SPI_AT91_USART
tristate "Atmel USART Controller SPI driver"
depends on (ARCH_AT91 || COMPILE_TEST)
depends on MFD_AT91_USART
help
This selects a driver for the AT91 USART Controller as SPI Master,
present on AT91 and SAMA5 SoC series.
config SPI_AU1550 config SPI_AU1550
tristate "Au1550/Au1200/Au1300 SPI Controller" tristate "Au1550/Au1200/Au1300 SPI Controller"
depends on MIPS_ALCHEMY depends on MIPS_ALCHEMY

View File

@ -16,6 +16,7 @@ obj-$(CONFIG_SPI_LOOPBACK_TEST) += spi-loopback-test.o
obj-$(CONFIG_SPI_ALTERA) += spi-altera.o obj-$(CONFIG_SPI_ALTERA) += spi-altera.o
obj-$(CONFIG_SPI_ARMADA_3700) += spi-armada-3700.o obj-$(CONFIG_SPI_ARMADA_3700) += spi-armada-3700.o
obj-$(CONFIG_SPI_ATMEL) += spi-atmel.o obj-$(CONFIG_SPI_ATMEL) += spi-atmel.o
obj-$(CONFIG_SPI_AT91_USART) += spi-at91-usart.o
obj-$(CONFIG_SPI_ATH79) += spi-ath79.o obj-$(CONFIG_SPI_ATH79) += spi-ath79.o
obj-$(CONFIG_SPI_AU1550) += spi-au1550.o obj-$(CONFIG_SPI_AU1550) += spi-au1550.o
obj-$(CONFIG_SPI_AXI_SPI_ENGINE) += spi-axi-spi-engine.o obj-$(CONFIG_SPI_AXI_SPI_ENGINE) += spi-axi-spi-engine.o

View File

@ -0,0 +1,432 @@
// SPDX-License-Identifier: GPL-2.0
//
// Driver for AT91 USART Controllers as SPI
//
// Copyright (C) 2018 Microchip Technology Inc.
//
// Author: Radu Pirea <radu.pirea@microchip.com>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#define US_CR 0x00
#define US_MR 0x04
#define US_IER 0x08
#define US_IDR 0x0C
#define US_CSR 0x14
#define US_RHR 0x18
#define US_THR 0x1C
#define US_BRGR 0x20
#define US_VERSION 0xFC
#define US_CR_RSTRX BIT(2)
#define US_CR_RSTTX BIT(3)
#define US_CR_RXEN BIT(4)
#define US_CR_RXDIS BIT(5)
#define US_CR_TXEN BIT(6)
#define US_CR_TXDIS BIT(7)
#define US_MR_SPI_MASTER 0x0E
#define US_MR_CHRL GENMASK(7, 6)
#define US_MR_CPHA BIT(8)
#define US_MR_CPOL BIT(16)
#define US_MR_CLKO BIT(18)
#define US_MR_WRDBT BIT(20)
#define US_MR_LOOP BIT(15)
#define US_IR_RXRDY BIT(0)
#define US_IR_TXRDY BIT(1)
#define US_IR_OVRE BIT(5)
#define US_BRGR_SIZE BIT(16)
#define US_MIN_CLK_DIV 0x06
#define US_MAX_CLK_DIV BIT(16)
#define US_RESET (US_CR_RSTRX | US_CR_RSTTX)
#define US_DISABLE (US_CR_RXDIS | US_CR_TXDIS)
#define US_ENABLE (US_CR_RXEN | US_CR_TXEN)
#define US_OVRE_RXRDY_IRQS (US_IR_OVRE | US_IR_RXRDY)
#define US_INIT \
(US_MR_SPI_MASTER | US_MR_CHRL | US_MR_CLKO | US_MR_WRDBT)
/* Register access macros */
#define at91_usart_spi_readl(port, reg) \
readl_relaxed((port)->regs + US_##reg)
#define at91_usart_spi_writel(port, reg, value) \
writel_relaxed((value), (port)->regs + US_##reg)
#define at91_usart_spi_readb(port, reg) \
readb_relaxed((port)->regs + US_##reg)
#define at91_usart_spi_writeb(port, reg, value) \
writeb_relaxed((value), (port)->regs + US_##reg)
struct at91_usart_spi {
struct spi_transfer *current_transfer;
void __iomem *regs;
struct device *dev;
struct clk *clk;
/*used in interrupt to protect data reading*/
spinlock_t lock;
int irq;
unsigned int current_tx_remaining_bytes;
unsigned int current_rx_remaining_bytes;
u32 spi_clk;
u32 status;
bool xfer_failed;
};
static inline u32 at91_usart_spi_tx_ready(struct at91_usart_spi *aus)
{
return aus->status & US_IR_TXRDY;
}
static inline u32 at91_usart_spi_rx_ready(struct at91_usart_spi *aus)
{
return aus->status & US_IR_RXRDY;
}
static inline u32 at91_usart_spi_check_overrun(struct at91_usart_spi *aus)
{
return aus->status & US_IR_OVRE;
}
static inline u32 at91_usart_spi_read_status(struct at91_usart_spi *aus)
{
aus->status = at91_usart_spi_readl(aus, CSR);
return aus->status;
}
static inline void at91_usart_spi_tx(struct at91_usart_spi *aus)
{
unsigned int len = aus->current_transfer->len;
unsigned int remaining = aus->current_tx_remaining_bytes;
const u8 *tx_buf = aus->current_transfer->tx_buf;
if (!remaining)
return;
if (at91_usart_spi_tx_ready(aus)) {
at91_usart_spi_writeb(aus, THR, tx_buf[len - remaining]);
aus->current_tx_remaining_bytes--;
}
}
static inline void at91_usart_spi_rx(struct at91_usart_spi *aus)
{
int len = aus->current_transfer->len;
int remaining = aus->current_rx_remaining_bytes;
u8 *rx_buf = aus->current_transfer->rx_buf;
if (!remaining)
return;
rx_buf[len - remaining] = at91_usart_spi_readb(aus, RHR);
aus->current_rx_remaining_bytes--;
}
static inline void
at91_usart_spi_set_xfer_speed(struct at91_usart_spi *aus,
struct spi_transfer *xfer)
{
at91_usart_spi_writel(aus, BRGR,
DIV_ROUND_UP(aus->spi_clk, xfer->speed_hz));
}
static irqreturn_t at91_usart_spi_interrupt(int irq, void *dev_id)
{
struct spi_controller *controller = dev_id;
struct at91_usart_spi *aus = spi_master_get_devdata(controller);
spin_lock(&aus->lock);
at91_usart_spi_read_status(aus);
if (at91_usart_spi_check_overrun(aus)) {
aus->xfer_failed = true;
at91_usart_spi_writel(aus, IDR, US_IR_OVRE | US_IR_RXRDY);
spin_unlock(&aus->lock);
return IRQ_HANDLED;
}
if (at91_usart_spi_rx_ready(aus)) {
at91_usart_spi_rx(aus);
spin_unlock(&aus->lock);
return IRQ_HANDLED;
}
spin_unlock(&aus->lock);
return IRQ_NONE;
}
static int at91_usart_spi_setup(struct spi_device *spi)
{
struct at91_usart_spi *aus = spi_master_get_devdata(spi->controller);
u32 *ausd = spi->controller_state;
unsigned int mr = at91_usart_spi_readl(aus, MR);
u8 bits = spi->bits_per_word;
if (bits != 8) {
dev_dbg(&spi->dev, "Only 8 bits per word are supported\n");
return -EINVAL;
}
if (spi->mode & SPI_CPOL)
mr |= US_MR_CPOL;
else
mr &= ~US_MR_CPOL;
if (spi->mode & SPI_CPHA)
mr |= US_MR_CPHA;
else
mr &= ~US_MR_CPHA;
if (spi->mode & SPI_LOOP)
mr |= US_MR_LOOP;
else
mr &= ~US_MR_LOOP;
if (!ausd) {
ausd = kzalloc(sizeof(*ausd), GFP_KERNEL);
if (!ausd)
return -ENOMEM;
spi->controller_state = ausd;
}
*ausd = mr;
dev_dbg(&spi->dev,
"setup: bpw %u mode 0x%x -> mr %d %08x\n",
bits, spi->mode, spi->chip_select, mr);
return 0;
}
static int at91_usart_spi_transfer_one(struct spi_controller *ctlr,
struct spi_device *spi,
struct spi_transfer *xfer)
{
struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
at91_usart_spi_set_xfer_speed(aus, xfer);
aus->xfer_failed = false;
aus->current_transfer = xfer;
aus->current_tx_remaining_bytes = xfer->len;
aus->current_rx_remaining_bytes = xfer->len;
while ((aus->current_tx_remaining_bytes ||
aus->current_rx_remaining_bytes) && !aus->xfer_failed) {
at91_usart_spi_read_status(aus);
at91_usart_spi_tx(aus);
cpu_relax();
}
if (aus->xfer_failed) {
dev_err(aus->dev, "Overrun!\n");
return -EIO;
}
return 0;
}
static int at91_usart_spi_prepare_message(struct spi_controller *ctlr,
struct spi_message *message)
{
struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
struct spi_device *spi = message->spi;
u32 *ausd = spi->controller_state;
at91_usart_spi_writel(aus, CR, US_ENABLE);
at91_usart_spi_writel(aus, IER, US_OVRE_RXRDY_IRQS);
at91_usart_spi_writel(aus, MR, *ausd);
return 0;
}
static int at91_usart_spi_unprepare_message(struct spi_controller *ctlr,
struct spi_message *message)
{
struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
at91_usart_spi_writel(aus, CR, US_RESET | US_DISABLE);
at91_usart_spi_writel(aus, IDR, US_OVRE_RXRDY_IRQS);
return 0;
}
static void at91_usart_spi_cleanup(struct spi_device *spi)
{
struct at91_usart_spi_device *ausd = spi->controller_state;
spi->controller_state = NULL;
kfree(ausd);
}
static void at91_usart_spi_init(struct at91_usart_spi *aus)
{
at91_usart_spi_writel(aus, MR, US_INIT);
at91_usart_spi_writel(aus, CR, US_RESET | US_DISABLE);
}
static int at91_usart_gpio_setup(struct platform_device *pdev)
{
struct device_node *np = pdev->dev.parent->of_node;
int i;
int ret;
int nb;
if (!np)
return -EINVAL;
nb = of_gpio_named_count(np, "cs-gpios");
for (i = 0; i < nb; i++) {
int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
if (cs_gpio < 0)
return cs_gpio;
if (gpio_is_valid(cs_gpio)) {
ret = devm_gpio_request_one(&pdev->dev, cs_gpio,
GPIOF_DIR_OUT,
dev_name(&pdev->dev));
if (ret)
return ret;
}
}
return 0;
}
static int at91_usart_spi_probe(struct platform_device *pdev)
{
struct resource *regs;
struct spi_controller *controller;
struct at91_usart_spi *aus;
struct clk *clk;
int irq;
int ret;
regs = platform_get_resource(to_platform_device(pdev->dev.parent),
IORESOURCE_MEM, 0);
if (!regs)
return -EINVAL;
irq = platform_get_irq(to_platform_device(pdev->dev.parent), 0);
if (irq < 0)
return irq;
clk = devm_clk_get(pdev->dev.parent, "usart");
if (IS_ERR(clk))
return PTR_ERR(clk);
ret = -ENOMEM;
controller = spi_alloc_master(&pdev->dev, sizeof(*aus));
if (!controller)
goto at91_usart_spi_probe_fail;
ret = at91_usart_gpio_setup(pdev);
if (ret)
goto at91_usart_spi_probe_fail;
controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP | SPI_CS_HIGH;
controller->dev.of_node = pdev->dev.parent->of_node;
controller->bits_per_word_mask = SPI_BPW_MASK(8);
controller->setup = at91_usart_spi_setup;
controller->flags = SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX;
controller->transfer_one = at91_usart_spi_transfer_one;
controller->prepare_message = at91_usart_spi_prepare_message;
controller->unprepare_message = at91_usart_spi_unprepare_message;
controller->cleanup = at91_usart_spi_cleanup;
controller->max_speed_hz = DIV_ROUND_UP(clk_get_rate(clk),
US_MIN_CLK_DIV);
controller->min_speed_hz = DIV_ROUND_UP(clk_get_rate(clk),
US_MAX_CLK_DIV);
platform_set_drvdata(pdev, controller);
aus = spi_master_get_devdata(controller);
aus->dev = &pdev->dev;
aus->regs = devm_ioremap_resource(&pdev->dev, regs);
if (IS_ERR(aus->regs)) {
ret = PTR_ERR(aus->regs);
goto at91_usart_spi_probe_fail;
}
aus->irq = irq;
aus->clk = clk;
ret = devm_request_irq(&pdev->dev, irq, at91_usart_spi_interrupt, 0,
dev_name(&pdev->dev), controller);
if (ret)
goto at91_usart_spi_probe_fail;
ret = clk_prepare_enable(clk);
if (ret)
goto at91_usart_spi_probe_fail;
aus->spi_clk = clk_get_rate(clk);
at91_usart_spi_init(aus);
spin_lock_init(&aus->lock);
ret = devm_spi_register_master(&pdev->dev, controller);
if (ret)
goto at91_usart_fail_register_master;
dev_info(&pdev->dev,
"AT91 USART SPI Controller version 0x%x at %pa (irq %d)\n",
at91_usart_spi_readl(aus, VERSION),
&regs->start, irq);
return 0;
at91_usart_fail_register_master:
clk_disable_unprepare(clk);
at91_usart_spi_probe_fail:
spi_master_put(controller);
return ret;
}
static int at91_usart_spi_remove(struct platform_device *pdev)
{
struct spi_controller *ctlr = platform_get_drvdata(pdev);
struct at91_usart_spi *aus = spi_master_get_devdata(ctlr);
clk_disable_unprepare(aus->clk);
return 0;
}
static const struct of_device_id at91_usart_spi_dt_ids[] = {
{ .compatible = "microchip,at91sam9g45-usart-spi"},
{ /* sentinel */}
};
MODULE_DEVICE_TABLE(of, at91_usart_spi_dt_ids);
static struct platform_driver at91_usart_spi_driver = {
.driver = {
.name = "at91_usart_spi",
},
.probe = at91_usart_spi_probe,
.remove = at91_usart_spi_remove,
};
module_platform_driver(at91_usart_spi_driver);
MODULE_DESCRIPTION("Microchip AT91 USART SPI Controller driver");
MODULE_AUTHOR("Radu Pirea <radu.pirea@microchip.com>");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:at91_usart_spi");

View File

@ -118,6 +118,7 @@ config SERIAL_ATMEL
depends on ARCH_AT91 || COMPILE_TEST depends on ARCH_AT91 || COMPILE_TEST
select SERIAL_CORE select SERIAL_CORE
select SERIAL_MCTRL_GPIO if GPIOLIB select SERIAL_MCTRL_GPIO if GPIOLIB
select MFD_AT91_USART
help help
This enables the driver for the on-chip UARTs of the Atmel This enables the driver for the on-chip UARTs of the Atmel
AT91 processors. AT91 processors.

View File

@ -193,8 +193,7 @@ static struct console atmel_console;
#if defined(CONFIG_OF) #if defined(CONFIG_OF)
static const struct of_device_id atmel_serial_dt_ids[] = { static const struct of_device_id atmel_serial_dt_ids[] = {
{ .compatible = "atmel,at91rm9200-usart" }, { .compatible = "atmel,at91rm9200-usart-serial" },
{ .compatible = "atmel,at91sam9260-usart" },
{ /* sentinel */ } { /* sentinel */ }
}; };
#endif #endif
@ -915,6 +914,7 @@ static void atmel_tx_dma(struct uart_port *port)
static int atmel_prepare_tx_dma(struct uart_port *port) static int atmel_prepare_tx_dma(struct uart_port *port)
{ {
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
struct device *mfd_dev = port->dev->parent;
dma_cap_mask_t mask; dma_cap_mask_t mask;
struct dma_slave_config config; struct dma_slave_config config;
int ret, nent; int ret, nent;
@ -922,7 +922,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port)
dma_cap_zero(mask); dma_cap_zero(mask);
dma_cap_set(DMA_SLAVE, mask); dma_cap_set(DMA_SLAVE, mask);
atmel_port->chan_tx = dma_request_slave_channel(port->dev, "tx"); atmel_port->chan_tx = dma_request_slave_channel(mfd_dev, "tx");
if (atmel_port->chan_tx == NULL) if (atmel_port->chan_tx == NULL)
goto chan_err; goto chan_err;
dev_info(port->dev, "using %s for tx DMA transfers\n", dev_info(port->dev, "using %s for tx DMA transfers\n",
@ -1093,6 +1093,7 @@ static void atmel_rx_from_dma(struct uart_port *port)
static int atmel_prepare_rx_dma(struct uart_port *port) static int atmel_prepare_rx_dma(struct uart_port *port)
{ {
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
struct device *mfd_dev = port->dev->parent;
struct dma_async_tx_descriptor *desc; struct dma_async_tx_descriptor *desc;
dma_cap_mask_t mask; dma_cap_mask_t mask;
struct dma_slave_config config; struct dma_slave_config config;
@ -1104,7 +1105,7 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
dma_cap_zero(mask); dma_cap_zero(mask);
dma_cap_set(DMA_CYCLIC, mask); dma_cap_set(DMA_CYCLIC, mask);
atmel_port->chan_rx = dma_request_slave_channel(port->dev, "rx"); atmel_port->chan_rx = dma_request_slave_channel(mfd_dev, "rx");
if (atmel_port->chan_rx == NULL) if (atmel_port->chan_rx == NULL)
goto chan_err; goto chan_err;
dev_info(port->dev, "using %s for rx DMA transfers\n", dev_info(port->dev, "using %s for rx DMA transfers\n",
@ -2222,8 +2223,8 @@ static const char *atmel_type(struct uart_port *port)
*/ */
static void atmel_release_port(struct uart_port *port) static void atmel_release_port(struct uart_port *port)
{ {
struct platform_device *pdev = to_platform_device(port->dev); struct platform_device *mpdev = to_platform_device(port->dev->parent);
int size = pdev->resource[0].end - pdev->resource[0].start + 1; int size = resource_size(mpdev->resource);
release_mem_region(port->mapbase, size); release_mem_region(port->mapbase, size);
@ -2238,8 +2239,8 @@ static void atmel_release_port(struct uart_port *port)
*/ */
static int atmel_request_port(struct uart_port *port) static int atmel_request_port(struct uart_port *port)
{ {
struct platform_device *pdev = to_platform_device(port->dev); struct platform_device *mpdev = to_platform_device(port->dev->parent);
int size = pdev->resource[0].end - pdev->resource[0].start + 1; int size = resource_size(mpdev->resource);
if (!request_mem_region(port->mapbase, size, "atmel_serial")) if (!request_mem_region(port->mapbase, size, "atmel_serial"))
return -EBUSY; return -EBUSY;
@ -2341,27 +2342,28 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
{ {
int ret; int ret;
struct uart_port *port = &atmel_port->uart; struct uart_port *port = &atmel_port->uart;
struct platform_device *mpdev = to_platform_device(pdev->dev.parent);
atmel_init_property(atmel_port, pdev); atmel_init_property(atmel_port, pdev);
atmel_set_ops(port); atmel_set_ops(port);
uart_get_rs485_mode(&pdev->dev, &port->rs485); uart_get_rs485_mode(&mpdev->dev, &port->rs485);
port->iotype = UPIO_MEM; port->iotype = UPIO_MEM;
port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP; port->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
port->ops = &atmel_pops; port->ops = &atmel_pops;
port->fifosize = 1; port->fifosize = 1;
port->dev = &pdev->dev; port->dev = &pdev->dev;
port->mapbase = pdev->resource[0].start; port->mapbase = mpdev->resource[0].start;
port->irq = pdev->resource[1].start; port->irq = mpdev->resource[1].start;
port->rs485_config = atmel_config_rs485; port->rs485_config = atmel_config_rs485;
port->membase = NULL; port->membase = NULL;
memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring)); memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring));
/* for console, the clock could already be configured */ /* for console, the clock could already be configured */
if (!atmel_port->clk) { if (!atmel_port->clk) {
atmel_port->clk = clk_get(&pdev->dev, "usart"); atmel_port->clk = clk_get(&mpdev->dev, "usart");
if (IS_ERR(atmel_port->clk)) { if (IS_ERR(atmel_port->clk)) {
ret = PTR_ERR(atmel_port->clk); ret = PTR_ERR(atmel_port->clk);
atmel_port->clk = NULL; atmel_port->clk = NULL;
@ -2694,13 +2696,22 @@ static void atmel_serial_probe_fifos(struct atmel_uart_port *atmel_port,
static int atmel_serial_probe(struct platform_device *pdev) static int atmel_serial_probe(struct platform_device *pdev)
{ {
struct atmel_uart_port *atmel_port; struct atmel_uart_port *atmel_port;
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.parent->of_node;
void *data; void *data;
int ret = -ENODEV; int ret = -ENODEV;
bool rs485_enabled; bool rs485_enabled;
BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1)); BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1));
/*
* In device tree there is no node with "atmel,at91rm9200-usart-serial"
* as compatible string. This driver is probed by at91-usart mfd driver
* which is just a wrapper over the atmel_serial driver and
* spi-at91-usart driver. All attributes needed by this driver are
* found in of_node of parent.
*/
pdev->dev.of_node = np;
ret = of_alias_get_id(np, "serial"); ret = of_alias_get_id(np, "serial");
if (ret < 0) if (ret < 0)
/* port id not found in platform data nor device-tree aliases: /* port id not found in platform data nor device-tree aliases:
@ -2836,6 +2847,7 @@ static int atmel_serial_remove(struct platform_device *pdev)
clk_put(atmel_port->clk); clk_put(atmel_port->clk);
atmel_port->clk = NULL; atmel_port->clk = NULL;
pdev->dev.of_node = NULL;
return ret; return ret;
} }
@ -2846,7 +2858,7 @@ static struct platform_driver atmel_serial_driver = {
.suspend = atmel_serial_suspend, .suspend = atmel_serial_suspend,
.resume = atmel_serial_resume, .resume = atmel_serial_resume,
.driver = { .driver = {
.name = "atmel_usart", .name = "atmel_usart_serial",
.of_match_table = of_match_ptr(atmel_serial_dt_ids), .of_match_table = of_match_ptr(atmel_serial_dt_ids),
}, },
}; };

View File

@ -0,0 +1,17 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* This header provides macros for AT91 USART DT bindings.
*
* Copyright (C) 2018 Microchip Technology
*
* Author: Radu Pirea <radu.pirea@microchip.com>
*
*/
#ifndef __DT_BINDINGS_AT91_USART_H__
#define __DT_BINDINGS_AT91_USART_H__
#define AT91_USART_MODE_SERIAL 0
#define AT91_USART_MODE_SPI 1
#endif /* __DT_BINDINGS_AT91_USART_H__ */

View File

@ -0,0 +1,56 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Header file for the Ingenic JZ47xx TCU driver
*/
#ifndef __LINUX_MFD_INGENIC_TCU_H_
#define __LINUX_MFD_INGENIC_TCU_H_
#include <linux/bitops.h>
#define TCU_REG_WDT_TDR 0x00
#define TCU_REG_WDT_TCER 0x04
#define TCU_REG_WDT_TCNT 0x08
#define TCU_REG_WDT_TCSR 0x0c
#define TCU_REG_TER 0x10
#define TCU_REG_TESR 0x14
#define TCU_REG_TECR 0x18
#define TCU_REG_TSR 0x1c
#define TCU_REG_TFR 0x20
#define TCU_REG_TFSR 0x24
#define TCU_REG_TFCR 0x28
#define TCU_REG_TSSR 0x2c
#define TCU_REG_TMR 0x30
#define TCU_REG_TMSR 0x34
#define TCU_REG_TMCR 0x38
#define TCU_REG_TSCR 0x3c
#define TCU_REG_TDFR0 0x40
#define TCU_REG_TDHR0 0x44
#define TCU_REG_TCNT0 0x48
#define TCU_REG_TCSR0 0x4c
#define TCU_REG_OST_DR 0xe0
#define TCU_REG_OST_CNTL 0xe4
#define TCU_REG_OST_CNTH 0xe8
#define TCU_REG_OST_TCSR 0xec
#define TCU_REG_TSTR 0xf0
#define TCU_REG_TSTSR 0xf4
#define TCU_REG_TSTCR 0xf8
#define TCU_REG_OST_CNTHBUF 0xfc
#define TCU_TCSR_RESERVED_BITS 0x3f
#define TCU_TCSR_PARENT_CLOCK_MASK 0x07
#define TCU_TCSR_PRESCALE_LSB 3
#define TCU_TCSR_PRESCALE_MASK 0x38
#define TCU_TCSR_PWM_SD BIT(9) /* 0: Shutdown abruptly 1: gracefully */
#define TCU_TCSR_PWM_INITL_HIGH BIT(8) /* Sets the initial output level */
#define TCU_TCSR_PWM_EN BIT(7) /* PWM pin output enable */
#define TCU_WDT_TCER_TCEN BIT(0) /* Watchdog timer enable */
#define TCU_CHANNEL_STRIDE 0x10
#define TCU_REG_TDFRc(c) (TCU_REG_TDFR0 + ((c) * TCU_CHANNEL_STRIDE))
#define TCU_REG_TDHRc(c) (TCU_REG_TDHR0 + ((c) * TCU_CHANNEL_STRIDE))
#define TCU_REG_TCNTc(c) (TCU_REG_TCNT0 + ((c) * TCU_CHANNEL_STRIDE))
#define TCU_REG_TCSRc(c) (TCU_REG_TCSR0 + ((c) * TCU_CHANNEL_STRIDE))
#endif /* __LINUX_MFD_INGENIC_TCU_H_ */

View File

@ -1,12 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* /*
* include/linux/mfd/intel_msic.h - Core interface for Intel MSIC * Core interface for Intel MSIC
* *
* Copyright (C) 2011, Intel Corporation * Copyright (C) 2011, Intel Corporation
* Author: Mika Westerberg <mika.westerberg@linux.intel.com> * Author: Mika Westerberg <mika.westerberg@linux.intel.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.
*/ */
#ifndef __LINUX_MFD_INTEL_MSIC_H__ #ifndef __LINUX_MFD_INTEL_MSIC_H__

View File

@ -1,17 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* /*
* intel_soc_pmic.h - Intel SoC PMIC Driver * Intel SoC PMIC Driver
* *
* Copyright (C) 2012-2014 Intel Corporation. All rights reserved. * Copyright (C) 2012-2014 Intel Corporation. All rights reserved.
* *
* 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 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.
*
* Author: Yang, Bin <bin.yang@intel.com> * Author: Yang, Bin <bin.yang@intel.com>
* Author: Zhu, Lejun <lejun.zhu@linux.intel.com> * Author: Zhu, Lejun <lejun.zhu@linux.intel.com>
*/ */
@ -25,6 +17,7 @@ struct intel_soc_pmic {
int irq; int irq;
struct regmap *regmap; struct regmap *regmap;
struct regmap_irq_chip_data *irq_chip_data; struct regmap_irq_chip_data *irq_chip_data;
struct regmap_irq_chip_data *irq_chip_data_pwrbtn;
struct regmap_irq_chip_data *irq_chip_data_tmu; struct regmap_irq_chip_data *irq_chip_data_tmu;
struct regmap_irq_chip_data *irq_chip_data_bcu; struct regmap_irq_chip_data *irq_chip_data_bcu;
struct regmap_irq_chip_data *irq_chip_data_adc; struct regmap_irq_chip_data *irq_chip_data_adc;

View File

@ -1,16 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* /*
* Header file for Intel Broxton Whiskey Cove PMIC * Header file for Intel Broxton Whiskey Cove PMIC
* *
* Copyright (C) 2015 Intel Corporation. All rights reserved. * Copyright (C) 2015 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope 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.
*/ */
#ifndef __INTEL_BXTWC_H__ #ifndef __INTEL_BXTWC_H__

View File

@ -148,6 +148,7 @@ struct snd_soc_dapm_context;
* @internal_dcvdd: true if DCVDD is supplied from the internal LDO1 * @internal_dcvdd: true if DCVDD is supplied from the internal LDO1
* @pdata: our pdata * @pdata: our pdata
* @irq_dev: the irqchip child driver device * @irq_dev: the irqchip child driver device
* @irq_data: pointer to irqchip data for the child irqchip driver
* @irq: host irq number from SPI or I2C configuration * @irq: host irq number from SPI or I2C configuration
* @out_clamp: indicates output clamp state for each analogue output * @out_clamp: indicates output clamp state for each analogue output
* @out_shorted: indicates short circuit state for each analogue output * @out_shorted: indicates short circuit state for each analogue output
@ -175,6 +176,7 @@ struct madera {
struct madera_pdata pdata; struct madera_pdata pdata;
struct device *irq_dev; struct device *irq_dev;
struct regmap_irq_chip_data *irq_data;
int irq; int irq;
unsigned int num_micbias; unsigned int num_micbias;

View File

@ -24,7 +24,6 @@
struct gpio_desc; struct gpio_desc;
struct pinctrl_map; struct pinctrl_map;
struct madera_irqchip_pdata;
struct madera_codec_pdata; struct madera_codec_pdata;
/** /**

View File

@ -1,19 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max14577-private.h - Common API for the Maxim 14577/77836 internal sub chip * max14577-private.h - Common API for the Maxim 14577/77836 internal sub chip
* *
* Copyright (C) 2014 Samsung Electrnoics * Copyright (C) 2014 Samsung Electrnoics
* Chanwoo Choi <cw00.choi@samsung.com> * Chanwoo Choi <cw00.choi@samsung.com>
* Krzysztof Kozlowski <krzk@kernel.org> * Krzysztof Kozlowski <krzk@kernel.org>
*
* 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.
*/ */
#ifndef __MAX14577_PRIVATE_H__ #ifndef __MAX14577_PRIVATE_H__

View File

@ -1,3 +1,4 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max14577.h - Driver for the Maxim 14577/77836 * max14577.h - Driver for the Maxim 14577/77836
* *
@ -5,16 +6,6 @@
* Chanwoo Choi <cw00.choi@samsung.com> * Chanwoo Choi <cw00.choi@samsung.com>
* Krzysztof Kozlowski <krzk@kernel.org> * Krzysztof Kozlowski <krzk@kernel.org>
* *
* 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.
*
* This driver is based on max8997.h * This driver is based on max8997.h
* *
* MAX14577 has MUIC, Charger devices. * MAX14577 has MUIC, Charger devices.

View File

@ -1,22 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max77686-private.h - Voltage regulator driver for the Maxim 77686/802 * max77686-private.h - Voltage regulator driver for the Maxim 77686/802
* *
* Copyright (C) 2012 Samsung Electrnoics * Copyright (C) 2012 Samsung Electrnoics
* Chiwoong Byun <woong.byun@samsung.com> * Chiwoong Byun <woong.byun@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef __LINUX_MFD_MAX77686_PRIV_H #ifndef __LINUX_MFD_MAX77686_PRIV_H

View File

@ -1,23 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max77686.h - Driver for the Maxim 77686/802 * max77686.h - Driver for the Maxim 77686/802
* *
* Copyright (C) 2012 Samsung Electrnoics * Copyright (C) 2012 Samsung Electrnoics
* Chiwoong Byun <woong.byun@samsung.com> * Chiwoong Byun <woong.byun@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8997.h * This driver is based on max8997.h
* *
* MAX77686 has PMIC, RTC devices. * MAX77686 has PMIC, RTC devices.

View File

@ -1,12 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* Common data shared between Maxim 77693 and 77843 drivers * Common data shared between Maxim 77693 and 77843 drivers
* *
* Copyright (C) 2015 Samsung Electronics * Copyright (C) 2015 Samsung Electronics
*
* 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.
*/ */
#ifndef __LINUX_MFD_MAX77693_COMMON_H #ifndef __LINUX_MFD_MAX77693_COMMON_H

View File

@ -1,3 +1,4 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max77693-private.h - Voltage regulator driver for the Maxim 77693 * max77693-private.h - Voltage regulator driver for the Maxim 77693
* *
@ -5,20 +6,6 @@
* SangYoung Son <hello.son@samsung.com> * SangYoung Son <hello.son@samsung.com>
* *
* This program is not provided / owned by Maxim Integrated Products. * This program is not provided / owned by Maxim Integrated Products.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef __LINUX_MFD_MAX77693_PRIV_H #ifndef __LINUX_MFD_MAX77693_PRIV_H

View File

@ -1,3 +1,4 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max77693.h - Driver for the Maxim 77693 * max77693.h - Driver for the Maxim 77693
* *
@ -6,20 +7,6 @@
* *
* This program is not provided / owned by Maxim Integrated Products. * This program is not provided / owned by Maxim Integrated Products.
* *
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8997.h * This driver is based on max8997.h
* *
* MAX77693 has PMIC, Charger, Flash LED, Haptic, MUIC devices. * MAX77693 has PMIC, Charger, Flash LED, Haptic, MUIC devices.

View File

@ -1,14 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* Common variables for the Maxim MAX77843 driver * Common variables for the Maxim MAX77843 driver
* *
* Copyright (C) 2015 Samsung Electronics * Copyright (C) 2015 Samsung Electronics
* Author: Jaewon Kim <jaewon02.kim@samsung.com> * Author: Jaewon Kim <jaewon02.kim@samsung.com>
* Author: Beomho Seo <beomho.seo@samsung.com> * Author: Beomho Seo <beomho.seo@samsung.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.
*/ */
#ifndef __MAX77843_PRIVATE_H_ #ifndef __MAX77843_PRIVATE_H_

View File

@ -1,22 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max8997-private.h - Voltage regulator driver for the Maxim 8997 * max8997-private.h - Voltage regulator driver for the Maxim 8997
* *
* Copyright (C) 2010 Samsung Electrnoics * Copyright (C) 2010 Samsung Electrnoics
* MyungJoo Ham <myungjoo.ham@samsung.com> * MyungJoo Ham <myungjoo.ham@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef __LINUX_MFD_MAX8997_PRIV_H #ifndef __LINUX_MFD_MAX8997_PRIV_H

View File

@ -1,23 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max8997.h - Driver for the Maxim 8997/8966 * max8997.h - Driver for the Maxim 8997/8966
* *
* Copyright (C) 2009-2010 Samsung Electrnoics * Copyright (C) 2009-2010 Samsung Electrnoics
* MyungJoo Ham <myungjoo.ham@samsung.com> * MyungJoo Ham <myungjoo.ham@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This driver is based on max8998.h * This driver is based on max8998.h
* *
* MAX8997 has PMIC, MUIC, HAPTIC, RTC, FLASH, and Fuel Gauge devices. * MAX8997 has PMIC, MUIC, HAPTIC, RTC, FLASH, and Fuel Gauge devices.
@ -178,7 +165,6 @@ struct max8997_led_platform_data {
struct max8997_platform_data { struct max8997_platform_data {
/* IRQ */ /* IRQ */
int ono; int ono;
int wakeup;
/* ---- PMIC ---- */ /* ---- PMIC ---- */
struct max8997_regulator_data *regulators; struct max8997_regulator_data *regulators;

View File

@ -1,23 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max8998-private.h - Voltage regulator driver for the Maxim 8998 * max8998-private.h - Voltage regulator driver for the Maxim 8998
* *
* Copyright (C) 2009-2010 Samsung Electrnoics * Copyright (C) 2009-2010 Samsung Electrnoics
* Kyungmin Park <kyungmin.park@samsung.com> * Kyungmin Park <kyungmin.park@samsung.com>
* Marek Szyprowski <m.szyprowski@samsung.com> * Marek Szyprowski <m.szyprowski@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef __LINUX_MFD_MAX8998_PRIV_H #ifndef __LINUX_MFD_MAX8998_PRIV_H

View File

@ -1,23 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* max8998.h - Voltage regulator driver for the Maxim 8998 * max8998.h - Voltage regulator driver for the Maxim 8998
* *
* Copyright (C) 2009-2010 Samsung Electrnoics * Copyright (C) 2009-2010 Samsung Electrnoics
* Kyungmin Park <kyungmin.park@samsung.com> * Kyungmin Park <kyungmin.park@samsung.com>
* Marek Szyprowski <m.szyprowski@samsung.com> * Marek Szyprowski <m.szyprowski@samsung.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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef __LINUX_MFD_MAX8998_H #ifndef __LINUX_MFD_MAX8998_H

View File

@ -249,6 +249,7 @@ struct mc13xxx_platform_data {
#define MC13XXX_ADC0_TSMOD0 (1 << 12) #define MC13XXX_ADC0_TSMOD0 (1 << 12)
#define MC13XXX_ADC0_TSMOD1 (1 << 13) #define MC13XXX_ADC0_TSMOD1 (1 << 13)
#define MC13XXX_ADC0_TSMOD2 (1 << 14) #define MC13XXX_ADC0_TSMOD2 (1 << 14)
#define MC13XXX_ADC0_CHRGRAWDIV (1 << 15)
#define MC13XXX_ADC0_ADINC1 (1 << 16) #define MC13XXX_ADC0_ADINC1 (1 << 16)
#define MC13XXX_ADC0_ADINC2 (1 << 17) #define MC13XXX_ADC0_ADINC2 (1 << 17)

View File

@ -1,14 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* core.h * Copyright (c) 2011 Samsung Electronics Co., Ltd
*
* copyright (c) 2011 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
*/ */
#ifndef __LINUX_MFD_SEC_CORE_H #ifndef __LINUX_MFD_SEC_CORE_H

View File

@ -1,13 +1,7 @@
/* irq.h /* SPDX-License-Identifier: GPL-2.0+ */
* /*
* Copyright (c) 2012 Samsung Electronics Co., Ltd * Copyright (c) 2012 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
*/ */
#ifndef __LINUX_MFD_SEC_IRQ_H #ifndef __LINUX_MFD_SEC_IRQ_H

View File

@ -1,18 +1,7 @@
/* rtc.h /* SPDX-License-Identifier: GPL-2.0+ */
* /*
* Copyright (c) 2011-2014 Samsung Electronics Co., Ltd * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
* 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.
*
*/ */
#ifndef __LINUX_MFD_SEC_RTC_H #ifndef __LINUX_MFD_SEC_RTC_H

View File

@ -1,12 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* Copyright (c) 2013 Samsung Electronics Co., Ltd * Copyright (c) 2013 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
*/ */
#ifndef __LINUX_MFD_S2MPA01_H #ifndef __LINUX_MFD_S2MPA01_H

View File

@ -1,14 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* s2mps11.h
*
* Copyright (c) 2012 Samsung Electronics Co., Ltd * Copyright (c) 2012 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
*/ */
#ifndef __LINUX_MFD_S2MPS11_H #ifndef __LINUX_MFD_S2MPS11_H

View File

@ -1,19 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* s2mps13.h
*
* Copyright (c) 2014 Samsung Electronics Co., Ltd * Copyright (c) 2014 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
* 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.
*
*/ */
#ifndef __LINUX_MFD_S2MPS13_H #ifndef __LINUX_MFD_S2MPS13_H

View File

@ -1,19 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* s2mps14.h
*
* Copyright (c) 2014 Samsung Electronics Co., Ltd * Copyright (c) 2014 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
* 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.
*
*/ */
#ifndef __LINUX_MFD_S2MPS14_H #ifndef __LINUX_MFD_S2MPS14_H

View File

@ -1,16 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* Copyright (c) 2015 Samsung Electronics Co., Ltd * Copyright (c) 2015 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
* 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.
*/ */
#ifndef __LINUX_MFD_S2MPS15_H #ifndef __LINUX_MFD_S2MPS15_H

View File

@ -1,19 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* /*
* s2mpu02.h
*
* Copyright (c) 2014 Samsung Electronics Co., Ltd * Copyright (c) 2014 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
* 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.
*
*/ */
#ifndef __LINUX_MFD_S2MPU02_H #ifndef __LINUX_MFD_S2MPU02_H

View File

@ -1,13 +1,7 @@
/* s5m8763.h /* SPDX-License-Identifier: GPL-2.0+ */
* /*
* Copyright (c) 2011 Samsung Electronics Co., Ltd * Copyright (c) 2011 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
*/ */
#ifndef __LINUX_MFD_S5M8763_H #ifndef __LINUX_MFD_S5M8763_H

View File

@ -1,13 +1,7 @@
/* s5m8767.h /* SPDX-License-Identifier: GPL-2.0+ */
* /*
* Copyright (c) 2011 Samsung Electronics Co., Ltd * Copyright (c) 2011 Samsung Electronics Co., Ltd
* http://www.samsung.com * http://www.samsung.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.
*
*/ */
#ifndef __LINUX_MFD_S5M8767_H #ifndef __LINUX_MFD_S5M8767_H

View File

@ -16,6 +16,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/gpio/consumer.h>
/* Notifier event */ /* Notifier event */
#define LMU_EVENT_MONITOR_DONE 0x01 #define LMU_EVENT_MONITOR_DONE 0x01
@ -81,7 +82,7 @@ enum lm363x_regulator_id {
struct ti_lmu { struct ti_lmu {
struct device *dev; struct device *dev;
struct regmap *regmap; struct regmap *regmap;
int en_gpio; struct gpio_desc *en_gpio;
struct blocking_notifier_head notifier; struct blocking_notifier_head notifier;
}; };
#endif #endif