mirror of
https://github.com/t2linux/kernel.git
synced 2026-04-30 13:48:59 -07:00
Merge tag 'char-misc-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char / misc driver patches from Greg KH: "Here's the big driver misc / char pull request for 3.17-rc1. Lots of things in here, the thunderbolt support for Apple laptops, some other new drivers, testing fixes, and other good things. All have been in linux-next for a long time" * tag 'char-misc-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (119 commits) misc: bh1780: Introduce the use of devm_kzalloc Lattice ECP3 FPGA: Correct endianness drivers/misc/ti-st: Load firmware from ti-connectivity directory. dt-bindings: extcon: Add support for SM5502 MUIC device extcon: sm5502: Change internal hardware switch according to cable type extcon: sm5502: Detect cable state after completing platform booting extcon: sm5502: Add support new SM5502 extcon device driver extcon: arizona: Get MICVDD against extcon device extcon: Remove unnecessary OOM messages misc: vexpress: Fix sparse non static symbol warnings mei: drop unused hw dependent fw status functions misc: bh1770glc: Use managed functions pcmcia: remove DEFINE_PCI_DEVICE_TABLE usage misc: remove DEFINE_PCI_DEVICE_TABLE usage ipack: Replace DEFINE_PCI_DEVICE_TABLE macro use drivers/char/dsp56k.c: drop check for negativity of unsigned parameter mei: fix return value on disconnect timeout mei: don't schedule suspend in pm idle mei: start disconnect request timer consistently mei: reset client connection state on timeout ...
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
What: /sys/class/mei/
|
||||
Date: May 2014
|
||||
KernelVersion: 3.17
|
||||
Contact: Tomas Winkler <tomas.winkler@intel.com>
|
||||
Description:
|
||||
The mei/ class sub-directory belongs to mei device class
|
||||
|
||||
|
||||
What: /sys/class/mei/meiN/
|
||||
Date: May 2014
|
||||
KernelVersion: 3.17
|
||||
Contact: Tomas Winkler <tomas.winkler@intel.com>
|
||||
Description:
|
||||
The /sys/class/mei/meiN directory is created for
|
||||
each probed mei device
|
||||
|
||||
@@ -25,6 +25,15 @@ Date: Oct 2013
|
||||
Contact: haver@linux.vnet.ibm.com
|
||||
Description: Interface to set the next bitstream to be used.
|
||||
|
||||
What: /sys/class/genwqe/genwqe<n>_card/reload_bitstream
|
||||
Date: May 2014
|
||||
Contact: klebers@linux.vnet.ibm.com
|
||||
Description: Interface to trigger a PCIe card reset to reload the bitstream.
|
||||
sudo sh -c 'echo 1 > \
|
||||
/sys/class/genwqe/genwqe0_card/reload_bitstream'
|
||||
If successfully, the card will come back with the bitstream set
|
||||
on 'next_bitstream'.
|
||||
|
||||
What: /sys/class/genwqe/genwqe<n>_card/tempsens
|
||||
Date: Oct 2013
|
||||
Contact: haver@linux.vnet.ibm.com
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
|
||||
* SM5502 MUIC (Micro-USB Interface Controller) device
|
||||
|
||||
The Silicon Mitus SM5502 is a MUIC (Micro-USB Interface Controller) device
|
||||
which can detect the state of external accessory when external accessory is
|
||||
attached or detached and button is pressed or released. It is interfaced to
|
||||
the host controller using an I2C interface.
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "siliconmitus,sm5502-muic"
|
||||
- reg: Specifies the I2C slave address of the MUIC block. It should be 0x25
|
||||
- interrupt-parent: Specifies the phandle of the interrupt controller to which
|
||||
the interrupts from sm5502 are delivered to.
|
||||
- interrupts: Interrupt specifiers for detection interrupt sources.
|
||||
|
||||
Example:
|
||||
|
||||
sm5502@25 {
|
||||
compatible = "siliconmitus,sm5502-muic";
|
||||
interrupt-parent = <&gpx1>;
|
||||
interrupts = <5 0>;
|
||||
reg = <0x25>;
|
||||
};
|
||||
@@ -17,35 +17,50 @@ for applications. A key benefit of our solution is that it leverages
|
||||
the standard virtio framework for network, disk and console devices,
|
||||
though in our case the virtio framework is used across a PCIe bus.
|
||||
|
||||
MIC PCIe card has a dma controller with 8 channels. These channels are
|
||||
shared between the host s/w and the card s/w. 0 to 3 are used by host
|
||||
and 4 to 7 by card. As the dma device doesn't show up as PCIe device,
|
||||
a virtual bus called mic bus is created and virtual dma devices are
|
||||
created on it by the host/card drivers. On host the channels are private
|
||||
and used only by the host driver to transfer data for the virtio devices.
|
||||
|
||||
Here is a block diagram of the various components described above. The
|
||||
virtio backends are situated on the host rather than the card given better
|
||||
single threaded performance for the host compared to MIC, the ability of
|
||||
the host to initiate DMA's to/from the card using the MIC DMA engine and
|
||||
the fact that the virtio block storage backend can only be on the host.
|
||||
|
||||
|
|
||||
+----------+ | +----------+
|
||||
| Card OS | | | Host OS |
|
||||
+----------+ | +----------+
|
||||
|
|
||||
+-------+ +--------+ +------+ | +---------+ +--------+ +--------+
|
||||
| Virtio| |Virtio | |Virtio| | |Virtio | |Virtio | |Virtio |
|
||||
| Net | |Console | |Block | | |Net | |Console | |Block |
|
||||
| Driver| |Driver | |Driver| | |backend | |backend | |backend |
|
||||
+-------+ +--------+ +------+ | +---------+ +--------+ +--------+
|
||||
| | | | | | |
|
||||
| | | |User | | |
|
||||
| | | |------|------------|---------|-------
|
||||
+-------------------+ |Kernel +--------------------------+
|
||||
| | | Virtio over PCIe IOCTLs |
|
||||
| | +--------------------------+
|
||||
+--------------+ | |
|
||||
|Intel MIC | | +---------------+
|
||||
|Card Driver | | |Intel MIC |
|
||||
+--------------+ | |Host Driver |
|
||||
| | +---------------+
|
||||
| | |
|
||||
+-------------------------------------------------------------+
|
||||
| |
|
||||
| PCIe Bus |
|
||||
+-------------------------------------------------------------+
|
||||
|
|
||||
+----------+ | +----------+
|
||||
| Card OS | | | Host OS |
|
||||
+----------+ | +----------+
|
||||
|
|
||||
+-------+ +--------+ +------+ | +---------+ +--------+ +--------+
|
||||
| Virtio| |Virtio | |Virtio| | |Virtio | |Virtio | |Virtio |
|
||||
| Net | |Console | |Block | | |Net | |Console | |Block |
|
||||
| Driver| |Driver | |Driver| | |backend | |backend | |backend |
|
||||
+-------+ +--------+ +------+ | +---------+ +--------+ +--------+
|
||||
| | | | | | |
|
||||
| | | |User | | |
|
||||
| | | |------|------------|---------|-------
|
||||
+-------------------+ |Kernel +--------------------------+
|
||||
| | | Virtio over PCIe IOCTLs |
|
||||
| | +--------------------------+
|
||||
+-----------+ | | | +-----------+
|
||||
| MIC DMA | | | | | MIC DMA |
|
||||
| Driver | | | | | Driver |
|
||||
+-----------+ | | | +-----------+
|
||||
| | | | |
|
||||
+---------------+ | | | +----------------+
|
||||
|MIC virtual Bus| | | | |MIC virtual Bus |
|
||||
+---------------+ | | | +----------------+
|
||||
| | | | |
|
||||
| +--------------+ | +---------------+ |
|
||||
| |Intel MIC | | |Intel MIC | |
|
||||
+---|Card Driver | | |Host Driver | |
|
||||
+--------------+ | +---------------+-----+
|
||||
| | |
|
||||
+-------------------------------------------------------------+
|
||||
| |
|
||||
| PCIe Bus |
|
||||
+-------------------------------------------------------------+
|
||||
|
||||
@@ -48,18 +48,18 @@ start()
|
||||
fi
|
||||
|
||||
echo -e $"Starting MPSS Stack"
|
||||
echo -e $"Loading MIC_HOST Module"
|
||||
echo -e $"Loading MIC_X100_DMA & MIC_HOST Modules"
|
||||
|
||||
# Ensure the driver is loaded
|
||||
if [ ! -d "$sysfs" ]; then
|
||||
modprobe mic_host
|
||||
for f in "mic_host" "mic_x100_dma"
|
||||
do
|
||||
modprobe $f
|
||||
RETVAL=$?
|
||||
if [ $RETVAL -ne 0 ]; then
|
||||
failure
|
||||
echo
|
||||
return $RETVAL
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Start the daemon
|
||||
echo -n $"Starting MPSSD "
|
||||
@@ -170,8 +170,8 @@ unload()
|
||||
stop
|
||||
|
||||
sleep 5
|
||||
echo -n $"Removing MIC_HOST Module: "
|
||||
modprobe -r mic_host
|
||||
echo -n $"Removing MIC_HOST & MIC_X100_DMA Modules: "
|
||||
modprobe -r mic_host mic_x100_dma
|
||||
RETVAL=$?
|
||||
[ $RETVAL -ne 0 ] && failure || success
|
||||
echo
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
w1_ds2406 kernel driver
|
||||
=======================
|
||||
|
||||
Supported chips:
|
||||
* Maxim DS2406 (and other family 0x12) addressable switches
|
||||
|
||||
Author: Scott Alfter <scott@alfter.us>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The w1_ds2406 driver allows connected devices to be switched on and off.
|
||||
These chips also provide 128 bytes of OTP EPROM, but reading/writing it is
|
||||
not supported. In TSOC-6 form, the DS2406 provides two switch outputs and
|
||||
can be provided with power on a dedicated input. In TO-92 form, it provides
|
||||
one output and uses parasitic power only.
|
||||
|
||||
The driver provides two sysfs files. state is readable; it gives the
|
||||
current state of each switch, with PIO A in bit 0 and PIO B in bit 1. The
|
||||
driver ORs this state with 0x30, so shell scripts get an ASCII 0/1/2/3 to
|
||||
work with. output is writable; bits 0 and 1 control PIO A and B,
|
||||
respectively. Bits 2-7 are ignored, so it's safe to write ASCII data.
|
||||
|
||||
CRCs are checked on read and write. Failed checks cause an I/O error to be
|
||||
returned. On a failed write, the switch status is not changed.
|
||||
@@ -7844,6 +7844,11 @@ S: Maintained
|
||||
F: include/linux/mmc/dw_mmc.h
|
||||
F: drivers/mmc/host/dw_mmc*
|
||||
|
||||
THUNDERBOLT DRIVER
|
||||
M: Andreas Noever <andreas.noever@gmail.com>
|
||||
S: Maintained
|
||||
F: drivers/thunderbolt/
|
||||
|
||||
TIMEKEEPING, CLOCKSOURCE CORE, NTP
|
||||
M: John Stultz <john.stultz@linaro.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
@@ -178,4 +178,6 @@ source "drivers/mcb/Kconfig"
|
||||
|
||||
source "drivers/ras/Kconfig"
|
||||
|
||||
source "drivers/thunderbolt/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -159,3 +159,4 @@ obj-$(CONFIG_FMC) += fmc/
|
||||
obj-$(CONFIG_POWERCAP) += powercap/
|
||||
obj-$(CONFIG_MCB) += mcb/
|
||||
obj-$(CONFIG_RAS) += ras/
|
||||
obj-$(CONFIG_THUNDERBOLT) += thunderbolt/
|
||||
|
||||
+1
-1
@@ -259,7 +259,7 @@ static int bsr_add_node(struct device_node *bn)
|
||||
}
|
||||
|
||||
cur->bsr_device = device_create(bsr_class, NULL, cur->bsr_dev,
|
||||
cur, cur->bsr_name);
|
||||
cur, "%s", cur->bsr_name);
|
||||
if (IS_ERR(cur->bsr_device)) {
|
||||
printk(KERN_ERR "device_create failed for %s\n",
|
||||
cur->bsr_name);
|
||||
|
||||
@@ -383,7 +383,7 @@ static long dsp56k_ioctl(struct file *file, unsigned int cmd,
|
||||
return put_user(status, &hf->status);
|
||||
}
|
||||
case DSP56K_HOST_CMD:
|
||||
if (arg > 31 || arg < 0)
|
||||
if (arg > 31)
|
||||
return -EINVAL;
|
||||
mutex_lock(&dsp56k_mutex);
|
||||
dsp56k_host_interface.cvr = (u_char)((arg & DSP56K_CVR_HV_MASK) |
|
||||
|
||||
+82
-41
@@ -65,6 +65,8 @@ static char bios_version[4];
|
||||
static struct device *i8k_hwmon_dev;
|
||||
static u32 i8k_hwmon_flags;
|
||||
static int i8k_fan_mult;
|
||||
static int i8k_pwm_mult;
|
||||
static int i8k_fan_max = I8K_FAN_HIGH;
|
||||
|
||||
#define I8K_HWMON_HAVE_TEMP1 (1 << 0)
|
||||
#define I8K_HWMON_HAVE_TEMP2 (1 << 1)
|
||||
@@ -97,6 +99,10 @@ static int fan_mult = I8K_FAN_MULT;
|
||||
module_param(fan_mult, int, 0);
|
||||
MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with");
|
||||
|
||||
static int fan_max = I8K_FAN_HIGH;
|
||||
module_param(fan_max, int, 0);
|
||||
MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed");
|
||||
|
||||
static int i8k_open_fs(struct inode *inode, struct file *file);
|
||||
static long i8k_ioctl(struct file *, unsigned int, unsigned long);
|
||||
|
||||
@@ -276,7 +282,7 @@ static int i8k_set_fan(int fan, int speed)
|
||||
{
|
||||
struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, };
|
||||
|
||||
speed = (speed < 0) ? 0 : ((speed > I8K_FAN_MAX) ? I8K_FAN_MAX : speed);
|
||||
speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed);
|
||||
regs.ebx = (fan & 0xff) | (speed << 8);
|
||||
|
||||
return i8k_smm(®s) ? : i8k_get_fan_status(fan);
|
||||
@@ -521,7 +527,7 @@ static ssize_t i8k_hwmon_show_pwm(struct device *dev,
|
||||
status = i8k_get_fan_status(index);
|
||||
if (status < 0)
|
||||
return -EIO;
|
||||
return sprintf(buf, "%d\n", clamp_val(status * 128, 0, 255));
|
||||
return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255));
|
||||
}
|
||||
|
||||
static ssize_t i8k_hwmon_set_pwm(struct device *dev,
|
||||
@@ -535,7 +541,7 @@ static ssize_t i8k_hwmon_set_pwm(struct device *dev,
|
||||
err = kstrtoul(buf, 10, &val);
|
||||
if (err)
|
||||
return err;
|
||||
val = clamp_val(DIV_ROUND_CLOSEST(val, 128), 0, 2);
|
||||
val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max);
|
||||
|
||||
mutex_lock(&i8k_mutex);
|
||||
err = i8k_set_fan(index, val);
|
||||
@@ -544,20 +550,6 @@ static ssize_t i8k_hwmon_set_pwm(struct device *dev,
|
||||
return err < 0 ? -EIO : count;
|
||||
}
|
||||
|
||||
static ssize_t i8k_hwmon_show_label(struct device *dev,
|
||||
struct device_attribute *devattr,
|
||||
char *buf)
|
||||
{
|
||||
static const char *labels[3] = {
|
||||
"CPU",
|
||||
"Left Fan",
|
||||
"Right Fan",
|
||||
};
|
||||
int index = to_sensor_dev_attr(devattr)->index;
|
||||
|
||||
return sprintf(buf, "%s\n", labels[index]);
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2);
|
||||
@@ -570,41 +562,34 @@ static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL,
|
||||
I8K_FAN_RIGHT);
|
||||
static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm,
|
||||
i8k_hwmon_set_pwm, I8K_FAN_RIGHT);
|
||||
static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_label, NULL, 0);
|
||||
static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_label, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_label, NULL, 2);
|
||||
|
||||
static struct attribute *i8k_attrs[] = {
|
||||
&sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */
|
||||
&sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */
|
||||
&sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */
|
||||
&sensor_dev_attr_temp3_input.dev_attr.attr, /* 3 */
|
||||
&sensor_dev_attr_temp4_input.dev_attr.attr, /* 4 */
|
||||
&sensor_dev_attr_fan1_input.dev_attr.attr, /* 5 */
|
||||
&sensor_dev_attr_pwm1.dev_attr.attr, /* 6 */
|
||||
&sensor_dev_attr_fan1_label.dev_attr.attr, /* 7 */
|
||||
&sensor_dev_attr_fan2_input.dev_attr.attr, /* 8 */
|
||||
&sensor_dev_attr_pwm2.dev_attr.attr, /* 9 */
|
||||
&sensor_dev_attr_fan2_label.dev_attr.attr, /* 10 */
|
||||
&sensor_dev_attr_temp2_input.dev_attr.attr, /* 1 */
|
||||
&sensor_dev_attr_temp3_input.dev_attr.attr, /* 2 */
|
||||
&sensor_dev_attr_temp4_input.dev_attr.attr, /* 3 */
|
||||
&sensor_dev_attr_fan1_input.dev_attr.attr, /* 4 */
|
||||
&sensor_dev_attr_pwm1.dev_attr.attr, /* 5 */
|
||||
&sensor_dev_attr_fan2_input.dev_attr.attr, /* 6 */
|
||||
&sensor_dev_attr_pwm2.dev_attr.attr, /* 7 */
|
||||
NULL
|
||||
};
|
||||
|
||||
static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||
int index)
|
||||
{
|
||||
if ((index == 0 || index == 1) &&
|
||||
!(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1))
|
||||
if (index == 0 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1))
|
||||
return 0;
|
||||
if (index == 2 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2))
|
||||
if (index == 1 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2))
|
||||
return 0;
|
||||
if (index == 3 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3))
|
||||
if (index == 2 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3))
|
||||
return 0;
|
||||
if (index == 4 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4))
|
||||
if (index == 3 && !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4))
|
||||
return 0;
|
||||
if (index >= 5 && index <= 7 &&
|
||||
if (index >= 4 && index <= 5 &&
|
||||
!(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1))
|
||||
return 0;
|
||||
if (index >= 8 && index <= 10 &&
|
||||
if (index >= 6 && index <= 7 &&
|
||||
!(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2))
|
||||
return 0;
|
||||
|
||||
@@ -659,6 +644,37 @@ static int __init i8k_init_hwmon(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct i8k_config_data {
|
||||
int fan_mult;
|
||||
int fan_max;
|
||||
};
|
||||
|
||||
enum i8k_configs {
|
||||
DELL_LATITUDE_D520,
|
||||
DELL_PRECISION_490,
|
||||
DELL_STUDIO,
|
||||
DELL_XPS_M140,
|
||||
};
|
||||
|
||||
static const struct i8k_config_data i8k_config_data[] = {
|
||||
[DELL_LATITUDE_D520] = {
|
||||
.fan_mult = 1,
|
||||
.fan_max = I8K_FAN_TURBO,
|
||||
},
|
||||
[DELL_PRECISION_490] = {
|
||||
.fan_mult = 1,
|
||||
.fan_max = I8K_FAN_TURBO,
|
||||
},
|
||||
[DELL_STUDIO] = {
|
||||
.fan_mult = 1,
|
||||
.fan_max = I8K_FAN_HIGH,
|
||||
},
|
||||
[DELL_XPS_M140] = {
|
||||
.fan_mult = 1,
|
||||
.fan_max = I8K_FAN_HIGH,
|
||||
},
|
||||
};
|
||||
|
||||
static struct dmi_system_id i8k_dmi_table[] __initdata = {
|
||||
{
|
||||
.ident = "Dell Inspiron",
|
||||
@@ -681,6 +697,14 @@ static struct dmi_system_id i8k_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Dell Latitude D520",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"),
|
||||
},
|
||||
.driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520],
|
||||
},
|
||||
{
|
||||
.ident = "Dell Latitude 2",
|
||||
.matches = {
|
||||
@@ -702,6 +726,15 @@ static struct dmi_system_id i8k_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MP061"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Dell Precision 490",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,
|
||||
"Precision WorkStation 490"),
|
||||
},
|
||||
.driver_data = (void *)&i8k_config_data[DELL_PRECISION_490],
|
||||
},
|
||||
{
|
||||
.ident = "Dell Precision",
|
||||
.matches = {
|
||||
@@ -729,7 +762,7 @@ static struct dmi_system_id i8k_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Studio"),
|
||||
},
|
||||
.driver_data = (void *)1, /* fan multiplier override */
|
||||
.driver_data = (void *)&i8k_config_data[DELL_STUDIO],
|
||||
},
|
||||
{
|
||||
.ident = "Dell XPS M140",
|
||||
@@ -737,7 +770,7 @@ static struct dmi_system_id i8k_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"),
|
||||
},
|
||||
.driver_data = (void *)1, /* fan multiplier override */
|
||||
.driver_data = (void *)&i8k_config_data[DELL_XPS_M140],
|
||||
},
|
||||
{ }
|
||||
};
|
||||
@@ -777,9 +810,17 @@ static int __init i8k_probe(void)
|
||||
}
|
||||
|
||||
i8k_fan_mult = fan_mult;
|
||||
i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */
|
||||
id = dmi_first_match(i8k_dmi_table);
|
||||
if (id && fan_mult == I8K_FAN_MULT && id->driver_data)
|
||||
i8k_fan_mult = (unsigned long)id->driver_data;
|
||||
if (id && id->driver_data) {
|
||||
const struct i8k_config_data *conf = id->driver_data;
|
||||
|
||||
if (fan_mult == I8K_FAN_MULT && conf->fan_mult)
|
||||
i8k_fan_mult = conf->fan_mult;
|
||||
if (fan_max == I8K_FAN_HIGH && conf->fan_max)
|
||||
i8k_fan_max = conf->fan_max;
|
||||
}
|
||||
i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -661,6 +661,7 @@ static int hwicap_setup(struct device *dev, int id,
|
||||
drvdata->base_address = ioremap(drvdata->mem_start, drvdata->mem_size);
|
||||
if (!drvdata->base_address) {
|
||||
dev_err(dev, "ioremap() failed\n");
|
||||
retval = -ENOMEM;
|
||||
goto failed2;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,24 @@ if DMADEVICES
|
||||
|
||||
comment "DMA Devices"
|
||||
|
||||
config INTEL_MIC_X100_DMA
|
||||
tristate "Intel MIC X100 DMA Driver"
|
||||
depends on 64BIT && X86 && INTEL_MIC_BUS
|
||||
select DMA_ENGINE
|
||||
help
|
||||
This enables DMA support for the Intel Many Integrated Core
|
||||
(MIC) family of PCIe form factor coprocessor X100 devices that
|
||||
run a 64 bit Linux OS. This driver will be used by both MIC
|
||||
host and card drivers.
|
||||
|
||||
If you are building host kernel with a MIC device or a card
|
||||
kernel for a MIC device, then say M (recommended) or Y, else
|
||||
say N. If unsure say N.
|
||||
|
||||
More information about the Intel MIC family as well as the Linux
|
||||
OS and tools for MIC to use with this driver are available from
|
||||
<http://software.intel.com/en-us/mic-developer>.
|
||||
|
||||
config INTEL_MID_DMAC
|
||||
tristate "Intel MID DMA support for Peripheral DMA controllers"
|
||||
depends on PCI && X86
|
||||
|
||||
@@ -47,3 +47,4 @@ obj-$(CONFIG_MOXART_DMA) += moxart-dma.o
|
||||
obj-$(CONFIG_FSL_EDMA) += fsl-edma.o
|
||||
obj-$(CONFIG_QCOM_BAM_DMA) += qcom_bam_dma.o
|
||||
obj-y += xilinx/
|
||||
obj-$(CONFIG_INTEL_MIC_X100_DMA) += mic_x100_dma.o
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Intel MIC Platform Software Stack (MPSS)
|
||||
*
|
||||
* Copyright(c) 2014 Intel Corporation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in
|
||||
* the file called "COPYING".
|
||||
*
|
||||
* Intel MIC X100 DMA Driver.
|
||||
*
|
||||
* Adapted from IOAT dma driver.
|
||||
*/
|
||||
#ifndef _MIC_X100_DMA_H_
|
||||
#define _MIC_X100_DMA_H_
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mic_bus.h>
|
||||
|
||||
#include "dmaengine.h"
|
||||
|
||||
/*
|
||||
* MIC has a total of 8 dma channels.
|
||||
* Four channels are assigned for host SW use & the remaining for MIC SW.
|
||||
* MIC DMA transfer size & addresses need to be 64 byte aligned.
|
||||
*/
|
||||
#define MIC_DMA_MAX_NUM_CHAN 8
|
||||
#define MIC_DMA_NUM_CHAN 4
|
||||
#define MIC_DMA_ALIGN_SHIFT 6
|
||||
#define MIC_DMA_ALIGN_BYTES (1 << MIC_DMA_ALIGN_SHIFT)
|
||||
#define MIC_DMA_DESC_RX_SIZE (128 * 1024 - 4)
|
||||
|
||||
/*
|
||||
* Register descriptions
|
||||
* All the registers are 32 bit registers.
|
||||
* DCR is a global register and all others are per-channel.
|
||||
* DCR - bits 0, 2, 4, 6, 8, 10, 12, 14 - enable bits for channels 0 to 7
|
||||
* bits 1, 3, 5, 7, 9, 11, 13, 15 - owner bits for channels 0 to 7
|
||||
* DCAR - bit 24 & 25 interrupt masks for mic owned & host owned channels
|
||||
* DHPR - head of the descriptor ring updated by s/w
|
||||
* DTPR - tail of the descriptor ring updated by h/w
|
||||
* DRAR_LO - lower 32 bits of descriptor ring's mic address
|
||||
* DRAR_HI - 3:0 - remaining 4 bits of descriptor ring's mic address
|
||||
* 20:4 descriptor ring size
|
||||
* 25:21 mic smpt entry number
|
||||
* DSTAT - 16:0 h/w completion count; 31:28 dma engine status
|
||||
* DCHERR - this register is non-zero on error
|
||||
* DCHERRMSK - interrupt mask register
|
||||
*/
|
||||
#define MIC_DMA_HW_CMP_CNT_MASK 0x1ffff
|
||||
#define MIC_DMA_CHAN_QUIESCE 0x20000000
|
||||
#define MIC_DMA_SBOX_BASE 0x00010000
|
||||
#define MIC_DMA_SBOX_DCR 0x0000A280
|
||||
#define MIC_DMA_SBOX_CH_BASE 0x0001A000
|
||||
#define MIC_DMA_SBOX_CHAN_OFF 0x40
|
||||
#define MIC_DMA_SBOX_DCAR_IM0 (0x1 << 24)
|
||||
#define MIC_DMA_SBOX_DCAR_IM1 (0x1 << 25)
|
||||
#define MIC_DMA_SBOX_DRARHI_SYS_MASK (0x1 << 26)
|
||||
#define MIC_DMA_REG_DCAR 0
|
||||
#define MIC_DMA_REG_DHPR 4
|
||||
#define MIC_DMA_REG_DTPR 8
|
||||
#define MIC_DMA_REG_DRAR_LO 20
|
||||
#define MIC_DMA_REG_DRAR_HI 24
|
||||
#define MIC_DMA_REG_DSTAT 32
|
||||
#define MIC_DMA_REG_DCHERR 44
|
||||
#define MIC_DMA_REG_DCHERRMSK 48
|
||||
|
||||
/* HW dma desc */
|
||||
struct mic_dma_desc {
|
||||
u64 qw0;
|
||||
u64 qw1;
|
||||
};
|
||||
|
||||
enum mic_dma_chan_owner {
|
||||
MIC_DMA_CHAN_MIC = 0,
|
||||
MIC_DMA_CHAN_HOST
|
||||
};
|
||||
|
||||
/*
|
||||
* mic_dma_chan - channel specific information
|
||||
* @ch_num: channel number
|
||||
* @owner: owner of this channel
|
||||
* @last_tail: cached value of descriptor ring tail
|
||||
* @head: index of next descriptor in desc_ring
|
||||
* @issued: hardware notification point
|
||||
* @submitted: index that will be used to submit descriptors to h/w
|
||||
* @api_ch: dma engine api channel
|
||||
* @desc_ring: dma descriptor ring
|
||||
* @desc_ring_micpa: mic physical address of desc_ring
|
||||
* @status_dest: destination for status (fence) descriptor
|
||||
* @status_dest_micpa: mic address for status_dest,
|
||||
* DMA controller uses this address
|
||||
* @tx_array: array of async_tx
|
||||
* @cleanup_lock: lock held when processing completed tx
|
||||
* @prep_lock: lock held in prep_memcpy & released in tx_submit
|
||||
* @issue_lock: lock used to synchronize writes to head
|
||||
* @cookie: mic_irq cookie used with mic irq request
|
||||
*/
|
||||
struct mic_dma_chan {
|
||||
int ch_num;
|
||||
enum mic_dma_chan_owner owner;
|
||||
u32 last_tail;
|
||||
u32 head;
|
||||
u32 issued;
|
||||
u32 submitted;
|
||||
struct dma_chan api_ch;
|
||||
struct mic_dma_desc *desc_ring;
|
||||
dma_addr_t desc_ring_micpa;
|
||||
u64 *status_dest;
|
||||
dma_addr_t status_dest_micpa;
|
||||
struct dma_async_tx_descriptor *tx_array;
|
||||
spinlock_t cleanup_lock;
|
||||
spinlock_t prep_lock;
|
||||
spinlock_t issue_lock;
|
||||
struct mic_irq *cookie;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct mic_dma_device - per mic device
|
||||
* @mic_ch: dma channels
|
||||
* @dma_dev: underlying dma device
|
||||
* @mbdev: mic bus dma device
|
||||
* @mmio: virtual address of the mmio space
|
||||
* @dbg_dir: debugfs directory
|
||||
* @start_ch: first channel number that can be used
|
||||
* @max_xfer_size: maximum transfer size per dma descriptor
|
||||
*/
|
||||
struct mic_dma_device {
|
||||
struct mic_dma_chan mic_ch[MIC_DMA_MAX_NUM_CHAN];
|
||||
struct dma_device dma_dev;
|
||||
struct mbus_device *mbdev;
|
||||
void __iomem *mmio;
|
||||
struct dentry *dbg_dir;
|
||||
int start_ch;
|
||||
size_t max_xfer_size;
|
||||
};
|
||||
|
||||
static inline struct mic_dma_chan *to_mic_dma_chan(struct dma_chan *ch)
|
||||
{
|
||||
return container_of(ch, struct mic_dma_chan, api_ch);
|
||||
}
|
||||
|
||||
static inline struct mic_dma_device *to_mic_dma_dev(struct mic_dma_chan *ch)
|
||||
{
|
||||
return
|
||||
container_of((const typeof(((struct mic_dma_device *)0)->mic_ch)*)
|
||||
(ch - ch->ch_num), struct mic_dma_device, mic_ch);
|
||||
}
|
||||
|
||||
static inline struct mbus_device *to_mbus_device(struct mic_dma_chan *ch)
|
||||
{
|
||||
return to_mic_dma_dev(ch)->mbdev;
|
||||
}
|
||||
|
||||
static inline struct mbus_hw_ops *to_mbus_hw_ops(struct mic_dma_chan *ch)
|
||||
{
|
||||
return to_mbus_device(ch)->hw_ops;
|
||||
}
|
||||
|
||||
static inline struct device *mic_dma_ch_to_device(struct mic_dma_chan *ch)
|
||||
{
|
||||
return to_mic_dma_dev(ch)->dma_dev.dev;
|
||||
}
|
||||
|
||||
static inline void __iomem *mic_dma_chan_to_mmio(struct mic_dma_chan *ch)
|
||||
{
|
||||
return to_mic_dma_dev(ch)->mmio;
|
||||
}
|
||||
|
||||
static inline u32 mic_dma_read_reg(struct mic_dma_chan *ch, u32 reg)
|
||||
{
|
||||
return ioread32(mic_dma_chan_to_mmio(ch) + MIC_DMA_SBOX_CH_BASE +
|
||||
ch->ch_num * MIC_DMA_SBOX_CHAN_OFF + reg);
|
||||
}
|
||||
|
||||
static inline void mic_dma_write_reg(struct mic_dma_chan *ch, u32 reg, u32 val)
|
||||
{
|
||||
iowrite32(val, mic_dma_chan_to_mmio(ch) + MIC_DMA_SBOX_CH_BASE +
|
||||
ch->ch_num * MIC_DMA_SBOX_CHAN_OFF + reg);
|
||||
}
|
||||
|
||||
static inline u32 mic_dma_mmio_read(struct mic_dma_chan *ch, u32 offset)
|
||||
{
|
||||
return ioread32(mic_dma_chan_to_mmio(ch) + offset);
|
||||
}
|
||||
|
||||
static inline void mic_dma_mmio_write(struct mic_dma_chan *ch, u32 val,
|
||||
u32 offset)
|
||||
{
|
||||
iowrite32(val, mic_dma_chan_to_mmio(ch) + offset);
|
||||
}
|
||||
|
||||
static inline u32 mic_dma_read_cmp_cnt(struct mic_dma_chan *ch)
|
||||
{
|
||||
return mic_dma_read_reg(ch, MIC_DMA_REG_DSTAT) &
|
||||
MIC_DMA_HW_CMP_CNT_MASK;
|
||||
}
|
||||
|
||||
static inline void mic_dma_chan_set_owner(struct mic_dma_chan *ch)
|
||||
{
|
||||
u32 dcr = mic_dma_mmio_read(ch, MIC_DMA_SBOX_BASE + MIC_DMA_SBOX_DCR);
|
||||
u32 chan_num = ch->ch_num;
|
||||
|
||||
dcr = (dcr & ~(0x1 << (chan_num * 2))) | (ch->owner << (chan_num * 2));
|
||||
mic_dma_mmio_write(ch, dcr, MIC_DMA_SBOX_BASE + MIC_DMA_SBOX_DCR);
|
||||
}
|
||||
|
||||
static inline void mic_dma_enable_chan(struct mic_dma_chan *ch)
|
||||
{
|
||||
u32 dcr = mic_dma_mmio_read(ch, MIC_DMA_SBOX_BASE + MIC_DMA_SBOX_DCR);
|
||||
|
||||
dcr |= 2 << (ch->ch_num << 1);
|
||||
mic_dma_mmio_write(ch, dcr, MIC_DMA_SBOX_BASE + MIC_DMA_SBOX_DCR);
|
||||
}
|
||||
|
||||
static inline void mic_dma_disable_chan(struct mic_dma_chan *ch)
|
||||
{
|
||||
u32 dcr = mic_dma_mmio_read(ch, MIC_DMA_SBOX_BASE + MIC_DMA_SBOX_DCR);
|
||||
|
||||
dcr &= ~(2 << (ch->ch_num << 1));
|
||||
mic_dma_mmio_write(ch, dcr, MIC_DMA_SBOX_BASE + MIC_DMA_SBOX_DCR);
|
||||
}
|
||||
|
||||
static void mic_dma_chan_set_desc_ring(struct mic_dma_chan *ch)
|
||||
{
|
||||
u32 drar_hi;
|
||||
dma_addr_t desc_ring_micpa = ch->desc_ring_micpa;
|
||||
|
||||
drar_hi = (MIC_DMA_DESC_RX_SIZE & 0x1ffff) << 4;
|
||||
if (MIC_DMA_CHAN_MIC == ch->owner) {
|
||||
drar_hi |= (desc_ring_micpa >> 32) & 0xf;
|
||||
} else {
|
||||
drar_hi |= MIC_DMA_SBOX_DRARHI_SYS_MASK;
|
||||
drar_hi |= ((desc_ring_micpa >> 34)
|
||||
& 0x1f) << 21;
|
||||
drar_hi |= (desc_ring_micpa >> 32) & 0x3;
|
||||
}
|
||||
mic_dma_write_reg(ch, MIC_DMA_REG_DRAR_LO, (u32) desc_ring_micpa);
|
||||
mic_dma_write_reg(ch, MIC_DMA_REG_DRAR_HI, drar_hi);
|
||||
}
|
||||
|
||||
static inline void mic_dma_chan_mask_intr(struct mic_dma_chan *ch)
|
||||
{
|
||||
u32 dcar = mic_dma_read_reg(ch, MIC_DMA_REG_DCAR);
|
||||
|
||||
if (MIC_DMA_CHAN_MIC == ch->owner)
|
||||
dcar |= MIC_DMA_SBOX_DCAR_IM0;
|
||||
else
|
||||
dcar |= MIC_DMA_SBOX_DCAR_IM1;
|
||||
mic_dma_write_reg(ch, MIC_DMA_REG_DCAR, dcar);
|
||||
}
|
||||
|
||||
static inline void mic_dma_chan_unmask_intr(struct mic_dma_chan *ch)
|
||||
{
|
||||
u32 dcar = mic_dma_read_reg(ch, MIC_DMA_REG_DCAR);
|
||||
|
||||
if (MIC_DMA_CHAN_MIC == ch->owner)
|
||||
dcar &= ~MIC_DMA_SBOX_DCAR_IM0;
|
||||
else
|
||||
dcar &= ~MIC_DMA_SBOX_DCAR_IM1;
|
||||
mic_dma_write_reg(ch, MIC_DMA_REG_DCAR, dcar);
|
||||
}
|
||||
|
||||
static void mic_dma_ack_interrupt(struct mic_dma_chan *ch)
|
||||
{
|
||||
if (MIC_DMA_CHAN_MIC == ch->owner) {
|
||||
/* HW errata */
|
||||
mic_dma_chan_mask_intr(ch);
|
||||
mic_dma_chan_unmask_intr(ch);
|
||||
}
|
||||
to_mbus_hw_ops(ch)->ack_interrupt(to_mbus_device(ch), ch->ch_num);
|
||||
}
|
||||
#endif
|
||||
+24
-14
@@ -14,6 +14,20 @@ if EXTCON
|
||||
|
||||
comment "Extcon Device Drivers"
|
||||
|
||||
config EXTCON_ADC_JACK
|
||||
tristate "ADC Jack extcon support"
|
||||
depends on IIO
|
||||
help
|
||||
Say Y here to enable extcon device driver based on ADC values.
|
||||
|
||||
config EXTCON_ARIZONA
|
||||
tristate "Wolfson Arizona EXTCON support"
|
||||
depends on MFD_ARIZONA && INPUT && SND_SOC
|
||||
help
|
||||
Say Y here to enable support for external accessory detection
|
||||
with Wolfson Arizona devices. These are audio CODECs with
|
||||
advanced audio accessory detection support.
|
||||
|
||||
config EXTCON_GPIO
|
||||
tristate "GPIO extcon support"
|
||||
depends on GPIOLIB
|
||||
@@ -21,12 +35,6 @@ config EXTCON_GPIO
|
||||
Say Y here to enable GPIO based extcon support. Note that GPIO
|
||||
extcon supports single state per extcon instance.
|
||||
|
||||
config EXTCON_ADC_JACK
|
||||
tristate "ADC Jack extcon support"
|
||||
depends on IIO
|
||||
help
|
||||
Say Y here to enable extcon device driver based on ADC values.
|
||||
|
||||
config EXTCON_MAX14577
|
||||
tristate "MAX14577/77836 EXTCON Support"
|
||||
depends on MFD_MAX14577
|
||||
@@ -55,14 +63,6 @@ config EXTCON_MAX8997
|
||||
Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
|
||||
detector and switch.
|
||||
|
||||
config EXTCON_ARIZONA
|
||||
tristate "Wolfson Arizona EXTCON support"
|
||||
depends on MFD_ARIZONA && INPUT && SND_SOC
|
||||
help
|
||||
Say Y here to enable support for external accessory detection
|
||||
with Wolfson Arizona devices. These are audio CODECs with
|
||||
advanced audio accessory detection support.
|
||||
|
||||
config EXTCON_PALMAS
|
||||
tristate "Palmas USB EXTCON support"
|
||||
depends on MFD_PALMAS
|
||||
@@ -70,4 +70,14 @@ config EXTCON_PALMAS
|
||||
Say Y here to enable support for USB peripheral and USB host
|
||||
detection by palmas usb.
|
||||
|
||||
config EXTCON_SM5502
|
||||
tristate "SM5502 EXTCON support"
|
||||
select IRQ_DOMAIN
|
||||
select REGMAP_I2C
|
||||
select REGMAP_IRQ
|
||||
help
|
||||
If you say yes here you get support for the MUIC device of
|
||||
Silicon Mitus SM5502. The SM5502 is a USB port accessory
|
||||
detector and switch.
|
||||
|
||||
endif # MULTISTATE_SWITCH
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#
|
||||
|
||||
# Makefile for external connector class (extcon) devices
|
||||
#
|
||||
|
||||
obj-$(CONFIG_EXTCON) += extcon-class.o
|
||||
obj-$(CONFIG_EXTCON_GPIO) += extcon-gpio.o
|
||||
obj-$(CONFIG_EXTCON_ADC_JACK) += extcon-adc-jack.o
|
||||
obj-$(CONFIG_EXTCON_ARIZONA) += extcon-arizona.o
|
||||
obj-$(CONFIG_EXTCON_GPIO) += extcon-gpio.o
|
||||
obj-$(CONFIG_EXTCON_MAX14577) += extcon-max14577.o
|
||||
obj-$(CONFIG_EXTCON_MAX77693) += extcon-max77693.o
|
||||
obj-$(CONFIG_EXTCON_MAX8997) += extcon-max8997.o
|
||||
obj-$(CONFIG_EXTCON_ARIZONA) += extcon-arizona.o
|
||||
obj-$(CONFIG_EXTCON_PALMAS) += extcon-palmas.o
|
||||
obj-$(CONFIG_EXTCON_SM5502) += extcon-sm5502.o
|
||||
|
||||
@@ -112,7 +112,6 @@ static int adc_jack_probe(struct platform_device *pdev)
|
||||
dev_err(&pdev->dev, "failed to allocate extcon device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
data->edev->dev.parent = &pdev->dev;
|
||||
data->edev->name = pdata->name;
|
||||
|
||||
/* Check the length of array and set num_cables */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user