Merge branches 'ib-mfd-iio-input-5.1', 'ib-mfd-input-watchdog-5.1' and 'ib-mfd-platform-5.1' into ibs-for-mfd-merged
这个提交包含在:
@@ -102,6 +102,7 @@ config MFD_AAT2870_CORE
|
||||
config MFD_AT91_USART
|
||||
tristate "AT91 USART Driver"
|
||||
select MFD_CORE
|
||||
depends on ARCH_AT91 || COMPILE_TEST
|
||||
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
|
||||
@@ -214,7 +215,6 @@ config MFD_CROS_EC
|
||||
config MFD_CROS_EC_CHARDEV
|
||||
tristate "Chrome OS Embedded Controller userspace device interface"
|
||||
depends on MFD_CROS_EC
|
||||
select CROS_EC_CTL
|
||||
---help---
|
||||
This driver adds support to talk with the ChromeOS EC from userspace.
|
||||
|
||||
@@ -1872,6 +1872,22 @@ config MFD_STM32_TIMERS
|
||||
for PWM and IIO Timer. This driver allow to share the
|
||||
registers between the others drivers.
|
||||
|
||||
config MFD_STPMIC1
|
||||
tristate "Support for STPMIC1 PMIC"
|
||||
depends on (I2C=y && OF)
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
select MFD_CORE
|
||||
help
|
||||
Support for ST Microelectronics STPMIC1 PMIC. STPMIC1 has power on
|
||||
key, watchdog and regulator functionalities which are supported via
|
||||
the relevant subsystems. This driver provides core support for the
|
||||
STPMIC1. In order to use the actual functionaltiy of the device other
|
||||
drivers must be enabled.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called stpmic1.
|
||||
|
||||
menu "Multimedia Capabilities Port drivers"
|
||||
depends on ARCH_SA1100
|
||||
|
||||
|
@@ -233,6 +233,7 @@ obj-$(CONFIG_INTEL_SOC_PMIC_CHTDC_TI) += intel_soc_pmic_chtdc_ti.o
|
||||
obj-$(CONFIG_MFD_MT6397) += mt6397-core.o
|
||||
|
||||
obj-$(CONFIG_MFD_ALTERA_A10SR) += altera-a10sr.o
|
||||
obj-$(CONFIG_MFD_STPMIC1) += stpmic1.o
|
||||
obj-$(CONFIG_MFD_SUN4I_GPADC) += sun4i-gpadc.o
|
||||
|
||||
obj-$(CONFIG_MFD_STM32_LPTIMER) += stm32-lptimer.o
|
||||
|
@@ -261,7 +261,7 @@ static int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
|
||||
mutex_unlock(&ab8500->lock);
|
||||
dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
|
||||
|
||||
return ret;
|
||||
return (ret < 0) ? ret : 0;
|
||||
}
|
||||
|
||||
static int ab8500_get_register(struct device *dev, u8 bank,
|
||||
|
@@ -641,9 +641,9 @@ static const struct mfd_cell axp221_cells[] = {
|
||||
|
||||
static const struct mfd_cell axp223_cells[] = {
|
||||
{
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp22x_pek_resources),
|
||||
.resources = axp22x_pek_resources,
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp22x_pek_resources),
|
||||
.resources = axp22x_pek_resources,
|
||||
}, {
|
||||
.name = "axp22x-adc",
|
||||
.of_compatible = "x-powers,axp221-adc",
|
||||
@@ -651,7 +651,7 @@ static const struct mfd_cell axp223_cells[] = {
|
||||
.name = "axp20x-battery-power-supply",
|
||||
.of_compatible = "x-powers,axp221-battery-power-supply",
|
||||
}, {
|
||||
.name = "axp20x-regulator",
|
||||
.name = "axp20x-regulator",
|
||||
}, {
|
||||
.name = "axp20x-ac-power-supply",
|
||||
.of_compatible = "x-powers,axp221-ac-power-supply",
|
||||
@@ -667,9 +667,9 @@ static const struct mfd_cell axp223_cells[] = {
|
||||
|
||||
static const struct mfd_cell axp152_cells[] = {
|
||||
{
|
||||
.name = "axp20x-pek",
|
||||
.num_resources = ARRAY_SIZE(axp152_pek_resources),
|
||||
.resources = axp152_pek_resources,
|
||||
.name = "axp20x-pek",
|
||||
.num_resources = ARRAY_SIZE(axp152_pek_resources),
|
||||
.resources = axp152_pek_resources,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -698,87 +698,101 @@ static const struct resource axp288_charger_resources[] = {
|
||||
|
||||
static const struct mfd_cell axp288_cells[] = {
|
||||
{
|
||||
.name = "axp288_adc",
|
||||
.num_resources = ARRAY_SIZE(axp288_adc_resources),
|
||||
.resources = axp288_adc_resources,
|
||||
},
|
||||
{
|
||||
.name = "axp288_extcon",
|
||||
.num_resources = ARRAY_SIZE(axp288_extcon_resources),
|
||||
.resources = axp288_extcon_resources,
|
||||
},
|
||||
{
|
||||
.name = "axp288_charger",
|
||||
.num_resources = ARRAY_SIZE(axp288_charger_resources),
|
||||
.resources = axp288_charger_resources,
|
||||
},
|
||||
{
|
||||
.name = "axp288_fuel_gauge",
|
||||
.num_resources = ARRAY_SIZE(axp288_fuel_gauge_resources),
|
||||
.resources = axp288_fuel_gauge_resources,
|
||||
},
|
||||
{
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp288_power_button_resources),
|
||||
.resources = axp288_power_button_resources,
|
||||
},
|
||||
{
|
||||
.name = "axp288_pmic_acpi",
|
||||
.name = "axp288_adc",
|
||||
.num_resources = ARRAY_SIZE(axp288_adc_resources),
|
||||
.resources = axp288_adc_resources,
|
||||
}, {
|
||||
.name = "axp288_extcon",
|
||||
.num_resources = ARRAY_SIZE(axp288_extcon_resources),
|
||||
.resources = axp288_extcon_resources,
|
||||
}, {
|
||||
.name = "axp288_charger",
|
||||
.num_resources = ARRAY_SIZE(axp288_charger_resources),
|
||||
.resources = axp288_charger_resources,
|
||||
}, {
|
||||
.name = "axp288_fuel_gauge",
|
||||
.num_resources = ARRAY_SIZE(axp288_fuel_gauge_resources),
|
||||
.resources = axp288_fuel_gauge_resources,
|
||||
}, {
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp288_power_button_resources),
|
||||
.resources = axp288_power_button_resources,
|
||||
}, {
|
||||
.name = "axp288_pmic_acpi",
|
||||
},
|
||||
};
|
||||
|
||||
static const struct mfd_cell axp803_cells[] = {
|
||||
{
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp803_pek_resources),
|
||||
.resources = axp803_pek_resources,
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp803_pek_resources),
|
||||
.resources = axp803_pek_resources,
|
||||
}, {
|
||||
.name = "axp20x-gpio",
|
||||
.of_compatible = "x-powers,axp813-gpio",
|
||||
}, {
|
||||
.name = "axp813-adc",
|
||||
.of_compatible = "x-powers,axp813-adc",
|
||||
}, {
|
||||
.name = "axp20x-battery-power-supply",
|
||||
.of_compatible = "x-powers,axp813-battery-power-supply",
|
||||
}, {
|
||||
.name = "axp20x-ac-power-supply",
|
||||
.of_compatible = "x-powers,axp813-ac-power-supply",
|
||||
.num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
|
||||
.resources = axp20x_ac_power_supply_resources,
|
||||
},
|
||||
{ .name = "axp20x-regulator" },
|
||||
{ .name = "axp20x-regulator" },
|
||||
};
|
||||
|
||||
static const struct mfd_cell axp806_self_working_cells[] = {
|
||||
{
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp806_pek_resources),
|
||||
.resources = axp806_pek_resources,
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp806_pek_resources),
|
||||
.resources = axp806_pek_resources,
|
||||
},
|
||||
{ .name = "axp20x-regulator" },
|
||||
{ .name = "axp20x-regulator" },
|
||||
};
|
||||
|
||||
static const struct mfd_cell axp806_cells[] = {
|
||||
{
|
||||
.id = 2,
|
||||
.name = "axp20x-regulator",
|
||||
.id = 2,
|
||||
.name = "axp20x-regulator",
|
||||
},
|
||||
};
|
||||
|
||||
static const struct mfd_cell axp809_cells[] = {
|
||||
{
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp809_pek_resources),
|
||||
.resources = axp809_pek_resources,
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp809_pek_resources),
|
||||
.resources = axp809_pek_resources,
|
||||
}, {
|
||||
.id = 1,
|
||||
.name = "axp20x-regulator",
|
||||
.id = 1,
|
||||
.name = "axp20x-regulator",
|
||||
},
|
||||
};
|
||||
|
||||
static const struct mfd_cell axp813_cells[] = {
|
||||
{
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp803_pek_resources),
|
||||
.resources = axp803_pek_resources,
|
||||
.name = "axp221-pek",
|
||||
.num_resources = ARRAY_SIZE(axp803_pek_resources),
|
||||
.resources = axp803_pek_resources,
|
||||
}, {
|
||||
.name = "axp20x-regulator",
|
||||
.name = "axp20x-regulator",
|
||||
}, {
|
||||
.name = "axp20x-gpio",
|
||||
.of_compatible = "x-powers,axp813-gpio",
|
||||
.name = "axp20x-gpio",
|
||||
.of_compatible = "x-powers,axp813-gpio",
|
||||
}, {
|
||||
.name = "axp813-adc",
|
||||
.of_compatible = "x-powers,axp813-adc",
|
||||
.name = "axp813-adc",
|
||||
.of_compatible = "x-powers,axp813-adc",
|
||||
}, {
|
||||
.name = "axp20x-battery-power-supply",
|
||||
.of_compatible = "x-powers,axp813-battery-power-supply",
|
||||
}, {
|
||||
.name = "axp20x-ac-power-supply",
|
||||
.of_compatible = "x-powers,axp813-ac-power-supply",
|
||||
.num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
|
||||
.resources = axp20x_ac_power_supply_resources,
|
||||
},
|
||||
};
|
||||
|
||||
|
@@ -59,6 +59,7 @@ static const struct regmap_access_table bd9571mwv_writable_table = {
|
||||
};
|
||||
|
||||
static const struct regmap_range bd9571mwv_volatile_yes_ranges[] = {
|
||||
regmap_reg_range(BD9571MWV_DVFS_MONIVDAC, BD9571MWV_DVFS_MONIVDAC),
|
||||
regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN),
|
||||
regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INT),
|
||||
regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTREQ),
|
||||
|
@@ -129,8 +129,8 @@ int cros_ec_register(struct cros_ec_device *ec_dev)
|
||||
}
|
||||
}
|
||||
|
||||
err = mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO, &ec_cell, 1,
|
||||
NULL, ec_dev->irq, NULL);
|
||||
err = devm_mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO, &ec_cell,
|
||||
1, NULL, ec_dev->irq, NULL);
|
||||
if (err) {
|
||||
dev_err(dev,
|
||||
"Failed to register Embedded Controller subdevice %d\n",
|
||||
@@ -147,7 +147,7 @@ int cros_ec_register(struct cros_ec_device *ec_dev)
|
||||
* - the EC is responsive at init time (it is not true for a
|
||||
* sensor hub.
|
||||
*/
|
||||
err = mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO,
|
||||
err = devm_mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO,
|
||||
&ec_pd_cell, 1, NULL, ec_dev->irq, NULL);
|
||||
if (err) {
|
||||
dev_err(dev,
|
||||
@@ -181,14 +181,6 @@ int cros_ec_register(struct cros_ec_device *ec_dev)
|
||||
}
|
||||
EXPORT_SYMBOL(cros_ec_register);
|
||||
|
||||
int cros_ec_remove(struct cros_ec_device *ec_dev)
|
||||
{
|
||||
mfd_remove_devices(ec_dev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(cros_ec_remove);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
int cros_ec_suspend(struct cros_ec_device *ec_dev)
|
||||
{
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -34,17 +35,9 @@
|
||||
#define CROS_MAX_DEV 128
|
||||
static int ec_major;
|
||||
|
||||
static const struct attribute_group *cros_ec_groups[] = {
|
||||
&cros_ec_attr_group,
|
||||
&cros_ec_lightbar_attr_group,
|
||||
&cros_ec_vbc_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct class cros_class = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "chromeos",
|
||||
.dev_groups = cros_ec_groups,
|
||||
};
|
||||
|
||||
/* Basic communication */
|
||||
@@ -395,9 +388,20 @@ static const struct mfd_cell cros_usbpd_charger_cells[] = {
|
||||
{ .name = "cros-usbpd-charger" }
|
||||
};
|
||||
|
||||
static const struct mfd_cell cros_ec_platform_cells[] = {
|
||||
{ .name = "cros-ec-debugfs" },
|
||||
{ .name = "cros-ec-lightbar" },
|
||||
{ .name = "cros-ec-sysfs" },
|
||||
};
|
||||
|
||||
static const struct mfd_cell cros_ec_vbc_cells[] = {
|
||||
{ .name = "cros-ec-vbc" }
|
||||
};
|
||||
|
||||
static int ec_device_probe(struct platform_device *pdev)
|
||||
{
|
||||
int retval = -ENOMEM;
|
||||
struct device_node *node;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct cros_ec_platform *ec_platform = dev_get_platdata(dev);
|
||||
struct cros_ec_dev *ec = kzalloc(sizeof(*ec), GFP_KERNEL);
|
||||
@@ -470,9 +474,6 @@ static int ec_device_probe(struct platform_device *pdev)
|
||||
retval);
|
||||
}
|
||||
|
||||
/* Take control of the lightbar from the EC. */
|
||||
lb_manual_suspend_ctrl(ec, 1);
|
||||
|
||||
/* We can now add the sysfs class, we know which parameter to show */
|
||||
retval = cdev_device_add(&ec->cdev, &ec->class_dev);
|
||||
if (retval) {
|
||||
@@ -480,8 +481,26 @@ static int ec_device_probe(struct platform_device *pdev)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (cros_ec_debugfs_init(ec))
|
||||
dev_warn(dev, "failed to create debugfs directory\n");
|
||||
retval = mfd_add_devices(ec->dev, PLATFORM_DEVID_AUTO,
|
||||
cros_ec_platform_cells,
|
||||
ARRAY_SIZE(cros_ec_platform_cells),
|
||||
NULL, 0, NULL);
|
||||
if (retval)
|
||||
dev_warn(ec->dev,
|
||||
"failed to add cros-ec platform devices: %d\n",
|
||||
retval);
|
||||
|
||||
/* Check whether this EC instance has a VBC NVRAM */
|
||||
node = ec->ec_dev->dev->of_node;
|
||||
if (of_property_read_bool(node, "google,has-vbc-nvram")) {
|
||||
retval = mfd_add_devices(ec->dev, PLATFORM_DEVID_AUTO,
|
||||
cros_ec_vbc_cells,
|
||||
ARRAY_SIZE(cros_ec_vbc_cells),
|
||||
NULL, 0, NULL);
|
||||
if (retval)
|
||||
dev_warn(ec->dev, "failed to add VBC devices: %d\n",
|
||||
retval);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -494,68 +513,25 @@ static int ec_device_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct cros_ec_dev *ec = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
/* Let the EC take over the lightbar again. */
|
||||
lb_manual_suspend_ctrl(ec, 0);
|
||||
|
||||
cros_ec_debugfs_remove(ec);
|
||||
|
||||
mfd_remove_devices(ec->dev);
|
||||
cdev_del(&ec->cdev);
|
||||
device_unregister(&ec->class_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ec_device_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
struct cros_ec_dev *ec = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
/* Be sure to clear up debugfs delayed works */
|
||||
cros_ec_debugfs_remove(ec);
|
||||
}
|
||||
|
||||
static const struct platform_device_id cros_ec_id[] = {
|
||||
{ DRV_NAME, 0 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(platform, cros_ec_id);
|
||||
|
||||
static __maybe_unused int ec_device_suspend(struct device *dev)
|
||||
{
|
||||
struct cros_ec_dev *ec = dev_get_drvdata(dev);
|
||||
|
||||
cros_ec_debugfs_suspend(ec);
|
||||
|
||||
lb_suspend(ec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __maybe_unused int ec_device_resume(struct device *dev)
|
||||
{
|
||||
struct cros_ec_dev *ec = dev_get_drvdata(dev);
|
||||
|
||||
cros_ec_debugfs_resume(ec);
|
||||
|
||||
lb_resume(ec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops cros_ec_dev_pm_ops = {
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.suspend = ec_device_suspend,
|
||||
.resume = ec_device_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct platform_driver cros_ec_dev_driver = {
|
||||
.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,
|
||||
};
|
||||
|
||||
static int __init cros_ec_dev_init(void)
|
||||
|
@@ -44,10 +44,4 @@ struct cros_ec_readmem {
|
||||
#define CROS_EC_DEV_IOCXCMD _IOWR(CROS_EC_DEV_IOC, 0, struct cros_ec_command)
|
||||
#define CROS_EC_DEV_IOCRDMEM _IOWR(CROS_EC_DEV_IOC, 1, struct cros_ec_readmem)
|
||||
|
||||
/* Lightbar utilities */
|
||||
extern bool ec_has_lightbar(struct cros_ec_dev *ec);
|
||||
extern int lb_manual_suspend_ctrl(struct cros_ec_dev *ec, uint8_t enable);
|
||||
extern int lb_suspend(struct cros_ec_dev *ec);
|
||||
extern int lb_resume(struct cros_ec_dev *ec);
|
||||
|
||||
#endif /* _CROS_EC_DEV_H_ */
|
||||
|
@@ -2584,7 +2584,7 @@ static struct irq_chip prcmu_irq_chip = {
|
||||
.irq_unmask = prcmu_irq_unmask,
|
||||
};
|
||||
|
||||
static __init char *fw_project_name(u32 project)
|
||||
static char *fw_project_name(u32 project)
|
||||
{
|
||||
switch (project) {
|
||||
case PRCMU_FW_PROJECT_U8500:
|
||||
@@ -2732,7 +2732,7 @@ void __init db8500_prcmu_early_init(u32 phy_base, u32 size)
|
||||
INIT_WORK(&mb0_transfer.mask_work, prcmu_mask_work);
|
||||
}
|
||||
|
||||
static void __init init_prcm_registers(void)
|
||||
static void init_prcm_registers(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
|
@@ -82,11 +82,13 @@ static void exynos_lpass_enable(struct exynos_lpass *lpass)
|
||||
LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S);
|
||||
|
||||
regmap_write(lpass->top, SFR_LPASS_INTR_CPU_MASK,
|
||||
LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S);
|
||||
LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S |
|
||||
LPASS_INTR_UART);
|
||||
|
||||
exynos_lpass_core_sw_reset(lpass, LPASS_I2S_SW_RESET);
|
||||
exynos_lpass_core_sw_reset(lpass, LPASS_DMA_SW_RESET);
|
||||
exynos_lpass_core_sw_reset(lpass, LPASS_MEM_SW_RESET);
|
||||
exynos_lpass_core_sw_reset(lpass, LPASS_UART_SW_RESET);
|
||||
}
|
||||
|
||||
static void exynos_lpass_disable(struct exynos_lpass *lpass)
|
||||
|
@@ -15,6 +15,7 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
@@ -155,7 +156,7 @@ static int madera_wait_for_boot(struct madera *madera)
|
||||
usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2,
|
||||
MADERA_BOOT_POLL_INTERVAL_USEC);
|
||||
regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
|
||||
};
|
||||
}
|
||||
|
||||
if (!(val & MADERA_BOOT_DONE_STS1)) {
|
||||
dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n");
|
||||
@@ -357,6 +358,8 @@ int madera_dev_init(struct madera *madera)
|
||||
|
||||
dev_set_drvdata(madera->dev, madera);
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier);
|
||||
mutex_init(&madera->dapm_ptr_lock);
|
||||
|
||||
madera_set_micbias_info(madera);
|
||||
|
||||
/*
|
||||
|
@@ -280,7 +280,7 @@ static int max77620_config_fps(struct max77620_chip *chip,
|
||||
|
||||
for (fps_id = 0; fps_id < MAX77620_FPS_COUNT; fps_id++) {
|
||||
sprintf(fps_name, "fps%d", fps_id);
|
||||
if (!strcmp(fps_np->name, fps_name))
|
||||
if (of_node_name_eq(fps_np, fps_name))
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -274,7 +274,9 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
|
||||
|
||||
mc13xxx->adcflags |= MC13XXX_ADC_WORKING;
|
||||
|
||||
mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
|
||||
ret = mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2 |
|
||||
MC13XXX_ADC0_CHRGRAWDIV;
|
||||
|
@@ -329,8 +329,7 @@ static int mt6397_probe(struct platform_device *pdev)
|
||||
|
||||
default:
|
||||
dev_err(&pdev->dev, "unsupported chip: %d\n", id);
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
|
@@ -638,6 +638,10 @@ static int qcom_rpm_probe(struct platform_device *pdev)
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
writel(fw_version[0], RPM_CTRL_REG(rpm, 0));
|
||||
writel(fw_version[1], RPM_CTRL_REG(rpm, 1));
|
||||
writel(fw_version[2], RPM_CTRL_REG(rpm, 2));
|
||||
|
||||
dev_info(&pdev->dev, "RPM firmware %u.%u.%u\n", fw_version[0],
|
||||
fw_version[1],
|
||||
fw_version[2]);
|
||||
|
@@ -109,7 +109,7 @@ struct rave_sp_reply {
|
||||
/**
|
||||
* struct rave_sp_checksum - Variant specific checksum implementation details
|
||||
*
|
||||
* @length: Caculated checksum length
|
||||
* @length: Calculated checksum length
|
||||
* @subroutine: Utilized checksum algorithm implementation
|
||||
*/
|
||||
struct rave_sp_checksum {
|
||||
|
@@ -1358,17 +1358,17 @@ static void stmpe_of_probe(struct stmpe_platform_data *pdata,
|
||||
pdata->autosleep = (pdata->autosleep_timeout) ? true : false;
|
||||
|
||||
for_each_child_of_node(np, child) {
|
||||
if (!strcmp(child->name, "stmpe_gpio")) {
|
||||
if (of_node_name_eq(child, "stmpe_gpio")) {
|
||||
pdata->blocks |= STMPE_BLOCK_GPIO;
|
||||
} else if (!strcmp(child->name, "stmpe_keypad")) {
|
||||
} else if (of_node_name_eq(child, "stmpe_keypad")) {
|
||||
pdata->blocks |= STMPE_BLOCK_KEYPAD;
|
||||
} else if (!strcmp(child->name, "stmpe_touchscreen")) {
|
||||
} else if (of_node_name_eq(child, "stmpe_touchscreen")) {
|
||||
pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN;
|
||||
} else if (!strcmp(child->name, "stmpe_adc")) {
|
||||
} else if (of_node_name_eq(child, "stmpe_adc")) {
|
||||
pdata->blocks |= STMPE_BLOCK_ADC;
|
||||
} else if (!strcmp(child->name, "stmpe_pwm")) {
|
||||
} else if (of_node_name_eq(child, "stmpe_pwm")) {
|
||||
pdata->blocks |= STMPE_BLOCK_PWM;
|
||||
} else if (!strcmp(child->name, "stmpe_rotator")) {
|
||||
} else if (of_node_name_eq(child, "stmpe_rotator")) {
|
||||
pdata->blocks |= STMPE_BLOCK_ROTATOR;
|
||||
}
|
||||
}
|
||||
|
213
drivers/mfd/stpmic1.c
普通文件
213
drivers/mfd/stpmic1.c
普通文件
@@ -0,0 +1,213 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Copyright (C) STMicroelectronics 2018
|
||||
// Author: Pascal Paillet <p.paillet@st.com>
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/stpmic1.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pm_wakeirq.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#include <dt-bindings/mfd/st,stpmic1.h>
|
||||
|
||||
#define STPMIC1_MAIN_IRQ 0
|
||||
|
||||
static const struct regmap_range stpmic1_readable_ranges[] = {
|
||||
regmap_reg_range(TURN_ON_SR, VERSION_SR),
|
||||
regmap_reg_range(SWOFF_PWRCTRL_CR, LDO6_STDBY_CR),
|
||||
regmap_reg_range(BST_SW_CR, BST_SW_CR),
|
||||
regmap_reg_range(INT_PENDING_R1, INT_PENDING_R4),
|
||||
regmap_reg_range(INT_CLEAR_R1, INT_CLEAR_R4),
|
||||
regmap_reg_range(INT_MASK_R1, INT_MASK_R4),
|
||||
regmap_reg_range(INT_SET_MASK_R1, INT_SET_MASK_R4),
|
||||
regmap_reg_range(INT_CLEAR_MASK_R1, INT_CLEAR_MASK_R4),
|
||||
regmap_reg_range(INT_SRC_R1, INT_SRC_R1),
|
||||
};
|
||||
|
||||
static const struct regmap_range stpmic1_writeable_ranges[] = {
|
||||
regmap_reg_range(SWOFF_PWRCTRL_CR, LDO6_STDBY_CR),
|
||||
regmap_reg_range(BST_SW_CR, BST_SW_CR),
|
||||
regmap_reg_range(INT_CLEAR_R1, INT_CLEAR_R4),
|
||||
regmap_reg_range(INT_SET_MASK_R1, INT_SET_MASK_R4),
|
||||
regmap_reg_range(INT_CLEAR_MASK_R1, INT_CLEAR_MASK_R4),
|
||||
};
|
||||
|
||||
static const struct regmap_range stpmic1_volatile_ranges[] = {
|
||||
regmap_reg_range(TURN_ON_SR, VERSION_SR),
|
||||
regmap_reg_range(WCHDG_CR, WCHDG_CR),
|
||||
regmap_reg_range(INT_PENDING_R1, INT_PENDING_R4),
|
||||
regmap_reg_range(INT_SRC_R1, INT_SRC_R4),
|
||||
};
|
||||
|
||||
static const struct regmap_access_table stpmic1_readable_table = {
|
||||
.yes_ranges = stpmic1_readable_ranges,
|
||||
.n_yes_ranges = ARRAY_SIZE(stpmic1_readable_ranges),
|
||||
};
|
||||
|
||||
static const struct regmap_access_table stpmic1_writeable_table = {
|
||||
.yes_ranges = stpmic1_writeable_ranges,
|
||||
.n_yes_ranges = ARRAY_SIZE(stpmic1_writeable_ranges),
|
||||
};
|
||||
|
||||
static const struct regmap_access_table stpmic1_volatile_table = {
|
||||
.yes_ranges = stpmic1_volatile_ranges,
|
||||
.n_yes_ranges = ARRAY_SIZE(stpmic1_volatile_ranges),
|
||||
};
|
||||
|
||||
const struct regmap_config stpmic1_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
.max_register = PMIC_MAX_REGISTER_ADDRESS,
|
||||
.rd_table = &stpmic1_readable_table,
|
||||
.wr_table = &stpmic1_writeable_table,
|
||||
.volatile_table = &stpmic1_volatile_table,
|
||||
};
|
||||
|
||||
static const struct regmap_irq stpmic1_irqs[] = {
|
||||
REGMAP_IRQ_REG(IT_PONKEY_F, 0, 0x01),
|
||||
REGMAP_IRQ_REG(IT_PONKEY_R, 0, 0x02),
|
||||
REGMAP_IRQ_REG(IT_WAKEUP_F, 0, 0x04),
|
||||
REGMAP_IRQ_REG(IT_WAKEUP_R, 0, 0x08),
|
||||
REGMAP_IRQ_REG(IT_VBUS_OTG_F, 0, 0x10),
|
||||
REGMAP_IRQ_REG(IT_VBUS_OTG_R, 0, 0x20),
|
||||
REGMAP_IRQ_REG(IT_SWOUT_F, 0, 0x40),
|
||||
REGMAP_IRQ_REG(IT_SWOUT_R, 0, 0x80),
|
||||
|
||||
REGMAP_IRQ_REG(IT_CURLIM_BUCK1, 1, 0x01),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_BUCK2, 1, 0x02),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_BUCK3, 1, 0x04),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_BUCK4, 1, 0x08),
|
||||
REGMAP_IRQ_REG(IT_OCP_OTG, 1, 0x10),
|
||||
REGMAP_IRQ_REG(IT_OCP_SWOUT, 1, 0x20),
|
||||
REGMAP_IRQ_REG(IT_OCP_BOOST, 1, 0x40),
|
||||
REGMAP_IRQ_REG(IT_OVP_BOOST, 1, 0x80),
|
||||
|
||||
REGMAP_IRQ_REG(IT_CURLIM_LDO1, 2, 0x01),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_LDO2, 2, 0x02),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_LDO3, 2, 0x04),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_LDO4, 2, 0x08),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_LDO5, 2, 0x10),
|
||||
REGMAP_IRQ_REG(IT_CURLIM_LDO6, 2, 0x20),
|
||||
REGMAP_IRQ_REG(IT_SHORT_SWOTG, 2, 0x40),
|
||||
REGMAP_IRQ_REG(IT_SHORT_SWOUT, 2, 0x80),
|
||||
|
||||
REGMAP_IRQ_REG(IT_TWARN_F, 3, 0x01),
|
||||
REGMAP_IRQ_REG(IT_TWARN_R, 3, 0x02),
|
||||
REGMAP_IRQ_REG(IT_VINLOW_F, 3, 0x04),
|
||||
REGMAP_IRQ_REG(IT_VINLOW_R, 3, 0x08),
|
||||
REGMAP_IRQ_REG(IT_SWIN_F, 3, 0x40),
|
||||
REGMAP_IRQ_REG(IT_SWIN_R, 3, 0x80),
|
||||
};
|
||||
|
||||
static const struct regmap_irq_chip stpmic1_regmap_irq_chip = {
|
||||
.name = "pmic_irq",
|
||||
.status_base = INT_PENDING_R1,
|
||||
.mask_base = INT_CLEAR_MASK_R1,
|
||||
.unmask_base = INT_SET_MASK_R1,
|
||||
.ack_base = INT_CLEAR_R1,
|
||||
.num_regs = STPMIC1_PMIC_NUM_IRQ_REGS,
|
||||
.irqs = stpmic1_irqs,
|
||||
.num_irqs = ARRAY_SIZE(stpmic1_irqs),
|
||||
};
|
||||
|
||||
static int stpmic1_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct stpmic1 *ddata;
|
||||
struct device *dev = &i2c->dev;
|
||||
int ret;
|
||||
struct device_node *np = dev->of_node;
|
||||
u32 reg;
|
||||
|
||||
ddata = devm_kzalloc(dev, sizeof(struct stpmic1), GFP_KERNEL);
|
||||
if (!ddata)
|
||||
return -ENOMEM;
|
||||
|
||||
i2c_set_clientdata(i2c, ddata);
|
||||
ddata->dev = dev;
|
||||
|
||||
ddata->regmap = devm_regmap_init_i2c(i2c, &stpmic1_regmap_config);
|
||||
if (IS_ERR(ddata->regmap))
|
||||
return PTR_ERR(ddata->regmap);
|
||||
|
||||
ddata->irq = of_irq_get(np, STPMIC1_MAIN_IRQ);
|
||||
if (ddata->irq < 0) {
|
||||
dev_err(dev, "Failed to get main IRQ: %d\n", ddata->irq);
|
||||
return ddata->irq;
|
||||
}
|
||||
|
||||
ret = regmap_read(ddata->regmap, VERSION_SR, ®);
|
||||
if (ret) {
|
||||
dev_err(dev, "Unable to read PMIC version\n");
|
||||
return ret;
|
||||
}
|
||||
dev_info(dev, "PMIC Chip Version: 0x%x\n", reg);
|
||||
|
||||
/* Initialize PMIC IRQ Chip & associated IRQ domains */
|
||||
ret = devm_regmap_add_irq_chip(dev, ddata->regmap, ddata->irq,
|
||||
IRQF_ONESHOT | IRQF_SHARED,
|
||||
0, &stpmic1_regmap_irq_chip,
|
||||
&ddata->irq_data);
|
||||
if (ret) {
|
||||
dev_err(dev, "IRQ Chip registration failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return devm_of_platform_populate(dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int stpmic1_suspend(struct device *dev)
|
||||
{
|
||||
struct i2c_client *i2c = to_i2c_client(dev);
|
||||
struct stpmic1 *pmic_dev = i2c_get_clientdata(i2c);
|
||||
|
||||
disable_irq(pmic_dev->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stpmic1_resume(struct device *dev)
|
||||
{
|
||||
struct i2c_client *i2c = to_i2c_client(dev);
|
||||
struct stpmic1 *pmic_dev = i2c_get_clientdata(i2c);
|
||||
int ret;
|
||||
|
||||
ret = regcache_sync(pmic_dev->regmap);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
enable_irq(pmic_dev->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(stpmic1_pm, stpmic1_suspend, stpmic1_resume);
|
||||
|
||||
static const struct of_device_id stpmic1_of_match[] = {
|
||||
{ .compatible = "st,stpmic1", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, stpmic1_of_match);
|
||||
|
||||
static struct i2c_driver stpmic1_driver = {
|
||||
.driver = {
|
||||
.name = "stpmic1",
|
||||
.of_match_table = of_match_ptr(stpmic1_of_match),
|
||||
.pm = &stpmic1_pm,
|
||||
},
|
||||
.probe = stpmic1_probe,
|
||||
};
|
||||
|
||||
module_i2c_driver(stpmic1_driver);
|
||||
|
||||
MODULE_DESCRIPTION("STPMIC1 PMIC Driver");
|
||||
MODULE_AUTHOR("Pascal Paillet <p.paillet@st.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
@@ -264,8 +264,9 @@ static int ti_tscadc_probe(struct platform_device *pdev)
|
||||
cell->pdata_size = sizeof(tscadc);
|
||||
}
|
||||
|
||||
err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells,
|
||||
tscadc->used_cells, NULL, 0, NULL);
|
||||
err = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,
|
||||
tscadc->cells, tscadc->used_cells, NULL,
|
||||
0, NULL);
|
||||
if (err < 0)
|
||||
goto err_disable_clk;
|
||||
|
||||
|
@@ -235,9 +235,9 @@ static int tps65218_probe(struct i2c_client *client,
|
||||
|
||||
mutex_init(&tps->tps_lock);
|
||||
|
||||
ret = regmap_add_irq_chip(tps->regmap, tps->irq,
|
||||
IRQF_ONESHOT, 0, &tps65218_irq_chip,
|
||||
&tps->irq_data);
|
||||
ret = devm_regmap_add_irq_chip(&client->dev, tps->regmap, tps->irq,
|
||||
IRQF_ONESHOT, 0, &tps65218_irq_chip,
|
||||
&tps->irq_data);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -253,26 +253,9 @@ static int tps65218_probe(struct i2c_client *client,
|
||||
ARRAY_SIZE(tps65218_cells), NULL, 0,
|
||||
regmap_irq_get_domain(tps->irq_data));
|
||||
|
||||
if (ret < 0)
|
||||
goto err_irq;
|
||||
|
||||
return 0;
|
||||
|
||||
err_irq:
|
||||
regmap_del_irq_chip(tps->irq, tps->irq_data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tps65218_remove(struct i2c_client *client)
|
||||
{
|
||||
struct tps65218 *tps = i2c_get_clientdata(client);
|
||||
|
||||
regmap_del_irq_chip(tps->irq, tps->irq_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id tps65218_id_table[] = {
|
||||
{ "tps65218", TPS65218 },
|
||||
{ },
|
||||
@@ -285,7 +268,6 @@ static struct i2c_driver tps65218_driver = {
|
||||
.of_match_table = of_tps65218_match_table,
|
||||
},
|
||||
.probe = tps65218_probe,
|
||||
.remove = tps65218_remove,
|
||||
.id_table = tps65218_id_table,
|
||||
};
|
||||
|
||||
|
@@ -592,6 +592,29 @@ static int tps6586x_i2c_remove(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused tps6586x_i2c_suspend(struct device *dev)
|
||||
{
|
||||
struct tps6586x *tps6586x = dev_get_drvdata(dev);
|
||||
|
||||
if (tps6586x->client->irq)
|
||||
disable_irq(tps6586x->client->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused tps6586x_i2c_resume(struct device *dev)
|
||||
{
|
||||
struct tps6586x *tps6586x = dev_get_drvdata(dev);
|
||||
|
||||
if (tps6586x->client->irq)
|
||||
enable_irq(tps6586x->client->irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(tps6586x_pm_ops, tps6586x_i2c_suspend,
|
||||
tps6586x_i2c_resume);
|
||||
|
||||
static const struct i2c_device_id tps6586x_id_table[] = {
|
||||
{ "tps6586x", 0 },
|
||||
{ },
|
||||
@@ -602,6 +625,7 @@ static struct i2c_driver tps6586x_driver = {
|
||||
.driver = {
|
||||
.name = "tps6586x",
|
||||
.of_match_table = of_match_ptr(tps6586x_of_match),
|
||||
.pm = &tps6586x_pm_ops,
|
||||
},
|
||||
.probe = tps6586x_i2c_probe,
|
||||
.remove = tps6586x_i2c_remove,
|
||||
|
@@ -979,7 +979,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base,
|
||||
* letting it generate the right frequencies for USB, MADC, and
|
||||
* other purposes.
|
||||
*/
|
||||
static inline int __init protect_pm_master(void)
|
||||
static inline int protect_pm_master(void)
|
||||
{
|
||||
int e = 0;
|
||||
|
||||
@@ -988,7 +988,7 @@ static inline int __init protect_pm_master(void)
|
||||
return e;
|
||||
}
|
||||
|
||||
static inline int __init unprotect_pm_master(void)
|
||||
static inline int unprotect_pm_master(void)
|
||||
{
|
||||
int e = 0;
|
||||
|
||||
|
@@ -1618,6 +1618,7 @@ static const struct reg_default wm5110_reg_default[] = {
|
||||
{ 0x00000ECD, 0x0000 }, /* R3789 - HPLPF4_2 */
|
||||
{ 0x00000EE0, 0x0000 }, /* R3808 - ASRC_ENABLE */
|
||||
{ 0x00000EE2, 0x0000 }, /* R3810 - ASRC_RATE1 */
|
||||
{ 0x00000EE3, 0x4000 }, /* R3811 - ASRC_RATE2 */
|
||||
{ 0x00000EF0, 0x0000 }, /* R3824 - ISRC 1 CTRL 1 */
|
||||
{ 0x00000EF1, 0x0000 }, /* R3825 - ISRC 1 CTRL 2 */
|
||||
{ 0x00000EF2, 0x0000 }, /* R3826 - ISRC 1 CTRL 3 */
|
||||
@@ -2869,6 +2870,7 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
|
||||
case ARIZONA_ASRC_ENABLE:
|
||||
case ARIZONA_ASRC_STATUS:
|
||||
case ARIZONA_ASRC_RATE1:
|
||||
case ARIZONA_ASRC_RATE2:
|
||||
case ARIZONA_ISRC_1_CTRL_1:
|
||||
case ARIZONA_ISRC_1_CTRL_2:
|
||||
case ARIZONA_ISRC_1_CTRL_3:
|
||||
|
在新工单中引用
屏蔽一个用户