Commit 18726a34 authored by David Härdeman's avatar David Härdeman Committed by Mauro Carvalho Chehab

[media] rc-core: cleanup rc_register_device pt2

Now that rc_register_device() is reorganised, the dev->initialized
hack can be removed. Any driver which calls rc_register_device()
must be prepared for the device to go live immediately.

The dev->initialized commits that are relevant are commit c73bbaa4
("[media] rc-core: don't lock device at rc_register_device()") and
commit 08aeb7c9 ("[media] rc: add locking to fix register/show race").

The original problem was that show_protocols() would access
dev->rc_map.* and various other bits which are now properly
initialized before device_add() is called.

At the same time, remove the bogus "device is being removed" check.
Signed-off-by: default avatarDavid Härdeman <david@hardeman.nu>
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent f56928ab
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <media/rc-core.h> #include <media/rc-core.h>
#include <linux/atomic.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/input.h> #include <linux/input.h>
...@@ -934,8 +933,8 @@ static bool lirc_is_present(void) ...@@ -934,8 +933,8 @@ static bool lirc_is_present(void)
* It returns the protocol names of supported protocols. * It returns the protocol names of supported protocols.
* Enabled protocols are printed in brackets. * Enabled protocols are printed in brackets.
* *
* dev->lock is taken to guard against races between device * dev->lock is taken to guard against races between
* registration, store_protocols and show_protocols. * store_protocols and show_protocols.
*/ */
static ssize_t show_protocols(struct device *device, static ssize_t show_protocols(struct device *device,
struct device_attribute *mattr, char *buf) struct device_attribute *mattr, char *buf)
...@@ -945,13 +944,6 @@ static ssize_t show_protocols(struct device *device, ...@@ -945,13 +944,6 @@ static ssize_t show_protocols(struct device *device,
char *tmp = buf; char *tmp = buf;
int i; int i;
/* Device is being removed */
if (!dev)
return -EINVAL;
if (!atomic_read(&dev->initialized))
return -ERESTARTSYS;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
enabled = dev->enabled_protocols; enabled = dev->enabled_protocols;
...@@ -1106,8 +1098,8 @@ static void ir_raw_load_modules(u64 *protocols) ...@@ -1106,8 +1098,8 @@ static void ir_raw_load_modules(u64 *protocols)
* See parse_protocol_change() for the valid commands. * See parse_protocol_change() for the valid commands.
* Returns @len on success or a negative error code. * Returns @len on success or a negative error code.
* *
* dev->lock is taken to guard against races between device * dev->lock is taken to guard against races between
* registration, store_protocols and show_protocols. * store_protocols and show_protocols.
*/ */
static ssize_t store_protocols(struct device *device, static ssize_t store_protocols(struct device *device,
struct device_attribute *mattr, struct device_attribute *mattr,
...@@ -1119,13 +1111,6 @@ static ssize_t store_protocols(struct device *device, ...@@ -1119,13 +1111,6 @@ static ssize_t store_protocols(struct device *device,
u64 old_protocols, new_protocols; u64 old_protocols, new_protocols;
ssize_t rc; ssize_t rc;
/* Device is being removed */
if (!dev)
return -EINVAL;
if (!atomic_read(&dev->initialized))
return -ERESTARTSYS;
IR_dprintk(1, "Normal protocol change requested\n"); IR_dprintk(1, "Normal protocol change requested\n");
current_protocols = &dev->enabled_protocols; current_protocols = &dev->enabled_protocols;
filter = &dev->scancode_filter; filter = &dev->scancode_filter;
...@@ -1200,7 +1185,7 @@ static ssize_t store_protocols(struct device *device, ...@@ -1200,7 +1185,7 @@ static ssize_t store_protocols(struct device *device,
* Bits of the filter value corresponding to set bits in the filter mask are * Bits of the filter value corresponding to set bits in the filter mask are
* compared against input scancodes and non-matching scancodes are discarded. * compared against input scancodes and non-matching scancodes are discarded.
* *
* dev->lock is taken to guard against races between device registration, * dev->lock is taken to guard against races between
* store_filter and show_filter. * store_filter and show_filter.
*/ */
static ssize_t show_filter(struct device *device, static ssize_t show_filter(struct device *device,
...@@ -1212,13 +1197,6 @@ static ssize_t show_filter(struct device *device, ...@@ -1212,13 +1197,6 @@ static ssize_t show_filter(struct device *device,
struct rc_scancode_filter *filter; struct rc_scancode_filter *filter;
u32 val; u32 val;
/* Device is being removed */
if (!dev)
return -EINVAL;
if (!atomic_read(&dev->initialized))
return -ERESTARTSYS;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
if (fattr->type == RC_FILTER_NORMAL) if (fattr->type == RC_FILTER_NORMAL)
...@@ -1251,7 +1229,7 @@ static ssize_t show_filter(struct device *device, ...@@ -1251,7 +1229,7 @@ static ssize_t show_filter(struct device *device,
* Bits of the filter value corresponding to set bits in the filter mask are * Bits of the filter value corresponding to set bits in the filter mask are
* compared against input scancodes and non-matching scancodes are discarded. * compared against input scancodes and non-matching scancodes are discarded.
* *
* dev->lock is taken to guard against races between device registration, * dev->lock is taken to guard against races between
* store_filter and show_filter. * store_filter and show_filter.
*/ */
static ssize_t store_filter(struct device *device, static ssize_t store_filter(struct device *device,
...@@ -1265,13 +1243,6 @@ static ssize_t store_filter(struct device *device, ...@@ -1265,13 +1243,6 @@ static ssize_t store_filter(struct device *device,
unsigned long val; unsigned long val;
int (*set_filter)(struct rc_dev *dev, struct rc_scancode_filter *filter); int (*set_filter)(struct rc_dev *dev, struct rc_scancode_filter *filter);
/* Device is being removed */
if (!dev)
return -EINVAL;
if (!atomic_read(&dev->initialized))
return -ERESTARTSYS;
ret = kstrtoul(buf, 0, &val); ret = kstrtoul(buf, 0, &val);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1372,8 +1343,8 @@ static const char * const proto_variant_names[] = { ...@@ -1372,8 +1343,8 @@ static const char * const proto_variant_names[] = {
* It returns the protocol names of supported protocols. * It returns the protocol names of supported protocols.
* The enabled protocols are printed in brackets. * The enabled protocols are printed in brackets.
* *
* dev->lock is taken to guard against races between device * dev->lock is taken to guard against races between
* registration, store_protocols and show_protocols. * store_wakeup_protocols and show_wakeup_protocols.
*/ */
static ssize_t show_wakeup_protocols(struct device *device, static ssize_t show_wakeup_protocols(struct device *device,
struct device_attribute *mattr, struct device_attribute *mattr,
...@@ -1385,13 +1356,6 @@ static ssize_t show_wakeup_protocols(struct device *device, ...@@ -1385,13 +1356,6 @@ static ssize_t show_wakeup_protocols(struct device *device,
char *tmp = buf; char *tmp = buf;
int i; int i;
/* Device is being removed */
if (!dev)
return -EINVAL;
if (!atomic_read(&dev->initialized))
return -ERESTARTSYS;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
allowed = dev->allowed_wakeup_protocols; allowed = dev->allowed_wakeup_protocols;
...@@ -1431,8 +1395,8 @@ static ssize_t show_wakeup_protocols(struct device *device, ...@@ -1431,8 +1395,8 @@ static ssize_t show_wakeup_protocols(struct device *device,
* It is trigged by writing to /sys/class/rc/rc?/wakeup_protocols. * It is trigged by writing to /sys/class/rc/rc?/wakeup_protocols.
* Returns @len on success or a negative error code. * Returns @len on success or a negative error code.
* *
* dev->lock is taken to guard against races between device * dev->lock is taken to guard against races between
* registration, store_protocols and show_protocols. * store_wakeup_protocols and show_wakeup_protocols.
*/ */
static ssize_t store_wakeup_protocols(struct device *device, static ssize_t store_wakeup_protocols(struct device *device,
struct device_attribute *mattr, struct device_attribute *mattr,
...@@ -1444,13 +1408,6 @@ static ssize_t store_wakeup_protocols(struct device *device, ...@@ -1444,13 +1408,6 @@ static ssize_t store_wakeup_protocols(struct device *device,
u64 allowed; u64 allowed;
int i; int i;
/* Device is being removed */
if (!dev)
return -EINVAL;
if (!atomic_read(&dev->initialized))
return -ERESTARTSYS;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
allowed = dev->allowed_wakeup_protocols; allowed = dev->allowed_wakeup_protocols;
...@@ -1773,7 +1730,6 @@ int rc_register_device(struct rc_dev *dev) ...@@ -1773,7 +1730,6 @@ int rc_register_device(struct rc_dev *dev)
dev->minor = minor; dev->minor = minor;
dev_set_name(&dev->dev, "rc%u", dev->minor); dev_set_name(&dev->dev, "rc%u", dev->minor);
dev_set_drvdata(&dev->dev, dev); dev_set_drvdata(&dev->dev, dev);
atomic_set(&dev->initialized, 0);
dev->dev.groups = dev->sysfs_groups; dev->dev.groups = dev->sysfs_groups;
if (dev->driver_type != RC_DRIVER_IR_RAW_TX) if (dev->driver_type != RC_DRIVER_IR_RAW_TX)
...@@ -1819,9 +1775,6 @@ int rc_register_device(struct rc_dev *dev) ...@@ -1819,9 +1775,6 @@ int rc_register_device(struct rc_dev *dev)
goto out_rx; goto out_rx;
} }
/* Allow the RC sysfs nodes to be accessible */
atomic_set(&dev->initialized, 1);
IR_dprintk(1, "Registered rc%u (driver: %s)\n", IR_dprintk(1, "Registered rc%u (driver: %s)\n",
dev->minor, dev->minor,
dev->driver_name ? dev->driver_name : "unknown"); dev->driver_name ? dev->driver_name : "unknown");
......
...@@ -70,7 +70,6 @@ enum rc_filter_type { ...@@ -70,7 +70,6 @@ enum rc_filter_type {
/** /**
* struct rc_dev - represents a remote control device * struct rc_dev - represents a remote control device
* @dev: driver model's view of this device * @dev: driver model's view of this device
* @initialized: 1 if the device init has completed, 0 otherwise
* @managed_alloc: devm_rc_allocate_device was used to create rc_dev * @managed_alloc: devm_rc_allocate_device was used to create rc_dev
* @sysfs_groups: sysfs attribute groups * @sysfs_groups: sysfs attribute groups
* @input_name: name of the input child device * @input_name: name of the input child device
...@@ -137,7 +136,6 @@ enum rc_filter_type { ...@@ -137,7 +136,6 @@ enum rc_filter_type {
*/ */
struct rc_dev { struct rc_dev {
struct device dev; struct device dev;
atomic_t initialized;
bool managed_alloc; bool managed_alloc;
const struct attribute_group *sysfs_groups[5]; const struct attribute_group *sysfs_groups[5];
const char *input_name; const char *input_name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment