Merge branch 'next' into for-linus
Prepare input updates for 6.17 merge window.
This commit is contained in:
@@ -584,13 +584,6 @@ config INPUT_PALMAS_PWRBUTTON
|
||||
To compile this driver as a module, choose M here. The module will
|
||||
be called palmas_pwrbutton.
|
||||
|
||||
config INPUT_PCF50633_PMU
|
||||
tristate "PCF50633 PMU events"
|
||||
depends on MFD_PCF50633
|
||||
help
|
||||
Say Y to include support for delivering PMU events via input
|
||||
layer on NXP PCF50633.
|
||||
|
||||
config INPUT_PCF8574
|
||||
tristate "PCF8574 Keypad input device"
|
||||
depends on I2C
|
||||
|
||||
@@ -59,7 +59,6 @@ obj-$(CONFIG_INPUT_MC13783_PWRBUTTON) += mc13783-pwrbutton.o
|
||||
obj-$(CONFIG_INPUT_MMA8450) += mma8450.o
|
||||
obj-$(CONFIG_INPUT_PALMAS_PWRBUTTON) += palmas-pwrbutton.o
|
||||
obj-$(CONFIG_INPUT_PCAP) += pcap_keys.o
|
||||
obj-$(CONFIG_INPUT_PCF50633_PMU) += pcf50633-input.o
|
||||
obj-$(CONFIG_INPUT_PCF8574) += pcf8574_keypad.o
|
||||
obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
|
||||
obj-$(CONFIG_INPUT_PM8941_PWRKEY) += pm8941-pwrkey.o
|
||||
|
||||
@@ -482,7 +482,6 @@ static int cs40l50_erase(struct input_dev *dev, int effect_id)
|
||||
|
||||
static void cs40l50_remove_wq(void *data)
|
||||
{
|
||||
flush_workqueue(data);
|
||||
destroy_workqueue(data);
|
||||
}
|
||||
|
||||
|
||||
@@ -68,15 +68,16 @@ struct max77693_haptic {
|
||||
|
||||
static int max77693_haptic_set_duty_cycle(struct max77693_haptic *haptic)
|
||||
{
|
||||
struct pwm_args pargs;
|
||||
int delta;
|
||||
struct pwm_state state;
|
||||
int error;
|
||||
|
||||
pwm_get_args(haptic->pwm_dev, &pargs);
|
||||
delta = (pargs.period + haptic->pwm_duty) / 2;
|
||||
error = pwm_config(haptic->pwm_dev, delta, pargs.period);
|
||||
pwm_init_state(haptic->pwm_dev, &state);
|
||||
state.duty_cycle = (state.period + haptic->pwm_duty) / 2;
|
||||
|
||||
error = pwm_apply_might_sleep(haptic->pwm_dev, &state);
|
||||
if (error) {
|
||||
dev_err(haptic->dev, "failed to configure pwm: %d\n", error);
|
||||
dev_err(haptic->dev,
|
||||
"failed to set pwm duty cycle: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -166,12 +167,17 @@ static int max77693_haptic_lowsys(struct max77693_haptic *haptic, bool enable)
|
||||
|
||||
static void max77693_haptic_enable(struct max77693_haptic *haptic)
|
||||
{
|
||||
struct pwm_state state;
|
||||
int error;
|
||||
|
||||
if (haptic->enabled)
|
||||
return;
|
||||
|
||||
error = pwm_enable(haptic->pwm_dev);
|
||||
pwm_init_state(haptic->pwm_dev, &state);
|
||||
state.duty_cycle = (state.period + haptic->pwm_duty) / 2;
|
||||
state.enabled = true;
|
||||
|
||||
error = pwm_apply_might_sleep(haptic->pwm_dev, &state);
|
||||
if (error) {
|
||||
dev_err(haptic->dev,
|
||||
"failed to enable haptic pwm device: %d\n", error);
|
||||
@@ -224,18 +230,13 @@ static void max77693_haptic_play_work(struct work_struct *work)
|
||||
{
|
||||
struct max77693_haptic *haptic =
|
||||
container_of(work, struct max77693_haptic, work);
|
||||
int error;
|
||||
|
||||
error = max77693_haptic_set_duty_cycle(haptic);
|
||||
if (error) {
|
||||
dev_err(haptic->dev, "failed to set duty cycle: %d\n", error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (haptic->magnitude)
|
||||
max77693_haptic_enable(haptic);
|
||||
else
|
||||
if (!haptic->magnitude)
|
||||
max77693_haptic_disable(haptic);
|
||||
else if (haptic->enabled)
|
||||
max77693_haptic_set_duty_cycle(haptic);
|
||||
else
|
||||
max77693_haptic_enable(haptic);
|
||||
}
|
||||
|
||||
static int max77693_haptic_play_effect(struct input_dev *dev, void *data,
|
||||
@@ -340,12 +341,6 @@ static int max77693_haptic_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(haptic->pwm_dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to the
|
||||
* atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(haptic->pwm_dev);
|
||||
|
||||
haptic->motor_reg = devm_regulator_get(&pdev->dev, "haptic");
|
||||
if (IS_ERR(haptic->motor_reg)) {
|
||||
dev_err(&pdev->dev, "failed to get regulator\n");
|
||||
|
||||
@@ -53,40 +53,30 @@ struct max8997_haptic {
|
||||
unsigned int pattern_signal_period;
|
||||
};
|
||||
|
||||
static int max8997_haptic_set_duty_cycle(struct max8997_haptic *chip)
|
||||
static void max8997_haptic_set_internal_duty_cycle(struct max8997_haptic *chip)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 duty_index = DIV_ROUND_UP(chip->level * 64, 100);
|
||||
|
||||
if (chip->mode == MAX8997_EXTERNAL_MODE) {
|
||||
unsigned int duty = chip->pwm_period * chip->level / 100;
|
||||
ret = pwm_config(chip->pwm, duty, chip->pwm_period);
|
||||
} else {
|
||||
u8 duty_index = 0;
|
||||
|
||||
duty_index = DIV_ROUND_UP(chip->level * 64, 100);
|
||||
|
||||
switch (chip->internal_mode_pattern) {
|
||||
case 0:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC1, duty_index);
|
||||
break;
|
||||
case 1:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC2, duty_index);
|
||||
break;
|
||||
case 2:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC3, duty_index);
|
||||
break;
|
||||
case 3:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC4, duty_index);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (chip->internal_mode_pattern) {
|
||||
case 0:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC1, duty_index);
|
||||
break;
|
||||
case 1:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC2, duty_index);
|
||||
break;
|
||||
case 2:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC3, duty_index);
|
||||
break;
|
||||
case 3:
|
||||
max8997_write_reg(chip->client,
|
||||
MAX8997_HAPTIC_REG_SIGPWMDC4, duty_index);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void max8997_haptic_configure(struct max8997_haptic *chip)
|
||||
@@ -155,11 +145,8 @@ static void max8997_haptic_enable(struct max8997_haptic *chip)
|
||||
|
||||
guard(mutex)(&chip->mutex);
|
||||
|
||||
error = max8997_haptic_set_duty_cycle(chip);
|
||||
if (error) {
|
||||
dev_err(chip->dev, "set_pwm_cycle failed, error: %d\n", error);
|
||||
return;
|
||||
}
|
||||
if (chip->mode != MAX8997_EXTERNAL_MODE)
|
||||
max8997_haptic_set_internal_duty_cycle(chip);
|
||||
|
||||
if (!chip->enabled) {
|
||||
error = regulator_enable(chip->regulator);
|
||||
@@ -168,16 +155,32 @@ static void max8997_haptic_enable(struct max8997_haptic *chip)
|
||||
return;
|
||||
}
|
||||
max8997_haptic_configure(chip);
|
||||
if (chip->mode == MAX8997_EXTERNAL_MODE) {
|
||||
error = pwm_enable(chip->pwm);
|
||||
if (error) {
|
||||
dev_err(chip->dev, "Failed to enable PWM\n");
|
||||
regulator_disable(chip->regulator);
|
||||
return;
|
||||
}
|
||||
}
|
||||
chip->enabled = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* It would be more straight forward to configure the external PWM
|
||||
* earlier i.e. when the internal duty_cycle is setup in internal mode.
|
||||
* But historically this is done only after the regulator was enabled
|
||||
* and max8997_haptic_configure() set the enable bit in
|
||||
* MAX8997_HAPTIC_REG_CONF2. So better keep it this way.
|
||||
*/
|
||||
if (chip->mode == MAX8997_EXTERNAL_MODE) {
|
||||
struct pwm_state state;
|
||||
|
||||
pwm_init_state(chip->pwm, &state);
|
||||
state.period = chip->pwm_period;
|
||||
state.duty_cycle = chip->pwm_period * chip->level / 100;
|
||||
state.enabled = true;
|
||||
|
||||
error = pwm_apply_might_sleep(chip->pwm, &state);
|
||||
if (error) {
|
||||
dev_err(chip->dev, "Failed to enable PWM\n");
|
||||
regulator_disable(chip->regulator);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
chip->enabled = true;
|
||||
}
|
||||
|
||||
static void max8997_haptic_disable(struct max8997_haptic *chip)
|
||||
@@ -282,11 +285,6 @@ static int max8997_haptic_probe(struct platform_device *pdev)
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: pwm_apply_args() should be removed when switching to
|
||||
* the atomic PWM API.
|
||||
*/
|
||||
pwm_apply_args(chip->pwm);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -45,7 +45,7 @@ struct bbnsm_pwrkey {
|
||||
|
||||
static void bbnsm_pwrkey_check_for_events(struct timer_list *t)
|
||||
{
|
||||
struct bbnsm_pwrkey *bbnsm = from_timer(bbnsm, t, check_timer);
|
||||
struct bbnsm_pwrkey *bbnsm = timer_container_of(bbnsm, t, check_timer);
|
||||
struct input_dev *input = bbnsm->input;
|
||||
u32 state;
|
||||
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/* NXP PCF50633 Input Driver
|
||||
*
|
||||
* (C) 2006-2008 by Openmoko, Inc.
|
||||
* Author: Balaji Rao <balajirrao@openmoko.org>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Broken down from monstrous PCF50633 driver mainly by
|
||||
* Harald Welte, Andy Green and Werner Almesberger
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <linux/mfd/pcf50633/core.h>
|
||||
|
||||
#define PCF50633_OOCSTAT_ONKEY 0x01
|
||||
#define PCF50633_REG_OOCSTAT 0x12
|
||||
#define PCF50633_REG_OOCMODE 0x10
|
||||
|
||||
struct pcf50633_input {
|
||||
struct pcf50633 *pcf;
|
||||
struct input_dev *input_dev;
|
||||
};
|
||||
|
||||
static void
|
||||
pcf50633_input_irq(int irq, void *data)
|
||||
{
|
||||
struct pcf50633_input *input;
|
||||
int onkey_released;
|
||||
|
||||
input = data;
|
||||
|
||||
/* We report only one event depending on the key press status */
|
||||
onkey_released = pcf50633_reg_read(input->pcf, PCF50633_REG_OOCSTAT)
|
||||
& PCF50633_OOCSTAT_ONKEY;
|
||||
|
||||
if (irq == PCF50633_IRQ_ONKEYF && !onkey_released)
|
||||
input_report_key(input->input_dev, KEY_POWER, 1);
|
||||
else if (irq == PCF50633_IRQ_ONKEYR && onkey_released)
|
||||
input_report_key(input->input_dev, KEY_POWER, 0);
|
||||
|
||||
input_sync(input->input_dev);
|
||||
}
|
||||
|
||||
static int pcf50633_input_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pcf50633_input *input;
|
||||
struct input_dev *input_dev;
|
||||
int ret;
|
||||
|
||||
|
||||
input = kzalloc(sizeof(*input), GFP_KERNEL);
|
||||
if (!input)
|
||||
return -ENOMEM;
|
||||
|
||||
input_dev = input_allocate_device();
|
||||
if (!input_dev) {
|
||||
kfree(input);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, input);
|
||||
input->pcf = dev_to_pcf50633(pdev->dev.parent);
|
||||
input->input_dev = input_dev;
|
||||
|
||||
input_dev->name = "PCF50633 PMU events";
|
||||
input_dev->id.bustype = BUS_I2C;
|
||||
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
|
||||
set_bit(KEY_POWER, input_dev->keybit);
|
||||
|
||||
ret = input_register_device(input_dev);
|
||||
if (ret) {
|
||||
input_free_device(input_dev);
|
||||
kfree(input);
|
||||
return ret;
|
||||
}
|
||||
pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYR,
|
||||
pcf50633_input_irq, input);
|
||||
pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYF,
|
||||
pcf50633_input_irq, input);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pcf50633_input_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pcf50633_input *input = platform_get_drvdata(pdev);
|
||||
|
||||
pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYR);
|
||||
pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYF);
|
||||
|
||||
input_unregister_device(input->input_dev);
|
||||
kfree(input);
|
||||
}
|
||||
|
||||
static struct platform_driver pcf50633_input_driver = {
|
||||
.driver = {
|
||||
.name = "pcf50633-input",
|
||||
},
|
||||
.probe = pcf50633_input_probe,
|
||||
.remove = pcf50633_input_remove,
|
||||
};
|
||||
module_platform_driver(pcf50633_input_driver);
|
||||
|
||||
MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
|
||||
MODULE_DESCRIPTION("PCF50633 input driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:pcf50633-input");
|
||||
Reference in New Issue
Block a user