Loading Documentation/devicetree/bindings/mfd/s2mpa01.txt 0 → 100644 +90 −0 Original line number Diff line number Diff line * Samsung S2MPA01 Voltage and Current Regulator The Samsung S2MPA01 is a multi-function device which includes high efficiency buck converters including Dual-Phase buck converter, various LDOs, and an RTC. It is interfaced to the host controller using an I2C interface. Each sub-block is addressed by the host system using different I2C slave addresses. Required properties: - compatible: Should be "samsung,s2mpa01-pmic". - reg: Specifies the I2C slave address of the PMIC block. It should be 0x66. Optional properties: - interrupt-parent: Specifies the phandle of the interrupt controller to which the interrupts from s2mpa01 are delivered to. - interrupts: An interrupt specifier for the sole interrupt generated by the device. Optional nodes: - regulators: The regulators of s2mpa01 that have to be instantiated should be included in a sub-node named 'regulators'. Regulator nodes and constraints included in this sub-node use the standard regulator bindings which are documented elsewhere. Properties for BUCK regulator nodes: - regulator-ramp-delay: ramp delay in uV/us. May be 6250, 12500 (default), 25000, or 50000. May be 0 for disabling the ramp delay on BUCK{1,2,3,4}. In the absence of the regulator-ramp-delay property, the default ramp delay will be used. NOTE: Some BUCKs share the ramp rate setting i.e. same ramp value will be set for a particular group of BUCKs. So provide same regulator-ramp-delay=<value>. The following BUCKs share ramp settings: * 1 and 6 * 2 and 4 * 8, 9, and 10 The following are the names of the regulators that the s2mpa01 PMIC block supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number as per the datasheet of s2mpa01. - LDOn - valid values for n are 1 to 26 - Example: LDO1, LD02, LDO26 - BUCKn - valid values for n are 1 to 10. - Example: BUCK1, BUCK2, BUCK9 Example: s2mpa01_pmic@66 { compatible = "samsung,s2mpa01-pmic"; reg = <0x66>; regulators { ldo1_reg: LDO1 { regulator-name = "VDD_ALIVE"; regulator-min-microvolt = <1000000>; regulator-max-microvolt = <1000000>; }; ldo2_reg: LDO2 { regulator-name = "VDDQ_MMC2"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-always-on; }; buck1_reg: BUCK1 { regulator-name = "vdd_mif"; regulator-min-microvolt = <950000>; regulator-max-microvolt = <1350000>; regulator-always-on; regulator-boot-on; }; buck2_reg: BUCK2 { regulator-name = "vdd_arm"; regulator-min-microvolt = <950000>; regulator-max-microvolt = <1350000>; regulator-always-on; regulator-boot-on; regulator-ramp-delay = <50000>; }; }; }; drivers/mfd/sec-core.c +102 −10 Original line number Diff line number Diff line Loading @@ -26,7 +26,9 @@ #include <linux/mfd/samsung/core.h> #include <linux/mfd/samsung/irq.h> #include <linux/mfd/samsung/rtc.h> #include <linux/mfd/samsung/s2mpa01.h> #include <linux/mfd/samsung/s2mps11.h> #include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s5m8763.h> #include <linux/mfd/samsung/s5m8767.h> #include <linux/regmap.h> Loading Loading @@ -69,18 +71,53 @@ static const struct mfd_cell s2mps11_devs[] = { } }; static const struct mfd_cell s2mps14_devs[] = { { .name = "s2mps14-pmic", }, { .name = "s2mps14-rtc", }, { .name = "s2mps14-clk", } }; static const struct mfd_cell s2mpa01_devs[] = { { .name = "s2mpa01-pmic", }, }; #ifdef CONFIG_OF static struct of_device_id sec_dt_match[] = { { .compatible = "samsung,s5m8767-pmic", .data = (void *)S5M8767X, }, { .compatible = "samsung,s2mps11-pmic", }, { .compatible = "samsung,s2mps11-pmic", .data = (void *)S2MPS11X, }, { .compatible = "samsung,s2mps14-pmic", .data = (void *)S2MPS14X, }, { .compatible = "samsung,s2mpa01-pmic", .data = (void *)S2MPA01, }, { /* Sentinel */ }, {}, }; #endif static bool s2mpa01_volatile(struct device *dev, unsigned int reg) { switch (reg) { case S2MPA01_REG_INT1M: case S2MPA01_REG_INT2M: case S2MPA01_REG_INT3M: return false; default: return true; } } static bool s2mps11_volatile(struct device *dev, unsigned int reg) { switch (reg) { Loading Loading @@ -111,6 +148,15 @@ static const struct regmap_config sec_regmap_config = { .val_bits = 8, }; static const struct regmap_config s2mpa01_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = S2MPA01_REG_LDO_OVCB4, .volatile_reg = s2mpa01_volatile, .cache_type = REGCACHE_FLAT, }; static const struct regmap_config s2mps11_regmap_config = { .reg_bits = 8, .val_bits = 8, Loading @@ -120,6 +166,15 @@ static const struct regmap_config s2mps11_regmap_config = { .cache_type = REGCACHE_FLAT, }; static const struct regmap_config s2mps14_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = S2MPS14_REG_LDODSCH3, .volatile_reg = s2mps11_volatile, .cache_type = REGCACHE_FLAT, }; static const struct regmap_config s5m8763_regmap_config = { .reg_bits = 8, .val_bits = 8, Loading @@ -138,9 +193,18 @@ static const struct regmap_config s5m8767_regmap_config = { .cache_type = REGCACHE_FLAT, }; static const struct regmap_config sec_rtc_regmap_config = { static const struct regmap_config s5m_rtc_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = SEC_RTC_REG_MAX, }; static const struct regmap_config s2mps14_rtc_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = S2MPS_RTC_REG_MAX, }; #ifdef CONFIG_OF Loading Loading @@ -180,24 +244,24 @@ static struct sec_platform_data *sec_pmic_i2c_parse_dt_pdata( } #endif static inline int sec_i2c_get_driver_data(struct i2c_client *i2c, static inline unsigned long sec_i2c_get_driver_data(struct i2c_client *i2c, const struct i2c_device_id *id) { #ifdef CONFIG_OF if (i2c->dev.of_node) { const struct of_device_id *match; match = of_match_node(sec_dt_match, i2c->dev.of_node); return (int)match->data; return (unsigned long)match->data; } #endif return (int)id->driver_data; return id->driver_data; } static int sec_pmic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev); const struct regmap_config *regmap; const struct regmap_config *regmap, *regmap_rtc; struct sec_pmic_dev *sec_pmic; int ret; Loading Loading @@ -229,17 +293,34 @@ static int sec_pmic_probe(struct i2c_client *i2c, } switch (sec_pmic->device_type) { case S2MPA01: regmap = &s2mpa01_regmap_config; break; case S2MPS11X: regmap = &s2mps11_regmap_config; /* * The rtc-s5m driver does not support S2MPS11 and there * is no mfd_cell for S2MPS11 RTC device. * However we must pass something to devm_regmap_init_i2c() * so use S5M-like regmap config even though it wouldn't work. */ regmap_rtc = &s5m_rtc_regmap_config; break; case S2MPS14X: regmap = &s2mps14_regmap_config; regmap_rtc = &s2mps14_rtc_regmap_config; break; case S5M8763X: regmap = &s5m8763_regmap_config; regmap_rtc = &s5m_rtc_regmap_config; break; case S5M8767X: regmap = &s5m8767_regmap_config; regmap_rtc = &s5m_rtc_regmap_config; break; default: regmap = &sec_regmap_config; regmap_rtc = &s5m_rtc_regmap_config; break; } Loading @@ -252,10 +333,13 @@ static int sec_pmic_probe(struct i2c_client *i2c, } sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); if (!sec_pmic->rtc) { dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n"); return -ENODEV; } i2c_set_clientdata(sec_pmic->rtc, sec_pmic); sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc, &sec_rtc_regmap_config); sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc, regmap_rtc); if (IS_ERR(sec_pmic->regmap_rtc)) { ret = PTR_ERR(sec_pmic->regmap_rtc); dev_err(&i2c->dev, "Failed to allocate RTC register map: %d\n", Loading Loading @@ -283,10 +367,18 @@ static int sec_pmic_probe(struct i2c_client *i2c, ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL); break; case S2MPA01: ret = mfd_add_devices(sec_pmic->dev, -1, s2mpa01_devs, ARRAY_SIZE(s2mpa01_devs), NULL, 0, NULL); break; case S2MPS11X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL); break; case S2MPS14X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps14_devs, ARRAY_SIZE(s2mps14_devs), NULL, 0, NULL); break; default: /* If this happens the probe function is problem */ BUG(); Loading drivers/mfd/sec-irq.c +92 −5 Original line number Diff line number Diff line /* * sec-irq.c * * Copyright (c) 2011 Samsung Electronics Co., Ltd * 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 Loading @@ -19,6 +19,7 @@ #include <linux/mfd/samsung/core.h> #include <linux/mfd/samsung/irq.h> #include <linux/mfd/samsung/s2mps11.h> #include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s5m8763.h> #include <linux/mfd/samsung/s5m8767.h> Loading Loading @@ -59,13 +60,13 @@ static const struct regmap_irq s2mps11_irqs[] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTC60S_MASK, }, [S2MPS11_IRQ_RTCA1] = { [S2MPS11_IRQ_RTCA0] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA1_MASK, .mask = S2MPS11_IRQ_RTCA0_MASK, }, [S2MPS11_IRQ_RTCA2] = { [S2MPS11_IRQ_RTCA1] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA2_MASK, .mask = S2MPS11_IRQ_RTCA1_MASK, }, [S2MPS11_IRQ_SMPL] = { .reg_offset = 1, Loading @@ -89,6 +90,76 @@ static const struct regmap_irq s2mps11_irqs[] = { }, }; static const struct regmap_irq s2mps14_irqs[] = { [S2MPS14_IRQ_PWRONF] = { .reg_offset = 0, .mask = S2MPS11_IRQ_PWRONF_MASK, }, [S2MPS14_IRQ_PWRONR] = { .reg_offset = 0, .mask = S2MPS11_IRQ_PWRONR_MASK, }, [S2MPS14_IRQ_JIGONBF] = { .reg_offset = 0, .mask = S2MPS11_IRQ_JIGONBF_MASK, }, [S2MPS14_IRQ_JIGONBR] = { .reg_offset = 0, .mask = S2MPS11_IRQ_JIGONBR_MASK, }, [S2MPS14_IRQ_ACOKBF] = { .reg_offset = 0, .mask = S2MPS11_IRQ_ACOKBF_MASK, }, [S2MPS14_IRQ_ACOKBR] = { .reg_offset = 0, .mask = S2MPS11_IRQ_ACOKBR_MASK, }, [S2MPS14_IRQ_PWRON1S] = { .reg_offset = 0, .mask = S2MPS11_IRQ_PWRON1S_MASK, }, [S2MPS14_IRQ_MRB] = { .reg_offset = 0, .mask = S2MPS11_IRQ_MRB_MASK, }, [S2MPS14_IRQ_RTC60S] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTC60S_MASK, }, [S2MPS14_IRQ_RTCA1] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA1_MASK, }, [S2MPS14_IRQ_RTCA0] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA0_MASK, }, [S2MPS14_IRQ_SMPL] = { .reg_offset = 1, .mask = S2MPS11_IRQ_SMPL_MASK, }, [S2MPS14_IRQ_RTC1S] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTC1S_MASK, }, [S2MPS14_IRQ_WTSR] = { .reg_offset = 1, .mask = S2MPS11_IRQ_WTSR_MASK, }, [S2MPS14_IRQ_INT120C] = { .reg_offset = 2, .mask = S2MPS11_IRQ_INT120C_MASK, }, [S2MPS14_IRQ_INT140C] = { .reg_offset = 2, .mask = S2MPS11_IRQ_INT140C_MASK, }, [S2MPS14_IRQ_TSD] = { .reg_offset = 2, .mask = S2MPS14_IRQ_TSD_MASK, }, }; static const struct regmap_irq s5m8767_irqs[] = { [S5M8767_IRQ_PWRR] = { Loading Loading @@ -246,6 +317,16 @@ static const struct regmap_irq_chip s2mps11_irq_chip = { .ack_base = S2MPS11_REG_INT1, }; static const struct regmap_irq_chip s2mps14_irq_chip = { .name = "s2mps14", .irqs = s2mps14_irqs, .num_irqs = ARRAY_SIZE(s2mps14_irqs), .num_regs = 3, .status_base = S2MPS14_REG_INT1, .mask_base = S2MPS14_REG_INT1M, .ack_base = S2MPS14_REG_INT1, }; static const struct regmap_irq_chip s5m8767_irq_chip = { .name = "s5m8767", .irqs = s5m8767_irqs, Loading Loading @@ -297,6 +378,12 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic) sec_pmic->irq_base, &s2mps11_irq_chip, &sec_pmic->irq_data); break; case S2MPS14X: ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, sec_pmic->irq_base, &s2mps14_irq_chip, &sec_pmic->irq_data); break; default: dev_err(sec_pmic->dev, "Unknown device type %d\n", sec_pmic->device_type); Loading drivers/regulator/Kconfig +7 −0 Original line number Diff line number Diff line Loading @@ -416,6 +416,13 @@ config REGULATOR_RC5T583 through regulator interface. The device supports multiple DCDC/LDO outputs which can be controlled by i2c communication. config REGULATOR_S2MPA01 tristate "Samsung S2MPA01 voltage regulator" depends on MFD_SEC_CORE help This driver controls Samsung S2MPA01 voltage output regulator via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. config REGULATOR_S2MPS11 tristate "Samsung S2MPS11 voltage regulator" depends on MFD_SEC_CORE Loading drivers/regulator/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ obj-$(CONFIG_REGULATOR_TPS51632) += tps51632-regulator.o obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o obj-$(CONFIG_REGULATOR_RC5T583) += rc5t583-regulator.o obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o obj-$(CONFIG_REGULATOR_S2MPS11) += s2mps11.o obj-$(CONFIG_REGULATOR_S5M8767) += s5m8767.o obj-$(CONFIG_REGULATOR_STW481X_VMMC) += stw481x-vmmc.o Loading Loading
Documentation/devicetree/bindings/mfd/s2mpa01.txt 0 → 100644 +90 −0 Original line number Diff line number Diff line * Samsung S2MPA01 Voltage and Current Regulator The Samsung S2MPA01 is a multi-function device which includes high efficiency buck converters including Dual-Phase buck converter, various LDOs, and an RTC. It is interfaced to the host controller using an I2C interface. Each sub-block is addressed by the host system using different I2C slave addresses. Required properties: - compatible: Should be "samsung,s2mpa01-pmic". - reg: Specifies the I2C slave address of the PMIC block. It should be 0x66. Optional properties: - interrupt-parent: Specifies the phandle of the interrupt controller to which the interrupts from s2mpa01 are delivered to. - interrupts: An interrupt specifier for the sole interrupt generated by the device. Optional nodes: - regulators: The regulators of s2mpa01 that have to be instantiated should be included in a sub-node named 'regulators'. Regulator nodes and constraints included in this sub-node use the standard regulator bindings which are documented elsewhere. Properties for BUCK regulator nodes: - regulator-ramp-delay: ramp delay in uV/us. May be 6250, 12500 (default), 25000, or 50000. May be 0 for disabling the ramp delay on BUCK{1,2,3,4}. In the absence of the regulator-ramp-delay property, the default ramp delay will be used. NOTE: Some BUCKs share the ramp rate setting i.e. same ramp value will be set for a particular group of BUCKs. So provide same regulator-ramp-delay=<value>. The following BUCKs share ramp settings: * 1 and 6 * 2 and 4 * 8, 9, and 10 The following are the names of the regulators that the s2mpa01 PMIC block supports. Note: The 'n' in LDOn and BUCKn represents the LDO or BUCK number as per the datasheet of s2mpa01. - LDOn - valid values for n are 1 to 26 - Example: LDO1, LD02, LDO26 - BUCKn - valid values for n are 1 to 10. - Example: BUCK1, BUCK2, BUCK9 Example: s2mpa01_pmic@66 { compatible = "samsung,s2mpa01-pmic"; reg = <0x66>; regulators { ldo1_reg: LDO1 { regulator-name = "VDD_ALIVE"; regulator-min-microvolt = <1000000>; regulator-max-microvolt = <1000000>; }; ldo2_reg: LDO2 { regulator-name = "VDDQ_MMC2"; regulator-min-microvolt = <2800000>; regulator-max-microvolt = <2800000>; regulator-always-on; }; buck1_reg: BUCK1 { regulator-name = "vdd_mif"; regulator-min-microvolt = <950000>; regulator-max-microvolt = <1350000>; regulator-always-on; regulator-boot-on; }; buck2_reg: BUCK2 { regulator-name = "vdd_arm"; regulator-min-microvolt = <950000>; regulator-max-microvolt = <1350000>; regulator-always-on; regulator-boot-on; regulator-ramp-delay = <50000>; }; }; };
drivers/mfd/sec-core.c +102 −10 Original line number Diff line number Diff line Loading @@ -26,7 +26,9 @@ #include <linux/mfd/samsung/core.h> #include <linux/mfd/samsung/irq.h> #include <linux/mfd/samsung/rtc.h> #include <linux/mfd/samsung/s2mpa01.h> #include <linux/mfd/samsung/s2mps11.h> #include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s5m8763.h> #include <linux/mfd/samsung/s5m8767.h> #include <linux/regmap.h> Loading Loading @@ -69,18 +71,53 @@ static const struct mfd_cell s2mps11_devs[] = { } }; static const struct mfd_cell s2mps14_devs[] = { { .name = "s2mps14-pmic", }, { .name = "s2mps14-rtc", }, { .name = "s2mps14-clk", } }; static const struct mfd_cell s2mpa01_devs[] = { { .name = "s2mpa01-pmic", }, }; #ifdef CONFIG_OF static struct of_device_id sec_dt_match[] = { { .compatible = "samsung,s5m8767-pmic", .data = (void *)S5M8767X, }, { .compatible = "samsung,s2mps11-pmic", }, { .compatible = "samsung,s2mps11-pmic", .data = (void *)S2MPS11X, }, { .compatible = "samsung,s2mps14-pmic", .data = (void *)S2MPS14X, }, { .compatible = "samsung,s2mpa01-pmic", .data = (void *)S2MPA01, }, { /* Sentinel */ }, {}, }; #endif static bool s2mpa01_volatile(struct device *dev, unsigned int reg) { switch (reg) { case S2MPA01_REG_INT1M: case S2MPA01_REG_INT2M: case S2MPA01_REG_INT3M: return false; default: return true; } } static bool s2mps11_volatile(struct device *dev, unsigned int reg) { switch (reg) { Loading Loading @@ -111,6 +148,15 @@ static const struct regmap_config sec_regmap_config = { .val_bits = 8, }; static const struct regmap_config s2mpa01_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = S2MPA01_REG_LDO_OVCB4, .volatile_reg = s2mpa01_volatile, .cache_type = REGCACHE_FLAT, }; static const struct regmap_config s2mps11_regmap_config = { .reg_bits = 8, .val_bits = 8, Loading @@ -120,6 +166,15 @@ static const struct regmap_config s2mps11_regmap_config = { .cache_type = REGCACHE_FLAT, }; static const struct regmap_config s2mps14_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = S2MPS14_REG_LDODSCH3, .volatile_reg = s2mps11_volatile, .cache_type = REGCACHE_FLAT, }; static const struct regmap_config s5m8763_regmap_config = { .reg_bits = 8, .val_bits = 8, Loading @@ -138,9 +193,18 @@ static const struct regmap_config s5m8767_regmap_config = { .cache_type = REGCACHE_FLAT, }; static const struct regmap_config sec_rtc_regmap_config = { static const struct regmap_config s5m_rtc_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = SEC_RTC_REG_MAX, }; static const struct regmap_config s2mps14_rtc_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = S2MPS_RTC_REG_MAX, }; #ifdef CONFIG_OF Loading Loading @@ -180,24 +244,24 @@ static struct sec_platform_data *sec_pmic_i2c_parse_dt_pdata( } #endif static inline int sec_i2c_get_driver_data(struct i2c_client *i2c, static inline unsigned long sec_i2c_get_driver_data(struct i2c_client *i2c, const struct i2c_device_id *id) { #ifdef CONFIG_OF if (i2c->dev.of_node) { const struct of_device_id *match; match = of_match_node(sec_dt_match, i2c->dev.of_node); return (int)match->data; return (unsigned long)match->data; } #endif return (int)id->driver_data; return id->driver_data; } static int sec_pmic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev); const struct regmap_config *regmap; const struct regmap_config *regmap, *regmap_rtc; struct sec_pmic_dev *sec_pmic; int ret; Loading Loading @@ -229,17 +293,34 @@ static int sec_pmic_probe(struct i2c_client *i2c, } switch (sec_pmic->device_type) { case S2MPA01: regmap = &s2mpa01_regmap_config; break; case S2MPS11X: regmap = &s2mps11_regmap_config; /* * The rtc-s5m driver does not support S2MPS11 and there * is no mfd_cell for S2MPS11 RTC device. * However we must pass something to devm_regmap_init_i2c() * so use S5M-like regmap config even though it wouldn't work. */ regmap_rtc = &s5m_rtc_regmap_config; break; case S2MPS14X: regmap = &s2mps14_regmap_config; regmap_rtc = &s2mps14_rtc_regmap_config; break; case S5M8763X: regmap = &s5m8763_regmap_config; regmap_rtc = &s5m_rtc_regmap_config; break; case S5M8767X: regmap = &s5m8767_regmap_config; regmap_rtc = &s5m_rtc_regmap_config; break; default: regmap = &sec_regmap_config; regmap_rtc = &s5m_rtc_regmap_config; break; } Loading @@ -252,10 +333,13 @@ static int sec_pmic_probe(struct i2c_client *i2c, } sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); if (!sec_pmic->rtc) { dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n"); return -ENODEV; } i2c_set_clientdata(sec_pmic->rtc, sec_pmic); sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc, &sec_rtc_regmap_config); sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc, regmap_rtc); if (IS_ERR(sec_pmic->regmap_rtc)) { ret = PTR_ERR(sec_pmic->regmap_rtc); dev_err(&i2c->dev, "Failed to allocate RTC register map: %d\n", Loading Loading @@ -283,10 +367,18 @@ static int sec_pmic_probe(struct i2c_client *i2c, ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL); break; case S2MPA01: ret = mfd_add_devices(sec_pmic->dev, -1, s2mpa01_devs, ARRAY_SIZE(s2mpa01_devs), NULL, 0, NULL); break; case S2MPS11X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL); break; case S2MPS14X: ret = mfd_add_devices(sec_pmic->dev, -1, s2mps14_devs, ARRAY_SIZE(s2mps14_devs), NULL, 0, NULL); break; default: /* If this happens the probe function is problem */ BUG(); Loading
drivers/mfd/sec-irq.c +92 −5 Original line number Diff line number Diff line /* * sec-irq.c * * Copyright (c) 2011 Samsung Electronics Co., Ltd * 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 Loading @@ -19,6 +19,7 @@ #include <linux/mfd/samsung/core.h> #include <linux/mfd/samsung/irq.h> #include <linux/mfd/samsung/s2mps11.h> #include <linux/mfd/samsung/s2mps14.h> #include <linux/mfd/samsung/s5m8763.h> #include <linux/mfd/samsung/s5m8767.h> Loading Loading @@ -59,13 +60,13 @@ static const struct regmap_irq s2mps11_irqs[] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTC60S_MASK, }, [S2MPS11_IRQ_RTCA1] = { [S2MPS11_IRQ_RTCA0] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA1_MASK, .mask = S2MPS11_IRQ_RTCA0_MASK, }, [S2MPS11_IRQ_RTCA2] = { [S2MPS11_IRQ_RTCA1] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA2_MASK, .mask = S2MPS11_IRQ_RTCA1_MASK, }, [S2MPS11_IRQ_SMPL] = { .reg_offset = 1, Loading @@ -89,6 +90,76 @@ static const struct regmap_irq s2mps11_irqs[] = { }, }; static const struct regmap_irq s2mps14_irqs[] = { [S2MPS14_IRQ_PWRONF] = { .reg_offset = 0, .mask = S2MPS11_IRQ_PWRONF_MASK, }, [S2MPS14_IRQ_PWRONR] = { .reg_offset = 0, .mask = S2MPS11_IRQ_PWRONR_MASK, }, [S2MPS14_IRQ_JIGONBF] = { .reg_offset = 0, .mask = S2MPS11_IRQ_JIGONBF_MASK, }, [S2MPS14_IRQ_JIGONBR] = { .reg_offset = 0, .mask = S2MPS11_IRQ_JIGONBR_MASK, }, [S2MPS14_IRQ_ACOKBF] = { .reg_offset = 0, .mask = S2MPS11_IRQ_ACOKBF_MASK, }, [S2MPS14_IRQ_ACOKBR] = { .reg_offset = 0, .mask = S2MPS11_IRQ_ACOKBR_MASK, }, [S2MPS14_IRQ_PWRON1S] = { .reg_offset = 0, .mask = S2MPS11_IRQ_PWRON1S_MASK, }, [S2MPS14_IRQ_MRB] = { .reg_offset = 0, .mask = S2MPS11_IRQ_MRB_MASK, }, [S2MPS14_IRQ_RTC60S] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTC60S_MASK, }, [S2MPS14_IRQ_RTCA1] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA1_MASK, }, [S2MPS14_IRQ_RTCA0] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTCA0_MASK, }, [S2MPS14_IRQ_SMPL] = { .reg_offset = 1, .mask = S2MPS11_IRQ_SMPL_MASK, }, [S2MPS14_IRQ_RTC1S] = { .reg_offset = 1, .mask = S2MPS11_IRQ_RTC1S_MASK, }, [S2MPS14_IRQ_WTSR] = { .reg_offset = 1, .mask = S2MPS11_IRQ_WTSR_MASK, }, [S2MPS14_IRQ_INT120C] = { .reg_offset = 2, .mask = S2MPS11_IRQ_INT120C_MASK, }, [S2MPS14_IRQ_INT140C] = { .reg_offset = 2, .mask = S2MPS11_IRQ_INT140C_MASK, }, [S2MPS14_IRQ_TSD] = { .reg_offset = 2, .mask = S2MPS14_IRQ_TSD_MASK, }, }; static const struct regmap_irq s5m8767_irqs[] = { [S5M8767_IRQ_PWRR] = { Loading Loading @@ -246,6 +317,16 @@ static const struct regmap_irq_chip s2mps11_irq_chip = { .ack_base = S2MPS11_REG_INT1, }; static const struct regmap_irq_chip s2mps14_irq_chip = { .name = "s2mps14", .irqs = s2mps14_irqs, .num_irqs = ARRAY_SIZE(s2mps14_irqs), .num_regs = 3, .status_base = S2MPS14_REG_INT1, .mask_base = S2MPS14_REG_INT1M, .ack_base = S2MPS14_REG_INT1, }; static const struct regmap_irq_chip s5m8767_irq_chip = { .name = "s5m8767", .irqs = s5m8767_irqs, Loading Loading @@ -297,6 +378,12 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic) sec_pmic->irq_base, &s2mps11_irq_chip, &sec_pmic->irq_data); break; case S2MPS14X: ret = regmap_add_irq_chip(sec_pmic->regmap_pmic, sec_pmic->irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, sec_pmic->irq_base, &s2mps14_irq_chip, &sec_pmic->irq_data); break; default: dev_err(sec_pmic->dev, "Unknown device type %d\n", sec_pmic->device_type); Loading
drivers/regulator/Kconfig +7 −0 Original line number Diff line number Diff line Loading @@ -416,6 +416,13 @@ config REGULATOR_RC5T583 through regulator interface. The device supports multiple DCDC/LDO outputs which can be controlled by i2c communication. config REGULATOR_S2MPA01 tristate "Samsung S2MPA01 voltage regulator" depends on MFD_SEC_CORE help This driver controls Samsung S2MPA01 voltage output regulator via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. config REGULATOR_S2MPS11 tristate "Samsung S2MPS11 voltage regulator" depends on MFD_SEC_CORE Loading
drivers/regulator/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ obj-$(CONFIG_REGULATOR_TPS51632) += tps51632-regulator.o obj-$(CONFIG_REGULATOR_PCAP) += pcap-regulator.o obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o obj-$(CONFIG_REGULATOR_RC5T583) += rc5t583-regulator.o obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o obj-$(CONFIG_REGULATOR_S2MPS11) += s2mps11.o obj-$(CONFIG_REGULATOR_S5M8767) += s5m8767.o obj-$(CONFIG_REGULATOR_STW481X_VMMC) += stw481x-vmmc.o Loading