- 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:
commit
3ea172c84d
|
@ -1,6 +1,6 @@
|
|||
* Atmel Universal Synchronous Asynchronous Receiver/Transmitter (USART)
|
||||
|
||||
Required properties:
|
||||
Required properties for USART:
|
||||
- compatible: Should be "atmel,<chip>-usart" or "atmel,<chip>-dbgu"
|
||||
The compatible <chip> indicated will be the first SoC to support an
|
||||
additional mode or an USART new feature.
|
||||
|
@ -11,7 +11,13 @@ Required properties:
|
|||
Required elements: "usart"
|
||||
- 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-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.
|
||||
|
@ -62,3 +68,18 @@ Example:
|
|||
dma-names = "tx", "rx";
|
||||
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>;
|
||||
};
|
24
MAINTAINERS
24
MAINTAINERS
|
@ -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_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
|
||||
M: Stanislav Yakovlev <stas.yakovlev@gmail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
|
@ -9589,6 +9597,7 @@ M: Richard Genoud <richard.genoud@gmail.com>
|
|||
S: Maintained
|
||||
F: drivers/tty/serial/atmel_serial.c
|
||||
F: drivers/tty/serial/atmel_serial.h
|
||||
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
|
||||
|
||||
MICROCHIP / ATMEL DMA DRIVER
|
||||
M: Ludovic Desroches <ludovic.desroches@microchip.com>
|
||||
|
@ -9620,6 +9629,21 @@ S: Supported
|
|||
F: drivers/mtd/nand/raw/atmel/*
|
||||
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
|
||||
M: Woojung Huh <Woojung.Huh@microchip.com>
|
||||
M: Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>
|
||||
|
|
|
@ -693,16 +693,12 @@ static int __maybe_unused tiadc_suspend(struct device *dev)
|
|||
{
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
struct tiadc_device *adc_dev = iio_priv(indio_dev);
|
||||
struct ti_tscadc_dev *tscadc_dev;
|
||||
unsigned int idle;
|
||||
|
||||
tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
|
||||
if (!device_may_wakeup(tscadc_dev->dev)) {
|
||||
idle = tiadc_readl(adc_dev, REG_CTRL);
|
||||
idle &= ~(CNTRLREG_TSCSSENB);
|
||||
tiadc_writel(adc_dev, REG_CTRL, (idle |
|
||||
CNTRLREG_POWERDOWN));
|
||||
}
|
||||
idle = tiadc_readl(adc_dev, REG_CTRL);
|
||||
idle &= ~(CNTRLREG_TSCSSENB);
|
||||
tiadc_writel(adc_dev, REG_CTRL, (idle |
|
||||
CNTRLREG_POWERDOWN));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/sort.h>
|
||||
#include <linux/pm_wakeirq.h>
|
||||
|
||||
#include <linux/mfd/ti_am335x_tscadc.h>
|
||||
|
||||
|
@ -46,6 +47,7 @@ static const int config_pins[] = {
|
|||
struct titsc {
|
||||
struct input_dev *input;
|
||||
struct ti_tscadc_dev *mfd_tscadc;
|
||||
struct device *dev;
|
||||
unsigned int irq;
|
||||
unsigned int wires;
|
||||
unsigned int x_plate_resistance;
|
||||
|
@ -276,7 +278,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
|
|||
if (status & IRQENB_HW_PEN) {
|
||||
ts_dev->pen_down = true;
|
||||
irqclr |= IRQENB_HW_PEN;
|
||||
pm_stay_awake(ts_dev->mfd_tscadc->dev);
|
||||
pm_stay_awake(ts_dev->dev);
|
||||
}
|
||||
|
||||
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_abs(input_dev, ABS_PRESSURE, 0);
|
||||
input_sync(input_dev);
|
||||
pm_relax(ts_dev->mfd_tscadc->dev);
|
||||
pm_relax(ts_dev->dev);
|
||||
} else {
|
||||
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->input = input_dev;
|
||||
ts_dev->irq = tscadc_dev->irq;
|
||||
ts_dev->dev = &pdev->dev;
|
||||
|
||||
err = titsc_parse_dt(pdev, ts_dev);
|
||||
if (err) {
|
||||
|
@ -436,6 +439,11 @@ static int titsc_probe(struct platform_device *pdev)
|
|||
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_IRQENABLE, IRQENB_FIFO0THRES);
|
||||
titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS);
|
||||
|
@ -467,6 +475,8 @@ static int titsc_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
dev_pm_clear_wake_irq(&pdev->dev);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
free_irq(ts_dev->irq, ts_dev);
|
||||
err_free_mem:
|
||||
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);
|
||||
u32 steps;
|
||||
|
||||
dev_pm_clear_wake_irq(&pdev->dev);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
free_irq(ts_dev->irq, ts_dev);
|
||||
|
||||
/* total steps followed by the enable mask */
|
||||
|
@ -499,7 +511,7 @@ static int __maybe_unused titsc_suspend(struct device *dev)
|
|||
unsigned int idle;
|
||||
|
||||
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);
|
||||
idle = titsc_readl(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;
|
||||
|
||||
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,
|
||||
0x00);
|
||||
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_writel(ts_dev, REG_FIFO0THR,
|
||||
|
|
|
@ -99,6 +99,15 @@ config MFD_AAT2870_CORE
|
|||
additional drivers must be enabled in order to use the
|
||||
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
|
||||
tristate "Atmel Flexcom (Flexible Serial Communication Unit)"
|
||||
select MFD_CORE
|
||||
|
@ -1023,16 +1032,23 @@ config MFD_RN5T618
|
|||
functionality of the device.
|
||||
|
||||
config MFD_SEC_CORE
|
||||
bool "SAMSUNG Electronics PMIC Series Support"
|
||||
tristate "SAMSUNG Electronics PMIC Series Support"
|
||||
depends on I2C=y
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
help
|
||||
Support for the Samsung Electronics MFD series.
|
||||
This driver provides common support for accessing the device,
|
||||
additional drivers must be enabled in order to use the functionality
|
||||
of the device
|
||||
Support for the Samsung Electronics PMIC devices coming
|
||||
usually along with Samsung Exynos SoC chipset.
|
||||
This driver provides common support for accessing 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
|
||||
tristate "Silicon Laboratories 4761/64/68 AM/FM radio."
|
||||
|
|
|
@ -196,6 +196,7 @@ obj-$(CONFIG_MFD_SPMI_PMIC) += qcom-spmi-pmic.o
|
|||
obj-$(CONFIG_TPS65911_COMPARATOR) += tps65911-comparator.o
|
||||
obj-$(CONFIG_MFD_TPS65090) += tps65090.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_HLCDC) += atmel-hlcdc.o
|
||||
obj-$(CONFIG_MFD_ATMEL_SMC) += atmel-smc.o
|
||||
|
|
|
@ -360,6 +360,6 @@ static struct 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_LICENSE("GPL");
|
||||
|
|
|
@ -52,8 +52,10 @@ int arizona_clk32k_enable(struct arizona *arizona)
|
|||
if (ret != 0)
|
||||
goto err_ref;
|
||||
ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]);
|
||||
if (ret != 0)
|
||||
goto err_pm;
|
||||
if (ret != 0) {
|
||||
pm_runtime_put_sync(arizona->dev);
|
||||
goto err_ref;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_32KZ_MCLK2:
|
||||
ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]);
|
||||
|
@ -67,8 +69,6 @@ int arizona_clk32k_enable(struct arizona *arizona)
|
|||
ARIZONA_CLK_32K_ENA);
|
||||
}
|
||||
|
||||
err_pm:
|
||||
pm_runtime_put_sync(arizona->dev);
|
||||
err_ref:
|
||||
if (ret != 0)
|
||||
arizona->clk32k_ref--;
|
||||
|
@ -990,7 +990,7 @@ static const struct mfd_cell wm8998_devs[] = {
|
|||
|
||||
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;
|
||||
const char *type_name = NULL;
|
||||
unsigned int reg, val;
|
||||
|
|
|
@ -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");
|
|
@ -218,7 +218,8 @@ EXPORT_SYMBOL(cros_ec_suspend);
|
|||
|
||||
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,
|
||||
1, ec_dev);
|
||||
}
|
||||
|
|
|
@ -546,6 +546,7 @@ static struct platform_driver cros_ec_dev_driver = {
|
|||
.name = DRV_NAME,
|
||||
.pm = &cros_ec_dev_pm_ops,
|
||||
},
|
||||
.id_table = cros_ec_id,
|
||||
.probe = ec_device_probe,
|
||||
.remove = ec_device_remove,
|
||||
.shutdown = ec_device_shutdown,
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Driver for Intel MSIC
|
||||
*
|
||||
* Copyright (C) 2011, Intel Corporation
|
||||
* 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>
|
||||
|
@ -54,68 +51,44 @@ struct intel_msic {
|
|||
};
|
||||
|
||||
static struct resource msic_touch_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_adc_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_battery_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_gpio_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_audio_resources[] = {
|
||||
{
|
||||
.name = "IRQ",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ_NAMED(0, "IRQ"),
|
||||
/*
|
||||
* 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().
|
||||
*/
|
||||
{
|
||||
.name = "IRQ_BASE",
|
||||
.flags = IORESOURCE_MEM,
|
||||
.start = MSIC_IRQ_STATUS_ACCDET,
|
||||
.end = MSIC_IRQ_STATUS_ACCDET,
|
||||
},
|
||||
DEFINE_RES_MEM_NAMED(MSIC_IRQ_STATUS_ACCDET, 1, "IRQ_BASE"),
|
||||
};
|
||||
|
||||
static struct resource msic_hdmi_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_thermal_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_power_btn_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
static struct resource msic_ocd_resources[] = {
|
||||
{
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ(0),
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,27 +1,20 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* MFD core driver for Intel Broxton Whiskey Cove PMIC
|
||||
*
|
||||
* 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/err.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/intel_soc_pmic.h>
|
||||
#include <linux/mfd/intel_soc_pmic_bxtwc.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/intel_pmc_ipc.h>
|
||||
|
||||
/* PMIC device registers */
|
||||
|
@ -31,8 +24,8 @@
|
|||
|
||||
/* Interrupt Status Registers */
|
||||
#define BXTWC_IRQLVL1 0x4E02
|
||||
#define BXTWC_PWRBTNIRQ 0x4E03
|
||||
|
||||
#define BXTWC_PWRBTNIRQ 0x4E03
|
||||
#define BXTWC_THRM0IRQ 0x4E04
|
||||
#define BXTWC_THRM1IRQ 0x4E05
|
||||
#define BXTWC_THRM2IRQ 0x4E06
|
||||
|
@ -47,10 +40,9 @@
|
|||
|
||||
/* Interrupt MASK Registers */
|
||||
#define BXTWC_MIRQLVL1 0x4E0E
|
||||
#define BXTWC_MPWRTNIRQ 0x4E0F
|
||||
|
||||
#define BXTWC_MIRQLVL1_MCHGR BIT(5)
|
||||
|
||||
#define BXTWC_MPWRBTNIRQ 0x4E0F
|
||||
#define BXTWC_MTHRM0IRQ 0x4E12
|
||||
#define BXTWC_MTHRM1IRQ 0x4E13
|
||||
#define BXTWC_MTHRM2IRQ 0x4E14
|
||||
|
@ -66,9 +58,7 @@
|
|||
/* Whiskey Cove PMIC share same ACPI ID between different platforms */
|
||||
#define BROXTON_PMIC_WC_HRV 4
|
||||
|
||||
/* Manage in two IRQ chips since mask registers are not consecutive */
|
||||
enum bxtwc_irqs {
|
||||
/* Level 1 */
|
||||
BXTWC_PWRBTN_LVL1_IRQ = 0,
|
||||
BXTWC_TMU_LVL1_IRQ,
|
||||
BXTWC_THRM_LVL1_IRQ,
|
||||
|
@ -77,9 +67,11 @@ enum bxtwc_irqs {
|
|||
BXTWC_CHGR_LVL1_IRQ,
|
||||
BXTWC_GPIO_LVL1_IRQ,
|
||||
BXTWC_CRIT_LVL1_IRQ,
|
||||
};
|
||||
|
||||
/* Level 2 */
|
||||
BXTWC_PWRBTN_IRQ,
|
||||
enum bxtwc_irqs_pwrbtn {
|
||||
BXTWC_PWRBTN_IRQ = 0,
|
||||
BXTWC_UIBTN_IRQ,
|
||||
};
|
||||
|
||||
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_GPIO_LVL1_IRQ, 0, BIT(6)),
|
||||
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[] = {
|
||||
|
@ -125,7 +120,7 @@ static const struct regmap_irq bxtwc_regmap_irqs_adc[] = {
|
|||
};
|
||||
|
||||
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_CHGR1_IRQ, 1, 0x1f),
|
||||
};
|
||||
|
@ -144,7 +139,16 @@ static struct regmap_irq_chip bxtwc_regmap_irq_chip = {
|
|||
.mask_base = BXTWC_MIRQLVL1,
|
||||
.irqs = 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 = {
|
||||
|
@ -472,6 +476,16 @@ static int bxtwc_probe(struct platform_device *pdev)
|
|||
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,
|
||||
BXTWC_TMU_LVL1_IRQ,
|
||||
IRQF_ONESHOT,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Device access for Dollar Cove TI PMIC
|
||||
*
|
||||
|
@ -6,10 +7,6 @@
|
|||
*
|
||||
* Cleanup and forward-ported
|
||||
* 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>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* 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:
|
||||
* 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>
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* 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: Zhu, Lejun <lejun.zhu@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/intel_soc_pmic.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include "intel_soc_pmic_core.h"
|
||||
|
||||
/* Crystal Cove PMIC shares same ACPI ID between different platforms */
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* 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: Zhu, Lejun <lejun.zhu@linux.intel.com>
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* 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: Zhu, Lejun <lejun.zhu@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/intel_soc_pmic.h>
|
||||
|
||||
#include "intel_soc_pmic_core.h"
|
||||
|
||||
#define CRYSTAL_COVE_MAX_REGISTER 0xC6
|
||||
|
@ -36,48 +29,23 @@
|
|||
#define CRYSTAL_COVE_IRQ_VHDMIOCP 6
|
||||
|
||||
static struct resource gpio_resources[] = {
|
||||
{
|
||||
.name = "GPIO",
|
||||
.start = CRYSTAL_COVE_IRQ_GPIO,
|
||||
.end = CRYSTAL_COVE_IRQ_GPIO,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_GPIO, "GPIO"),
|
||||
};
|
||||
|
||||
static struct resource pwrsrc_resources[] = {
|
||||
{
|
||||
.name = "PWRSRC",
|
||||
.start = CRYSTAL_COVE_IRQ_PWRSRC,
|
||||
.end = CRYSTAL_COVE_IRQ_PWRSRC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_PWRSRC, "PWRSRC"),
|
||||
};
|
||||
|
||||
static struct resource adc_resources[] = {
|
||||
{
|
||||
.name = "ADC",
|
||||
.start = CRYSTAL_COVE_IRQ_ADC,
|
||||
.end = CRYSTAL_COVE_IRQ_ADC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_ADC, "ADC"),
|
||||
};
|
||||
|
||||
static struct resource thermal_resources[] = {
|
||||
{
|
||||
.name = "THERMAL",
|
||||
.start = CRYSTAL_COVE_IRQ_THRM,
|
||||
.end = CRYSTAL_COVE_IRQ_THRM,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_THRM, "THERMAL"),
|
||||
};
|
||||
|
||||
static struct resource bcu_resources[] = {
|
||||
{
|
||||
.name = "BCU",
|
||||
.start = CRYSTAL_COVE_IRQ_BCU,
|
||||
.end = CRYSTAL_COVE_IRQ_BCU,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_BCU, "BCU"),
|
||||
};
|
||||
|
||||
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[] = {
|
||||
[CRYSTAL_COVE_IRQ_PWRSRC] = {
|
||||
.mask = BIT(CRYSTAL_COVE_IRQ_PWRSRC),
|
||||
},
|
||||
[CRYSTAL_COVE_IRQ_THRM] = {
|
||||
.mask = BIT(CRYSTAL_COVE_IRQ_THRM),
|
||||
},
|
||||
[CRYSTAL_COVE_IRQ_BCU] = {
|
||||
.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),
|
||||
},
|
||||
REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_PWRSRC, 0, 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)),
|
||||
REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_ADC, 0, BIT(CRYSTAL_COVE_IRQ_ADC)),
|
||||
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)),
|
||||
REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_VHDMIOCP, 0, BIT(CRYSTAL_COVE_IRQ_VHDMIOCP)),
|
||||
};
|
||||
|
||||
static const struct regmap_irq_chip crystal_cove_irq_chip = {
|
||||
|
|
|
@ -132,32 +132,39 @@ const char *madera_name_from_type(enum madera_type type)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(madera_name_from_type);
|
||||
|
||||
#define MADERA_BOOT_POLL_MAX_INTERVAL_US 5000
|
||||
#define MADERA_BOOT_POLL_TIMEOUT_US 25000
|
||||
#define MADERA_BOOT_POLL_INTERVAL_USEC 5000
|
||||
#define MADERA_BOOT_POLL_TIMEOUT_USEC 25000
|
||||
|
||||
static int madera_wait_for_boot(struct madera *madera)
|
||||
{
|
||||
ktime_t timeout;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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,
|
||||
MADERA_IRQ1_RAW_STATUS_1,
|
||||
val,
|
||||
(val & MADERA_BOOT_DONE_STS1),
|
||||
MADERA_BOOT_POLL_MAX_INTERVAL_US,
|
||||
MADERA_BOOT_POLL_TIMEOUT_US);
|
||||
timeout = ktime_add_us(ktime_get(), MADERA_BOOT_POLL_TIMEOUT_USEC);
|
||||
regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
|
||||
while (!(val & MADERA_BOOT_DONE_STS1) &&
|
||||
!ktime_after(ktime_get(), timeout)) {
|
||||
usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2,
|
||||
MADERA_BOOT_POLL_INTERVAL_USEC);
|
||||
regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
|
||||
};
|
||||
|
||||
if (ret)
|
||||
dev_err(madera->dev, "Polling BOOT_DONE_STS failed: %d\n", ret);
|
||||
if (!(val & MADERA_BOOT_DONE_STS1)) {
|
||||
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.
|
||||
* 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,
|
||||
MADERA_BOOT_DONE_EINT1);
|
||||
|
|
|
@ -1,22 +1,12 @@
|
|||
/*
|
||||
* max14577.c - mfd core driver for the Maxim 14577/77836
|
||||
*
|
||||
* Copyright (C) 2014 Samsung Electronics
|
||||
* 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
|
||||
* 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
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// max14577.c - mfd core driver for the Maxim 14577/77836
|
||||
//
|
||||
// Copyright (C) 2014 Samsung Electronics
|
||||
// Chanwoo Choi <cw00.choi@samsung.com>
|
||||
// Krzysztof Kozlowski <krzk@kernel.org>
|
||||
//
|
||||
// This driver is based on max8997.c
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
|
|
|
@ -285,7 +285,7 @@ static int max77620_config_fps(struct max77620_chip *chip,
|
|||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,26 +1,12 @@
|
|||
/*
|
||||
* max77686.c - mfd core driver for the Maxim 77686/802
|
||||
*
|
||||
* Copyright (C) 2012 Samsung Electronics
|
||||
* 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
|
||||
* 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
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// max77686.c - mfd core driver for the Maxim 77686/802
|
||||
//
|
||||
// Copyright (C) 2012 Samsung Electronics
|
||||
// Chiwoong Byun <woong.byun@samsung.com>
|
||||
// Jonghwa Lee <jonghwa3.lee@samsung.com>
|
||||
//
|
||||
//This driver is based on max8997.c
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
|
@ -1,27 +1,13 @@
|
|||
/*
|
||||
* max77693.c - mfd core driver for the MAX 77693
|
||||
*
|
||||
* Copyright (C) 2012 Samsung Electronics
|
||||
* SangYoung Son <hello.son@samsung.com>
|
||||
*
|
||||
* 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.c
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// max77693.c - mfd core driver for the MAX 77693
|
||||
//
|
||||
// Copyright (C) 2012 Samsung Electronics
|
||||
// SangYoung Son <hello.son@samsung.com>
|
||||
//
|
||||
// This program is not provided / owned by Maxim Integrated Products.
|
||||
//
|
||||
// This driver is based on max8997.c
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
|
|
|
@ -1,15 +1,10 @@
|
|||
/*
|
||||
* MFD core driver for the Maxim MAX77843
|
||||
*
|
||||
* Copyright (C) 2015 Samsung Electronics
|
||||
* 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.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// MFD core driver for the Maxim MAX77843
|
||||
//
|
||||
// Copyright (C) 2015 Samsung Electronics
|
||||
// Author: Jaewon Kim <jaewon02.kim@samsung.com>
|
||||
// Author: Beomho Seo <beomho.seo@samsung.com>
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/i2c.h>
|
||||
|
|
|
@ -1,25 +1,11 @@
|
|||
/*
|
||||
* max8997-irq.c - Interrupt controller support for MAX8997
|
||||
*
|
||||
* 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
|
||||
* 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
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// max8997-irq.c - Interrupt controller support for MAX8997
|
||||
//
|
||||
// Copyright (C) 2011 Samsung Electronics Co.Ltd
|
||||
// MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
//
|
||||
// This driver is based on max8998-irq.c
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/irq.h>
|
||||
|
|
|
@ -1,25 +1,11 @@
|
|||
/*
|
||||
* max8997.c - mfd core driver for the Maxim 8966 and 8997
|
||||
*
|
||||
* 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
|
||||
* 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
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// max8997.c - mfd core driver for the Maxim 8966 and 8997
|
||||
//
|
||||
// Copyright (C) 2011 Samsung Electronics
|
||||
// MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
//
|
||||
// This driver is based on max8998.c
|
||||
|
||||
#include <linux/err.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);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
@ -246,7 +226,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
|
|||
*/
|
||||
|
||||
/* MAX8997 has a power button input. */
|
||||
device_init_wakeup(max8997->dev, pdata->wakeup);
|
||||
device_init_wakeup(max8997->dev, true);
|
||||
|
||||
return ret;
|
||||
|
||||
|
@ -468,6 +448,7 @@ static int max8997_suspend(struct device *dev)
|
|||
struct i2c_client *i2c = to_i2c_client(dev);
|
||||
struct max8997_dev *max8997 = i2c_get_clientdata(i2c);
|
||||
|
||||
disable_irq(max8997->irq);
|
||||
if (device_may_wakeup(dev))
|
||||
irq_set_irq_wake(max8997->irq, 1);
|
||||
return 0;
|
||||
|
@ -480,6 +461,7 @@ static int max8997_resume(struct device *dev)
|
|||
|
||||
if (device_may_wakeup(dev))
|
||||
irq_set_irq_wake(max8997->irq, 0);
|
||||
enable_irq(max8997->irq);
|
||||
return max8997_irq_resume(max8997);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,15 +1,9 @@
|
|||
/*
|
||||
* Interrupt controller support for MAX8998
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Interrupt controller support for MAX8998
|
||||
//
|
||||
// Copyright (C) 2010 Samsung Electronics Co.Ltd
|
||||
// Author: Joonyoung Shim <jy0922.shim@samsung.com>
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
@ -1,24 +1,10 @@
|
|||
/*
|
||||
* max8998.c - mfd core driver for the Maxim 8998
|
||||
*
|
||||
* Copyright (C) 2009-2010 Samsung Electronics
|
||||
* 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
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// max8998.c - mfd core driver for the Maxim 8998
|
||||
//
|
||||
// Copyright (C) 2009-2010 Samsung Electronics
|
||||
// Kyungmin Park <kyungmin.park@samsung.com>
|
||||
// Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
|
|
|
@ -276,7 +276,8 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
|
|||
|
||||
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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -1094,6 +1094,7 @@ static void menelaus_rtc_alarm_work(struct menelaus_chip *m)
|
|||
static inline void menelaus_rtc_init(struct menelaus_chip *m)
|
||||
{
|
||||
int alarm = (m->client->irq > 0);
|
||||
int err;
|
||||
|
||||
/* assume 32KDETEN pin is pulled high */
|
||||
if (!(menelaus_read_reg(MENELAUS_OSC_CTRL) & 0x80)) {
|
||||
|
@ -1101,6 +1102,12 @@ static inline void menelaus_rtc_init(struct menelaus_chip *m)
|
|||
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 */
|
||||
if (alarm) {
|
||||
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);
|
||||
}
|
||||
|
||||
m->rtc = rtc_device_register(DRIVER_NAME,
|
||||
&m->client->dev,
|
||||
&menelaus_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(m->rtc)) {
|
||||
err = rtc_register_device(m->rtc);
|
||||
if (err) {
|
||||
if (alarm) {
|
||||
menelaus_remove_irq_work(MENELAUS_RTCALM_IRQ);
|
||||
device_init_wakeup(&m->client->dev, 0);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/regmap.h>
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/motorola-cpcap.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
|
@ -216,6 +217,53 @@ static const struct regmap_config cpcap_regmap_config = {
|
|||
.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)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
|
@ -260,7 +308,8 @@ static int cpcap_probe(struct spi_device *spi)
|
|||
if (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 = {
|
||||
|
|
|
@ -1,15 +1,7 @@
|
|||
/*
|
||||
* sec-core.c
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Copyright (c) 2012 Samsung Electronics Co., Ltd
|
||||
// http://www.samsung.com
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
|
|
|
@ -1,19 +1,12 @@
|
|||
/*
|
||||
* sec-irq.c
|
||||
*
|
||||
* Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
|
||||
// http://www.samsung.com
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <linux/mfd/samsung/core.h>
|
||||
|
@ -501,3 +494,10 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
|
|||
|
||||
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");
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/core.h>
|
||||
|
@ -21,28 +21,18 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct ti_lmu_data {
|
||||
struct mfd_cell *cells;
|
||||
const struct mfd_cell *cells;
|
||||
int num_cells;
|
||||
unsigned int max_register;
|
||||
};
|
||||
|
||||
static int ti_lmu_enable_hw(struct ti_lmu *lmu, enum ti_lmu_id id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (lmu->en_gpio)
|
||||
gpiod_set_value(lmu->en_gpio, 1);
|
||||
|
||||
/* Delay about 1ms after HW enable pin control */
|
||||
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;
|
||||
}
|
||||
|
||||
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))
|
||||
gpio_set_value(lmu->en_gpio, 0);
|
||||
struct ti_lmu *lmu = data;
|
||||
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",
|
||||
.id = LM3532,
|
||||
|
@ -78,7 +69,7 @@ static struct mfd_cell lm3532_devices[] = {
|
|||
.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_LDO_CONT),
|
||||
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_LDO_POS),
|
||||
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",
|
||||
.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",
|
||||
.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",
|
||||
.id = LM3697,
|
||||
|
@ -157,34 +148,21 @@ TI_LMU_DATA(lm3633, LM3633_MAX_REG);
|
|||
TI_LMU_DATA(lm3695, LM3695_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)
|
||||
{
|
||||
struct device *dev = &cl->dev;
|
||||
const struct of_device_id *match;
|
||||
const struct ti_lmu_data *data;
|
||||
struct regmap_config regmap_cfg;
|
||||
struct ti_lmu *lmu;
|
||||
int ret;
|
||||
|
||||
match = of_match_device(ti_lmu_of_match, dev);
|
||||
if (!match)
|
||||
return -ENODEV;
|
||||
/*
|
||||
* Get device specific data from of_match table.
|
||||
* 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);
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
if (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.
|
||||
* 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);
|
||||
|
||||
return mfd_add_devices(lmu->dev, 0, data->cells,
|
||||
data->num_cells, NULL, 0, NULL);
|
||||
return devm_mfd_add_devices(lmu->dev, 0, data->cells,
|
||||
data->num_cells, NULL, 0, NULL);
|
||||
}
|
||||
|
||||
static int ti_lmu_remove(struct i2c_client *cl)
|
||||
{
|
||||
struct ti_lmu *lmu = i2c_get_clientdata(cl);
|
||||
|
||||
ti_lmu_disable_hw(lmu);
|
||||
mfd_remove_devices(lmu->dev);
|
||||
return 0;
|
||||
}
|
||||
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 const struct i2c_device_id ti_lmu_ids[] = {
|
||||
{ "lm3532", LM3532 },
|
||||
|
@ -244,7 +234,6 @@ MODULE_DEVICE_TABLE(i2c, ti_lmu_ids);
|
|||
|
||||
static struct i2c_driver ti_lmu_driver = {
|
||||
.probe = ti_lmu_probe,
|
||||
.remove = ti_lmu_remove,
|
||||
.driver = {
|
||||
.name = "ti-lmu",
|
||||
.of_match_table = ti_lmu_of_match,
|
||||
|
|
|
@ -269,7 +269,6 @@ static int ti_tscadc_probe(struct platform_device *pdev)
|
|||
if (err < 0)
|
||||
goto err_disable_clk;
|
||||
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
platform_set_drvdata(pdev, tscadc);
|
||||
return 0;
|
||||
|
||||
|
@ -294,11 +293,24 @@ static int ti_tscadc_remove(struct platform_device *pdev)
|
|||
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)
|
||||
{
|
||||
struct ti_tscadc_dev *tscadc = dev_get_drvdata(dev);
|
||||
|
||||
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);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -83,6 +83,14 @@ config SPI_ATMEL
|
|||
This selects a driver for the Atmel SPI Controller, present on
|
||||
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
|
||||
tristate "Au1550/Au1200/Au1300 SPI Controller"
|
||||
depends on MIPS_ALCHEMY
|
||||
|
|
|
@ -16,6 +16,7 @@ obj-$(CONFIG_SPI_LOOPBACK_TEST) += spi-loopback-test.o
|
|||
obj-$(CONFIG_SPI_ALTERA) += spi-altera.o
|
||||
obj-$(CONFIG_SPI_ARMADA_3700) += spi-armada-3700.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_AU1550) += spi-au1550.o
|
||||
obj-$(CONFIG_SPI_AXI_SPI_ENGINE) += spi-axi-spi-engine.o
|
||||
|
|
|
@ -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),
|
||||
®s->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");
|
|
@ -118,6 +118,7 @@ config SERIAL_ATMEL
|
|||
depends on ARCH_AT91 || COMPILE_TEST
|
||||
select SERIAL_CORE
|
||||
select SERIAL_MCTRL_GPIO if GPIOLIB
|
||||
select MFD_AT91_USART
|
||||
help
|
||||
This enables the driver for the on-chip UARTs of the Atmel
|
||||
AT91 processors.
|
||||
|
|
|
@ -193,8 +193,7 @@ static struct console atmel_console;
|
|||
|
||||
#if defined(CONFIG_OF)
|
||||
static const struct of_device_id atmel_serial_dt_ids[] = {
|
||||
{ .compatible = "atmel,at91rm9200-usart" },
|
||||
{ .compatible = "atmel,at91sam9260-usart" },
|
||||
{ .compatible = "atmel,at91rm9200-usart-serial" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
#endif
|
||||
|
@ -915,6 +914,7 @@ static void atmel_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 device *mfd_dev = port->dev->parent;
|
||||
dma_cap_mask_t mask;
|
||||
struct dma_slave_config config;
|
||||
int ret, nent;
|
||||
|
@ -922,7 +922,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port)
|
|||
dma_cap_zero(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)
|
||||
goto chan_err;
|
||||
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)
|
||||
{
|
||||
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
||||
struct device *mfd_dev = port->dev->parent;
|
||||
struct dma_async_tx_descriptor *desc;
|
||||
dma_cap_mask_t mask;
|
||||
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_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)
|
||||
goto chan_err;
|
||||
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)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(port->dev);
|
||||
int size = pdev->resource[0].end - pdev->resource[0].start + 1;
|
||||
struct platform_device *mpdev = to_platform_device(port->dev->parent);
|
||||
int size = resource_size(mpdev->resource);
|
||||
|
||||
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)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(port->dev);
|
||||
int size = pdev->resource[0].end - pdev->resource[0].start + 1;
|
||||
struct platform_device *mpdev = to_platform_device(port->dev->parent);
|
||||
int size = resource_size(mpdev->resource);
|
||||
|
||||
if (!request_mem_region(port->mapbase, size, "atmel_serial"))
|
||||
return -EBUSY;
|
||||
|
@ -2341,27 +2342,28 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
|
|||
{
|
||||
int ret;
|
||||
struct uart_port *port = &atmel_port->uart;
|
||||
struct platform_device *mpdev = to_platform_device(pdev->dev.parent);
|
||||
|
||||
atmel_init_property(atmel_port, pdev);
|
||||
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->flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
|
||||
port->ops = &atmel_pops;
|
||||
port->fifosize = 1;
|
||||
port->dev = &pdev->dev;
|
||||
port->mapbase = pdev->resource[0].start;
|
||||
port->irq = pdev->resource[1].start;
|
||||
port->mapbase = mpdev->resource[0].start;
|
||||
port->irq = mpdev->resource[1].start;
|
||||
port->rs485_config = atmel_config_rs485;
|
||||
port->membase = NULL;
|
||||
port->membase = NULL;
|
||||
|
||||
memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring));
|
||||
|
||||
/* for console, the clock could already be configured */
|
||||
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)) {
|
||||
ret = PTR_ERR(atmel_port->clk);
|
||||
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)
|
||||
{
|
||||
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;
|
||||
int ret = -ENODEV;
|
||||
bool rs485_enabled;
|
||||
|
||||
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");
|
||||
if (ret < 0)
|
||||
/* 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);
|
||||
atmel_port->clk = NULL;
|
||||
pdev->dev.of_node = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -2846,7 +2858,7 @@ static struct platform_driver atmel_serial_driver = {
|
|||
.suspend = atmel_serial_suspend,
|
||||
.resume = atmel_serial_resume,
|
||||
.driver = {
|
||||
.name = "atmel_usart",
|
||||
.name = "atmel_usart_serial",
|
||||
.of_match_table = of_match_ptr(atmel_serial_dt_ids),
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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__ */
|
|
@ -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_ */
|
|
@ -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
|
||||
* 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__
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* 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: Zhu, Lejun <lejun.zhu@linux.intel.com>
|
||||
*/
|
||||
|
@ -25,6 +17,7 @@ struct intel_soc_pmic {
|
|||
int irq;
|
||||
struct regmap *regmap;
|
||||
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_bcu;
|
||||
struct regmap_irq_chip_data *irq_chip_data_adc;
|
||||
|
|
|
@ -1,16 +1,8 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Header file for Intel Broxton Whiskey Cove PMIC
|
||||
*
|
||||
* 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__
|
||||
|
|
|
@ -148,6 +148,7 @@ struct snd_soc_dapm_context;
|
|||
* @internal_dcvdd: true if DCVDD is supplied from the internal LDO1
|
||||
* @pdata: our pdata
|
||||
* @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
|
||||
* @out_clamp: indicates output clamp 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 device *irq_dev;
|
||||
struct regmap_irq_chip_data *irq_data;
|
||||
int irq;
|
||||
|
||||
unsigned int num_micbias;
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
|
||||
struct gpio_desc;
|
||||
struct pinctrl_map;
|
||||
struct madera_irqchip_pdata;
|
||||
struct madera_codec_pdata;
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,19 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max14577-private.h - Common API for the Maxim 14577/77836 internal sub chip
|
||||
*
|
||||
* Copyright (C) 2014 Samsung Electrnoics
|
||||
* 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
|
||||
* 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__
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max14577.h - Driver for the Maxim 14577/77836
|
||||
*
|
||||
|
@ -5,16 +6,6 @@
|
|||
* 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
|
||||
* 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
|
||||
*
|
||||
* MAX14577 has MUIC, Charger devices.
|
||||
|
|
|
@ -1,22 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max77686-private.h - Voltage regulator driver for the Maxim 77686/802
|
||||
*
|
||||
* Copyright (C) 2012 Samsung Electrnoics
|
||||
* 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
|
||||
|
|
|
@ -1,23 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max77686.h - Driver for the Maxim 77686/802
|
||||
*
|
||||
* Copyright (C) 2012 Samsung Electrnoics
|
||||
* 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
|
||||
*
|
||||
* MAX77686 has PMIC, RTC devices.
|
||||
|
|
|
@ -1,12 +1,8 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Common data shared between Maxim 77693 and 77843 drivers
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max77693-private.h - Voltage regulator driver for the Maxim 77693
|
||||
*
|
||||
|
@ -5,20 +6,6 @@
|
|||
* SangYoung Son <hello.son@samsung.com>
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max77693.h - Driver for the Maxim 77693
|
||||
*
|
||||
|
@ -6,20 +7,6 @@
|
|||
*
|
||||
* 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
|
||||
*
|
||||
* MAX77693 has PMIC, Charger, Flash LED, Haptic, MUIC devices.
|
||||
|
|
|
@ -1,14 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Common variables for the Maxim MAX77843 driver
|
||||
*
|
||||
* Copyright (C) 2015 Samsung Electronics
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __MAX77843_PRIVATE_H_
|
||||
|
|
|
@ -1,22 +1,9 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max8997-private.h - Voltage regulator driver for the Maxim 8997
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electrnoics
|
||||
* 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
|
||||
|
|
|
@ -1,23 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max8997.h - Driver for the Maxim 8997/8966
|
||||
*
|
||||
* Copyright (C) 2009-2010 Samsung Electrnoics
|
||||
* 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
|
||||
*
|
||||
* MAX8997 has PMIC, MUIC, HAPTIC, RTC, FLASH, and Fuel Gauge devices.
|
||||
|
@ -178,7 +165,6 @@ struct max8997_led_platform_data {
|
|||
struct max8997_platform_data {
|
||||
/* IRQ */
|
||||
int ono;
|
||||
int wakeup;
|
||||
|
||||
/* ---- PMIC ---- */
|
||||
struct max8997_regulator_data *regulators;
|
||||
|
|
|
@ -1,23 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max8998-private.h - Voltage regulator driver for the Maxim 8998
|
||||
*
|
||||
* Copyright (C) 2009-2010 Samsung Electrnoics
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_MFD_MAX8998_PRIV_H
|
||||
|
|
|
@ -1,23 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* max8998.h - Voltage regulator driver for the Maxim 8998
|
||||
*
|
||||
* Copyright (C) 2009-2010 Samsung Electrnoics
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_MFD_MAX8998_H
|
||||
|
|
|
@ -249,6 +249,7 @@ struct mc13xxx_platform_data {
|
|||
#define MC13XXX_ADC0_TSMOD0 (1 << 12)
|
||||
#define MC13XXX_ADC0_TSMOD1 (1 << 13)
|
||||
#define MC13XXX_ADC0_TSMOD2 (1 << 14)
|
||||
#define MC13XXX_ADC0_CHRGRAWDIV (1 << 15)
|
||||
#define MC13XXX_ADC0_ADINC1 (1 << 16)
|
||||
#define MC13XXX_ADC0_ADINC2 (1 << 17)
|
||||
|
||||
|
|
|
@ -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
|
||||
*
|
||||
* 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
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
/* irq.h
|
||||
*
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,18 +1,7 @@
|
|||
/* rtc.h
|
||||
*
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011-2014 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,12 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2013 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,14 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* s2mps11.h
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,19 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* s2mps13.h
|
||||
*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,19 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* s2mps14.h
|
||||
*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,16 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2015 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,19 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* s2mpu02.h
|
||||
*
|
||||
* Copyright (c) 2014 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
/* s5m8763.h
|
||||
*
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
/* s5m8767.h
|
||||
*
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011 Samsung Electronics Co., Ltd
|
||||
* 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
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
/* Notifier event */
|
||||
#define LMU_EVENT_MONITOR_DONE 0x01
|
||||
|
@ -81,7 +82,7 @@ enum lm363x_regulator_id {
|
|||
struct ti_lmu {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
int en_gpio;
|
||||
struct gpio_desc *en_gpio;
|
||||
struct blocking_notifier_head notifier;
|
||||
};
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue