The s2mpa01 regulator driver can be safely removed since it was merged into s2mps11 driver. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@xxxxxxxxxxx> --- Documentation/devicetree/bindings/mfd/s2mpa01.txt | 90 ---- drivers/regulator/Kconfig | 7 - drivers/regulator/Makefile | 1 - drivers/regulator/s2mpa01.c | 482 ---------------------- 4 files changed, 580 deletions(-) delete mode 100644 Documentation/devicetree/bindings/mfd/s2mpa01.txt delete mode 100644 drivers/regulator/s2mpa01.c diff --git a/Documentation/devicetree/bindings/mfd/s2mpa01.txt b/Documentation/devicetree/bindings/mfd/s2mpa01.txt deleted file mode 100644 index c13d3d8c3947..000000000000 --- a/Documentation/devicetree/bindings/mfd/s2mpa01.txt +++ /dev/null @@ -1,90 +0,0 @@ - -* 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>; - }; - }; - }; diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index c4aa87fd12af..d735ffb36c21 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -440,13 +440,6 @@ 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 S2MPA01/S2MPS11/S2MPS14 voltage regulator" depends on MFD_SEC_CORE diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index c14696b290c0..f479b91e7a32 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -60,7 +60,6 @@ obj-$(CONFIG_REGULATOR_PBIAS) += pbias-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_ST_PWM) += st-pwm.o diff --git a/drivers/regulator/s2mpa01.c b/drivers/regulator/s2mpa01.c deleted file mode 100644 index ee83b4876420..000000000000 --- a/drivers/regulator/s2mpa01.c +++ /dev/null @@ -1,482 +0,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. - * - */ - -#include <linux/bug.h> -#include <linux/err.h> -#include <linux/gpio.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/of.h> -#include <linux/regmap.h> -#include <linux/platform_device.h> -#include <linux/regulator/driver.h> -#include <linux/regulator/machine.h> -#include <linux/regulator/of_regulator.h> -#include <linux/mfd/samsung/core.h> -#include <linux/mfd/samsung/s2mpa01.h> - -#define S2MPA01_REGULATOR_CNT ARRAY_SIZE(regulators) - -struct s2mpa01_info { - int ramp_delay24; - int ramp_delay3; - int ramp_delay5; - int ramp_delay16; - int ramp_delay7; - int ramp_delay8910; -}; - -static int get_ramp_delay(int ramp_delay) -{ - unsigned char cnt = 0; - - ramp_delay /= 6250; - - while (true) { - ramp_delay = ramp_delay >> 1; - if (ramp_delay == 0) - break; - cnt++; - } - - if (cnt > 3) - cnt = 3; - - return cnt; -} - -static int s2mpa01_regulator_set_voltage_time_sel(struct regulator_dev *rdev, - unsigned int old_selector, - unsigned int new_selector) -{ - struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev); - unsigned int ramp_delay = 0; - int old_volt, new_volt; - - switch (rdev_get_id(rdev)) { - case S2MPA01_BUCK2: - case S2MPA01_BUCK4: - ramp_delay = s2mpa01->ramp_delay24; - break; - case S2MPA01_BUCK3: - ramp_delay = s2mpa01->ramp_delay3; - break; - case S2MPA01_BUCK5: - ramp_delay = s2mpa01->ramp_delay5; - break; - case S2MPA01_BUCK1: - case S2MPA01_BUCK6: - ramp_delay = s2mpa01->ramp_delay16; - break; - case S2MPA01_BUCK7: - ramp_delay = s2mpa01->ramp_delay7; - break; - case S2MPA01_BUCK8: - case S2MPA01_BUCK9: - case S2MPA01_BUCK10: - ramp_delay = s2mpa01->ramp_delay8910; - break; - } - - if (ramp_delay == 0) - ramp_delay = rdev->desc->ramp_delay; - - old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector); - new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector); - - return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay); -} - -static int s2mpa01_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) -{ - struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev); - unsigned int ramp_val, ramp_shift, ramp_reg = S2MPA01_REG_RAMP2; - unsigned int ramp_enable = 1, enable_shift = 0; - int ret; - - switch (rdev_get_id(rdev)) { - case S2MPA01_BUCK1: - enable_shift = S2MPA01_BUCK1_RAMP_EN_SHIFT; - if (!ramp_delay) { - ramp_enable = 0; - break; - } - - if (ramp_delay > s2mpa01->ramp_delay16) - s2mpa01->ramp_delay16 = ramp_delay; - else - ramp_delay = s2mpa01->ramp_delay16; - - ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT; - break; - case S2MPA01_BUCK2: - enable_shift = S2MPA01_BUCK2_RAMP_EN_SHIFT; - if (!ramp_delay) { - ramp_enable = 0; - break; - } - - if (ramp_delay > s2mpa01->ramp_delay24) - s2mpa01->ramp_delay24 = ramp_delay; - else - ramp_delay = s2mpa01->ramp_delay24; - - ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT; - ramp_reg = S2MPA01_REG_RAMP1; - break; - case S2MPA01_BUCK3: - enable_shift = S2MPA01_BUCK3_RAMP_EN_SHIFT; - if (!ramp_delay) { - ramp_enable = 0; - break; - } - - s2mpa01->ramp_delay3 = ramp_delay; - ramp_shift = S2MPA01_BUCK3_RAMP_SHIFT; - ramp_reg = S2MPA01_REG_RAMP1; - break; - case S2MPA01_BUCK4: - enable_shift = S2MPA01_BUCK4_RAMP_EN_SHIFT; - if (!ramp_delay) { - ramp_enable = 0; - break; - } - - if (ramp_delay > s2mpa01->ramp_delay24) - s2mpa01->ramp_delay24 = ramp_delay; - else - ramp_delay = s2mpa01->ramp_delay24; - - ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT; - ramp_reg = S2MPA01_REG_RAMP1; - break; - case S2MPA01_BUCK5: - s2mpa01->ramp_delay5 = ramp_delay; - ramp_shift = S2MPA01_BUCK5_RAMP_SHIFT; - break; - case S2MPA01_BUCK6: - if (ramp_delay > s2mpa01->ramp_delay16) - s2mpa01->ramp_delay16 = ramp_delay; - else - ramp_delay = s2mpa01->ramp_delay16; - - ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT; - break; - case S2MPA01_BUCK7: - s2mpa01->ramp_delay7 = ramp_delay; - ramp_shift = S2MPA01_BUCK7_RAMP_SHIFT; - break; - case S2MPA01_BUCK8: - case S2MPA01_BUCK9: - case S2MPA01_BUCK10: - if (ramp_delay > s2mpa01->ramp_delay8910) - s2mpa01->ramp_delay8910 = ramp_delay; - else - ramp_delay = s2mpa01->ramp_delay8910; - - ramp_shift = S2MPA01_BUCK8910_RAMP_SHIFT; - break; - default: - return 0; - } - - if (!ramp_enable) - goto ramp_disable; - - /* Ramp delay can be enabled/disabled only for buck[1234] */ - if (rdev_get_id(rdev) >= S2MPA01_BUCK1 && - rdev_get_id(rdev) <= S2MPA01_BUCK4) { - ret = regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1, - 1 << enable_shift, 1 << enable_shift); - if (ret) { - dev_err(&rdev->dev, "failed to enable ramp rate\n"); - return ret; - } - } - - ramp_val = get_ramp_delay(ramp_delay); - - return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift, - ramp_val << ramp_shift); - -ramp_disable: - return regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1, - 1 << enable_shift, 0); -} - -static struct regulator_ops s2mpa01_ldo_ops = { - .list_voltage = regulator_list_voltage_linear, - .map_voltage = regulator_map_voltage_linear, - .is_enabled = regulator_is_enabled_regmap, - .enable = regulator_enable_regmap, - .disable = regulator_disable_regmap, - .get_voltage_sel = regulator_get_voltage_sel_regmap, - .set_voltage_sel = regulator_set_voltage_sel_regmap, - .set_voltage_time_sel = regulator_set_voltage_time_sel, -}; - -static struct regulator_ops s2mpa01_buck_ops = { - .list_voltage = regulator_list_voltage_linear, - .map_voltage = regulator_map_voltage_linear, - .is_enabled = regulator_is_enabled_regmap, - .enable = regulator_enable_regmap, - .disable = regulator_disable_regmap, - .get_voltage_sel = regulator_get_voltage_sel_regmap, - .set_voltage_sel = regulator_set_voltage_sel_regmap, - .set_voltage_time_sel = s2mpa01_regulator_set_voltage_time_sel, - .set_ramp_delay = s2mpa01_set_ramp_delay, -}; - -#define regulator_desc_ldo1(num) { \ - .name = "LDO"#num, \ - .id = S2MPA01_LDO##num, \ - .ops = &s2mpa01_ldo_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_LDO_MIN, \ - .uV_step = S2MPA01_LDO_STEP1, \ - .n_voltages = S2MPA01_LDO_N_VOLTAGES, \ - .vsel_reg = S2MPA01_REG_L1CTRL + num - 1, \ - .vsel_mask = S2MPA01_LDO_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_L1CTRL + num - 1, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} -#define regulator_desc_ldo2(num) { \ - .name = "LDO"#num, \ - .id = S2MPA01_LDO##num, \ - .ops = &s2mpa01_ldo_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_LDO_MIN, \ - .uV_step = S2MPA01_LDO_STEP2, \ - .n_voltages = S2MPA01_LDO_N_VOLTAGES, \ - .vsel_reg = S2MPA01_REG_L1CTRL + num - 1, \ - .vsel_mask = S2MPA01_LDO_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_L1CTRL + num - 1, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -#define regulator_desc_buck1_4(num) { \ - .name = "BUCK"#num, \ - .id = S2MPA01_BUCK##num, \ - .ops = &s2mpa01_buck_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_BUCK_MIN1, \ - .uV_step = S2MPA01_BUCK_STEP1, \ - .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ - .ramp_delay = S2MPA01_RAMP_DELAY, \ - .vsel_reg = S2MPA01_REG_B1CTRL2 + (num - 1) * 2, \ - .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_B1CTRL1 + (num - 1) * 2, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -#define regulator_desc_buck5 { \ - .name = "BUCK5", \ - .id = S2MPA01_BUCK5, \ - .ops = &s2mpa01_buck_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_BUCK_MIN2, \ - .uV_step = S2MPA01_BUCK_STEP1, \ - .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ - .ramp_delay = S2MPA01_RAMP_DELAY, \ - .vsel_reg = S2MPA01_REG_B5CTRL2, \ - .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_B5CTRL1, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -#define regulator_desc_buck6_7(num) { \ - .name = "BUCK"#num, \ - .id = S2MPA01_BUCK##num, \ - .ops = &s2mpa01_buck_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_BUCK_MIN1, \ - .uV_step = S2MPA01_BUCK_STEP1, \ - .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ - .ramp_delay = S2MPA01_RAMP_DELAY, \ - .vsel_reg = S2MPA01_REG_B6CTRL2 + (num - 6) * 2, \ - .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_B6CTRL1 + (num - 6) * 2, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -#define regulator_desc_buck8 { \ - .name = "BUCK8", \ - .id = S2MPA01_BUCK8, \ - .ops = &s2mpa01_buck_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_BUCK_MIN2, \ - .uV_step = S2MPA01_BUCK_STEP2, \ - .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ - .ramp_delay = S2MPA01_RAMP_DELAY, \ - .vsel_reg = S2MPA01_REG_B8CTRL2, \ - .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_B8CTRL1, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -#define regulator_desc_buck9 { \ - .name = "BUCK9", \ - .id = S2MPA01_BUCK9, \ - .ops = &s2mpa01_buck_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_BUCK_MIN4, \ - .uV_step = S2MPA01_BUCK_STEP2, \ - .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ - .ramp_delay = S2MPA01_RAMP_DELAY, \ - .vsel_reg = S2MPA01_REG_B9CTRL2, \ - .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_B9CTRL1, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -#define regulator_desc_buck10 { \ - .name = "BUCK10", \ - .id = S2MPA01_BUCK10, \ - .ops = &s2mpa01_buck_ops, \ - .type = REGULATOR_VOLTAGE, \ - .owner = THIS_MODULE, \ - .min_uV = S2MPA01_BUCK_MIN3, \ - .uV_step = S2MPA01_BUCK_STEP2, \ - .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ - .ramp_delay = S2MPA01_RAMP_DELAY, \ - .vsel_reg = S2MPA01_REG_B10CTRL2, \ - .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ - .enable_reg = S2MPA01_REG_B10CTRL1, \ - .enable_mask = S2MPA01_ENABLE_MASK \ -} - -static struct regulator_desc regulators[] = { - regulator_desc_ldo2(1), - regulator_desc_ldo1(2), - regulator_desc_ldo1(3), - regulator_desc_ldo1(4), - regulator_desc_ldo1(5), - regulator_desc_ldo2(6), - regulator_desc_ldo1(7), - regulator_desc_ldo1(8), - regulator_desc_ldo1(9), - regulator_desc_ldo1(10), - regulator_desc_ldo2(11), - regulator_desc_ldo1(12), - regulator_desc_ldo1(13), - regulator_desc_ldo1(14), - regulator_desc_ldo1(15), - regulator_desc_ldo1(16), - regulator_desc_ldo1(17), - regulator_desc_ldo1(18), - regulator_desc_ldo1(19), - regulator_desc_ldo1(20), - regulator_desc_ldo1(21), - regulator_desc_ldo2(22), - regulator_desc_ldo2(23), - regulator_desc_ldo1(24), - regulator_desc_ldo1(25), - regulator_desc_ldo1(26), - regulator_desc_buck1_4(1), - regulator_desc_buck1_4(2), - regulator_desc_buck1_4(3), - regulator_desc_buck1_4(4), - regulator_desc_buck5, - regulator_desc_buck6_7(6), - regulator_desc_buck6_7(7), - regulator_desc_buck8, - regulator_desc_buck9, - regulator_desc_buck10, -}; - -static int s2mpa01_pmic_probe(struct platform_device *pdev) -{ - struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); - struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); - struct of_regulator_match rdata[S2MPA01_REGULATOR_MAX]; - struct device_node *reg_np = NULL; - struct regulator_config config = { }; - struct s2mpa01_info *s2mpa01; - int i; - - s2mpa01 = devm_kzalloc(&pdev->dev, sizeof(*s2mpa01), GFP_KERNEL); - if (!s2mpa01) - return -ENOMEM; - - for (i = 0; i < S2MPA01_REGULATOR_CNT; i++) - rdata[i].name = regulators[i].name; - - if (iodev->dev->of_node) { - reg_np = of_get_child_by_name(iodev->dev->of_node, - "regulators"); - if (!reg_np) { - dev_err(&pdev->dev, - "could not find regulators sub-node\n"); - return -EINVAL; - } - - of_regulator_match(&pdev->dev, reg_np, rdata, - S2MPA01_REGULATOR_MAX); - of_node_put(reg_np); - } - - platform_set_drvdata(pdev, s2mpa01); - - config.dev = &pdev->dev; - config.regmap = iodev->regmap_pmic; - config.driver_data = s2mpa01; - - for (i = 0; i < S2MPA01_REGULATOR_MAX; i++) { - struct regulator_dev *rdev; - if (pdata) - config.init_data = pdata->regulators[i].initdata; - else - config.init_data = rdata[i].init_data; - - if (reg_np) - config.of_node = rdata[i].of_node; - - rdev = devm_regulator_register(&pdev->dev, - ®ulators[i], &config); - if (IS_ERR(rdev)) { - dev_err(&pdev->dev, "regulator init failed for %d\n", - i); - return PTR_ERR(rdev); - } - } - - return 0; -} - -static const struct platform_device_id s2mpa01_pmic_id[] = { - { "s2mpa01-pmic", 0}, - { }, -}; -MODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id); - -static struct platform_driver s2mpa01_pmic_driver = { - .driver = { - .name = "s2mpa01-pmic", - .owner = THIS_MODULE, - }, - .probe = s2mpa01_pmic_probe, - .id_table = s2mpa01_pmic_id, -}; - -module_platform_driver(s2mpa01_pmic_driver); - -/* Module information */ -MODULE_AUTHOR("Sangbeom Kim <sbkim73@xxxxxxxxxxx>"); -MODULE_AUTHOR("Sachin Kamat <sachin.kamat@xxxxxxxxxxx>"); -MODULE_DESCRIPTION("SAMSUNG S2MPA01 Regulator Driver"); -MODULE_LICENSE("GPL"); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html