Exemplo n.º 1
0
static int as3722_poweroff_probe(struct platform_device *pdev)
{
	struct as3722_poweroff *as3722_poweroff;
	struct device_node *np = pdev->dev.parent->of_node;
	struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent);
	struct as3722_platform_data *pdata = as3722->dev->platform_data;
	struct system_pmic_config config;
	bool use_power_off = false;
	bool use_power_reset = false;

	if (pdata) {
		use_power_off = pdata->use_power_off;
		use_power_reset = pdata->use_power_reset;
	} else {
		if (np) {
			use_power_off = of_property_read_bool(np,
					"ams,system-power-controller");
			if (!use_power_off)
				use_power_off = of_property_read_bool(np,
					"system-pmic-power-off");
			use_power_reset = of_property_read_bool(np,
					"ams,system-power-controller");
			if (!use_power_reset)
				use_power_reset = of_property_read_bool(np,
					"system-pmic-power-reset");
		}
	}

	if (!use_power_off && !use_power_reset) {
		dev_warn(&pdev->dev,
			"power off and reset functionality not selected\n");
		return 0;
	}

	as3722_poweroff = devm_kzalloc(&pdev->dev, sizeof(*as3722_poweroff),
				GFP_KERNEL);
	if (!as3722_poweroff)
		return -ENOMEM;

	as3722_poweroff->as3722 = as3722;
	as3722_poweroff->dev = &pdev->dev;
	as3722_poweroff->use_power_off = use_power_off;
	as3722_poweroff->use_power_reset = use_power_reset;

	config.allow_power_off = use_power_off;
	config.allow_power_reset = use_power_reset;

	as3722_poweroff->system_pmic_dev = system_pmic_register(&pdev->dev,
				&as3722_pm_ops, &config, as3722_poweroff);
	if (IS_ERR(as3722_poweroff->system_pmic_dev)) {
		int ret = PTR_ERR(as3722_poweroff->system_pmic_dev);

		dev_err(&pdev->dev, "System PMIC registartion failed: %d\n",
			ret);
		return ret;
	}
	return 0;
}
Exemplo n.º 2
0
static int palmas_pm_probe(struct platform_device *pdev)
{
	struct palmas *palmas = dev_get_drvdata(pdev->dev.parent);
	struct palmas_pm *palmas_pm = NULL;
	struct palmas_platform_data *palmas_pdata;
	struct palmas_pm_platform_data *pm_pdata = NULL;
	struct system_pmic_config config;
	struct device_node *node = pdev->dev.of_node;
	int i;

	palmas_pm = devm_kzalloc(&pdev->dev, sizeof(*palmas_pm),
			GFP_KERNEL);
	if (!palmas_pm) {
		dev_err(&pdev->dev, "Memory allocation failed.\n");
		return -ENOMEM;
	}

	palmas_pm->dev = &pdev->dev;
	palmas_pm->palmas = palmas;
	platform_set_drvdata(pdev, palmas_pm);

	palmas_pm->num_int_mask_regs = PALMAS_MAX_INTERRUPT_MASK_REG;
	if (palmas->id != TPS80036)
		palmas_pm->num_int_mask_regs = 4;

	palmas_pm->int_mask_reg_add[0] = PALMAS_INT1_MASK;
	palmas_pm->int_mask_reg_add[1] = PALMAS_INT2_MASK;
	palmas_pm->int_mask_reg_add[2] = PALMAS_INT3_MASK;
	palmas_pm->int_mask_reg_add[3] = PALMAS_INT4_MASK;
	palmas_pm->int_mask_reg_add[4] = PALMAS_INT5_MASK;
	palmas_pm->int_mask_reg_add[5] = PALMAS_INT6_MASK;
	palmas_pm->int_status_reg_add[0] = PALMAS_INT1_STATUS;
	palmas_pm->int_status_reg_add[1] = PALMAS_INT2_STATUS;
	palmas_pm->int_status_reg_add[2] = PALMAS_INT3_STATUS;
	palmas_pm->int_status_reg_add[3] = PALMAS_INT4_STATUS;
	palmas_pm->int_status_reg_add[4] = PALMAS_INT5_STATUS;
	palmas_pm->int_status_reg_add[5] = PALMAS_INT6_STATUS;
	for (i = 0; i < palmas_pm->num_int_mask_regs; ++i)
		palmas_pm->int_mask_val[i] = 0xFF;

	palmas_pdata = dev_get_platdata(pdev->dev.parent);
	if (palmas_pdata)
		pm_pdata = palmas_pdata->pm_pdata;

	if (pm_pdata) {
		config.allow_power_off = pm_pdata->use_power_off;
		config.allow_power_reset = pm_pdata->use_power_reset;
		palmas_pm->enable_boot_up_at_vbus =
			pm_pdata->use_boot_up_at_vbus;
	} else {
		if (node) {
			config.allow_power_off = of_property_read_bool(node,
				"system-pmic-power-off");
			config.allow_power_reset = of_property_read_bool(node,
				"system-pmic-power-reset");
			palmas_pm->enable_boot_up_at_vbus =
				of_property_read_bool(node,
				"boot-up-at-vbus");
		} else {
			config.allow_power_off = true;
			config.allow_power_reset = false;
			palmas_pm->enable_boot_up_at_vbus = false;
		}
	}

	palmas_pm->system_pmic_dev = system_pmic_register(&pdev->dev,
				&palmas_pm_ops, &config, palmas_pm);
	if (IS_ERR(palmas_pm->system_pmic_dev)) {
		int ret = PTR_ERR(palmas_pm->system_pmic_dev);
		dev_err(&pdev->dev, "System PMIC registartion failed: %d\n",
			ret);
		return ret;
	}
	return 0;
}