/* * V4L2 flash LED sub-device registration helpers. * * Copyright (C) 2015 Samsung Electronics Co., Ltd * Author: Jacek Anaszewski * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef _V4L2_FLASH_H #define _V4L2_FLASH_H #include #include struct led_classdev_flash; struct led_classdev; struct v4l2_flash; enum led_brightness; /** * struct v4l2_flash_ctrl_data - flash control initialization data, filled * basing on the features declared by the LED flash * class driver in the v4l2_flash_config * @config: initialization data for a control * @cid: contains v4l2 flash control id if the config * field was initialized, 0 otherwise */ struct v4l2_flash_ctrl_data { struct v4l2_ctrl_config config; u32 cid; }; /** * struct v4l2_flash_ops - V4L2 flash operations * * @external_strobe_set: Setup strobing the flash by hardware pin state * assertion. * @intensity_to_led_brightness: Convert intensity to brightness in a device * specific manner * @led_brightness_to_intensity: convert brightness to intensity in a device * specific manner. */ struct v4l2_flash_ops { int (*external_strobe_set)(struct v4l2_flash *v4l2_flash, bool enable); enum led_brightness (*intensity_to_led_brightness) (struct v4l2_flash *v4l2_flash, s32 intensity); s32 (*led_brightness_to_intensity) (struct v4l2_flash *v4l2_flash, enum led_brightness); }; /** * struct v4l2_flash_config - V4L2 Flash sub-device initialization data * @dev_name: the name of the media entity, * unique in the system * @torch_intensity: constraints for the LED in torch mode * @indicator_intensity: constraints for the indicator LED * @flash_faults: bitmask of flash faults that the LED flash class * device can report; corresponding LED_FAULT* bit * definitions are available in the header file * * @has_external_strobe: external strobe capability */ struct v4l2_flash_config { char dev_name[32]; struct led_flash_setting torch_intensity; struct led_flash_setting indicator_intensity; u32 flash_faults; unsigned int has_external_strobe:1; }; /** * struct v4l2_flash - Flash sub-device context * @fled_cdev: LED flash class device controlled by this sub-device * @iled_cdev: LED class device representing indicator LED associated * with the LED flash class device * @ops: V4L2 specific flash ops * @sd: V4L2 sub-device * @hdl: flash controls handler * @ctrls: array of pointers to controls, whose values define * the sub-device state */ struct v4l2_flash { struct led_classdev_flash *fled_cdev; struct led_classdev_flash *iled_cdev; const struct v4l2_flash_ops *ops; struct v4l2_subdev sd; struct v4l2_ctrl_handler hdl; struct v4l2_ctrl **ctrls; }; static inline struct v4l2_flash *v4l2_subdev_to_v4l2_flash( struct v4l2_subdev *sd) { return container_of(sd, struct v4l2_flash, sd); } static inline struct v4l2_flash *v4l2_ctrl_to_v4l2_flash(struct v4l2_ctrl *c) { return container_of(c->handler, struct v4l2_flash, hdl); } #if IS_ENABLED(CONFIG_V4L2_FLASH_LED_CLASS) /** * v4l2_flash_init - initialize V4L2 flash led sub-device * @dev: flash device, e.g. an I2C device * @of_node: of_node of the LED, may be NULL if the same as device's * @fled_cdev: LED flash class device to wrap * @iled_cdev: LED flash class device representing indicator LED associated * with fled_cdev, may be NULL * @ops: V4L2 Flash device ops * @config: initialization data for V4L2 Flash sub-device * * Create V4L2 Flash sub-device wrapping given LED subsystem device. * * Returns: A valid pointer, or, when an error occurs, the return * value is encoded using ERR_PTR(). Use IS_ERR() to check and * PTR_ERR() to obtain the numeric return value. */ struct v4l2_flash *v4l2_flash_init( struct device *dev, struct device_node *of_node, struct led_classdev_flash *fled_cdev, struct led_classdev_flash *iled_cdev, const struct v4l2_flash_ops *ops, struct v4l2_flash_config *config); /** * v4l2_flash_release - release V4L2 Flash sub-device * @v4l2_flash: the V4L2 Flash sub-device to release * * Release V4L2 Flash sub-device. */ void v4l2_flash_release(struct v4l2_flash *v4l2_flash); #else static inline struct v4l2_flash *v4l2_flash_init( struct device *dev, struct device_node *of_node, struct led_classdev_flash *fled_cdev, struct led_classdev_flash *iled_cdev, const struct v4l2_flash_ops *ops, struct v4l2_flash_config *config) { return NULL; } static inline void v4l2_flash_release(struct v4l2_flash *v4l2_flash) { } #endif /* CONFIG_V4L2_FLASH_LED_CLASS */ #endif /* _V4L2_FLASH_H */ .h?id=dd86e373e09fb16b83e8adf5c48c421a4ca76468'>dd86e373e09fb16b83e8adf5c48c421a4ca76468 (patch) tree55703c2ea8584e303e342090614e0aab3509ab21 /net/tipc/core.h parent0b3589be9b98994ce3d5aeca52445d1f5627c4ba (diff)
perf/x86/intel/rapl: Make package handling more robust
The package management code in RAPL relies on package mapping being available before a CPU is started. This changed with: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") because the ACPI/BIOS information turned out to be unreliable, but that left RAPL in broken state. This was not noticed because on a regular boot all CPUs are online before RAPL is initialized. A possible fix would be to reintroduce the mess which allocates a package data structure in CPU prepare and when it turns out to already exist in starting throw it away later in the CPU online callback. But that's a horrible hack and not required at all because RAPL becomes functional for perf only in the CPU online callback. That's correct because user space is not yet informed about the CPU being onlined, so nothing caan rely on RAPL being available on that particular CPU. Move the allocation to the CPU online callback and simplify the hotplug handling. At this point the package mapping is established and correct. This also adds a missing check for available package data in the event_init() function. Reported-by: Yasuaki Ishimatsu <yasu.isimatu@gmail.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sebastian Siewior <bigeasy@linutronix.de> Cc: Stephane Eranian <eranian@google.com> Cc: Vince Weaver <vincent.weaver@maine.edu> Fixes: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") Link: http://lkml.kernel.org/r/20170131230141.212593966@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/tipc/core.h')