Commit b0d81664 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'char-misc-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

* 'char-misc-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  misc: ad525x_dpot: Fix AD8400 spi transfer size.
  pch_phub: Fix MAC address writing issue for LAPIS ML7831
  pch_phub: Improve ADE(Address Decode Enable) control
  pch_phub: Change company name OKI SEMICONDUCTOR to LAPIS Semiconductor
  pch_phub: Support new device LAPIS Semiconductor ML7831 IOH
  pcie-gadget-spear: Add "platform:" prefix for platform modalias
  MAINTAINERS: add CHAR and MISC driver maintainers
parents f8f5ed7c 6ac2afb3
...@@ -1789,6 +1789,14 @@ F: include/net/cfg80211.h ...@@ -1789,6 +1789,14 @@ F: include/net/cfg80211.h
F: net/wireless/* F: net/wireless/*
X: net/wireless/wext* X: net/wireless/wext*
CHAR and MISC DRIVERS
M: Arnd Bergmann <arnd@arndb.de>
M: Greg Kroah-Hartman <greg@kroah.com>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
S: Maintained
F: drivers/char/*
F: drivers/misc/*
CHECKPATCH CHECKPATCH
M: Andy Whitcroft <apw@canonical.com> M: Andy Whitcroft <apw@canonical.com>
S: Supported S: Supported
......
...@@ -472,7 +472,7 @@ config BMP085 ...@@ -472,7 +472,7 @@ config BMP085
module will be called bmp085. module will be called bmp085.
config PCH_PHUB config PCH_PHUB
tristate "Intel EG20T PCH / OKI SEMICONDUCTOR IOH(ML7213/ML7223) PHUB" tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) PHUB"
depends on PCI depends on PCI
help help
This driver is for PCH(Platform controller Hub) PHUB(Packet Hub) of This driver is for PCH(Platform controller Hub) PHUB(Packet Hub) of
...@@ -480,12 +480,13 @@ config PCH_PHUB ...@@ -480,12 +480,13 @@ config PCH_PHUB
processor. The Topcliff has MAC address and Option ROM data in SROM. processor. The Topcliff has MAC address and Option ROM data in SROM.
This driver can access MAC address and Option ROM data in SROM. This driver can access MAC address and Option ROM data in SROM.
This driver also can be used for OKI SEMICONDUCTOR IOH(Input/ This driver also can be used for LAPIS Semiconductor's IOH,
Output Hub), ML7213 and ML7223. ML7213/ML7223/ML7831.
ML7213 IOH is for IVI(In-Vehicle Infotainment) use and ML7223 IOH is ML7213 which is for IVI(In-Vehicle Infotainment) use.
for MP(Media Phone) use. ML7223 IOH is for MP(Media Phone) use.
ML7213/ML7223 is companion chip for Intel Atom E6xx series. ML7831 IOH is for general purpose use.
ML7213/ML7223 is completely compatible for Intel EG20T PCH. ML7213/ML7223/ML7831 is companion chip for Intel Atom E6xx series.
ML7213/ML7223/ML7831 is completely compatible for Intel EG20T PCH.
To compile this driver as a module, choose M here: the module will To compile this driver as a module, choose M here: the module will
be called pch_phub. be called pch_phub.
......
...@@ -100,7 +100,7 @@ enum dpot_devid { ...@@ -100,7 +100,7 @@ enum dpot_devid {
AD5293_ID = DPOT_CONF(F_RDACS_RW | F_SPI_16BIT, BRDAC0, 10, 27), AD5293_ID = DPOT_CONF(F_RDACS_RW | F_SPI_16BIT, BRDAC0, 10, 27),
AD7376_ID = DPOT_CONF(F_RDACS_WONLY | F_AD_APPDATA | F_SPI_8BIT, AD7376_ID = DPOT_CONF(F_RDACS_WONLY | F_AD_APPDATA | F_SPI_8BIT,
BRDAC0, 7, 28), BRDAC0, 7, 28),
AD8400_ID = DPOT_CONF(F_RDACS_WONLY | F_AD_APPDATA | F_SPI_8BIT, AD8400_ID = DPOT_CONF(F_RDACS_WONLY | F_AD_APPDATA | F_SPI_16BIT,
BRDAC0, 8, 29), BRDAC0, 8, 29),
AD8402_ID = DPOT_CONF(F_RDACS_WONLY | F_AD_APPDATA | F_SPI_16BIT, AD8402_ID = DPOT_CONF(F_RDACS_WONLY | F_AD_APPDATA | F_SPI_16BIT,
BRDAC0 | BRDAC1, 8, 30), BRDAC0 | BRDAC1, 8, 30),
......
/* /*
* Copyright (C) 2010 OKI SEMICONDUCTOR CO., LTD. * Copyright (C) 2011 LAPIS Semiconductor Co., Ltd.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -41,10 +41,10 @@ ...@@ -41,10 +41,10 @@
#define PCH_PHUB_ROM_START_ADDR_EG20T 0x80 /* ROM data area start address offset #define PCH_PHUB_ROM_START_ADDR_EG20T 0x80 /* ROM data area start address offset
(Intel EG20T PCH)*/ (Intel EG20T PCH)*/
#define PCH_PHUB_ROM_START_ADDR_ML7213 0x400 /* ROM data area start address #define PCH_PHUB_ROM_START_ADDR_ML7213 0x400 /* ROM data area start address
offset(OKI SEMICONDUCTOR ML7213) offset(LAPIS Semicon ML7213)
*/ */
#define PCH_PHUB_ROM_START_ADDR_ML7223 0x400 /* ROM data area start address #define PCH_PHUB_ROM_START_ADDR_ML7223 0x400 /* ROM data area start address
offset(OKI SEMICONDUCTOR ML7223) offset(LAPIS Semicon ML7223)
*/ */
/* MAX number of INT_REDUCE_CONTROL registers */ /* MAX number of INT_REDUCE_CONTROL registers */
...@@ -73,6 +73,9 @@ ...@@ -73,6 +73,9 @@
#define PCI_DEVICE_ID_ROHM_ML7223_mPHUB 0x8012 /* for Bus-m */ #define PCI_DEVICE_ID_ROHM_ML7223_mPHUB 0x8012 /* for Bus-m */
#define PCI_DEVICE_ID_ROHM_ML7223_nPHUB 0x8002 /* for Bus-n */ #define PCI_DEVICE_ID_ROHM_ML7223_nPHUB 0x8002 /* for Bus-n */
/* Macros for ML7831 */
#define PCI_DEVICE_ID_ROHM_ML7831_PHUB 0x8801
/* SROM ACCESS Macro */ /* SROM ACCESS Macro */
#define PCH_WORD_ADDR_MASK (~((1 << 2) - 1)) #define PCH_WORD_ADDR_MASK (~((1 << 2) - 1))
...@@ -115,6 +118,7 @@ ...@@ -115,6 +118,7 @@
* @pch_mac_start_address: MAC address area start address * @pch_mac_start_address: MAC address area start address
* @pch_opt_rom_start_address: Option ROM start address * @pch_opt_rom_start_address: Option ROM start address
* @ioh_type: Save IOH type * @ioh_type: Save IOH type
* @pdev: pointer to pci device struct
*/ */
struct pch_phub_reg { struct pch_phub_reg {
u32 phub_id_reg; u32 phub_id_reg;
...@@ -136,6 +140,7 @@ struct pch_phub_reg { ...@@ -136,6 +140,7 @@ struct pch_phub_reg {
u32 pch_mac_start_address; u32 pch_mac_start_address;
u32 pch_opt_rom_start_address; u32 pch_opt_rom_start_address;
int ioh_type; int ioh_type;
struct pci_dev *pdev;
}; };
/* SROM SPEC for MAC address assignment offset */ /* SROM SPEC for MAC address assignment offset */
...@@ -471,7 +476,7 @@ static int pch_phub_write_gbe_mac_addr(struct pch_phub_reg *chip, u8 *data) ...@@ -471,7 +476,7 @@ static int pch_phub_write_gbe_mac_addr(struct pch_phub_reg *chip, u8 *data)
int retval; int retval;
int i; int i;
if (chip->ioh_type == 1) /* EG20T */ if ((chip->ioh_type == 1) || (chip->ioh_type == 5)) /* EG20T or ML7831*/
retval = pch_phub_gbe_serial_rom_conf(chip); retval = pch_phub_gbe_serial_rom_conf(chip);
else /* ML7223 */ else /* ML7223 */
retval = pch_phub_gbe_serial_rom_conf_mp(chip); retval = pch_phub_gbe_serial_rom_conf_mp(chip);
...@@ -498,6 +503,7 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj, ...@@ -498,6 +503,7 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
unsigned int orom_size; unsigned int orom_size;
int ret; int ret;
int err; int err;
ssize_t rom_size;
struct pch_phub_reg *chip = struct pch_phub_reg *chip =
dev_get_drvdata(container_of(kobj, struct device, kobj)); dev_get_drvdata(container_of(kobj, struct device, kobj));
...@@ -509,6 +515,10 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj, ...@@ -509,6 +515,10 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
} }
/* Get Rom signature */ /* Get Rom signature */
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
if (!chip->pch_phub_extrom_base_address)
goto exrom_map_err;
pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address, pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address,
(unsigned char *)&rom_signature); (unsigned char *)&rom_signature);
rom_signature &= 0xff; rom_signature &= 0xff;
...@@ -539,10 +549,13 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj, ...@@ -539,10 +549,13 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
goto return_err; goto return_err;
} }
return_ok: return_ok:
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
mutex_unlock(&pch_phub_mutex); mutex_unlock(&pch_phub_mutex);
return addr_offset; return addr_offset;
return_err: return_err:
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
exrom_map_err:
mutex_unlock(&pch_phub_mutex); mutex_unlock(&pch_phub_mutex);
return_err_nomutex: return_err_nomutex:
return err; return err;
...@@ -555,6 +568,7 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj, ...@@ -555,6 +568,7 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
int err; int err;
unsigned int addr_offset; unsigned int addr_offset;
int ret; int ret;
ssize_t rom_size;
struct pch_phub_reg *chip = struct pch_phub_reg *chip =
dev_get_drvdata(container_of(kobj, struct device, kobj)); dev_get_drvdata(container_of(kobj, struct device, kobj));
...@@ -571,6 +585,12 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj, ...@@ -571,6 +585,12 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
goto return_ok; goto return_ok;
} }
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
if (!chip->pch_phub_extrom_base_address) {
err = -ENOMEM;
goto exrom_map_err;
}
for (addr_offset = 0; addr_offset < count; addr_offset++) { for (addr_offset = 0; addr_offset < count; addr_offset++) {
if (PCH_PHUB_OROM_SIZE < off + addr_offset) if (PCH_PHUB_OROM_SIZE < off + addr_offset)
goto return_ok; goto return_ok;
...@@ -585,10 +605,14 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj, ...@@ -585,10 +605,14 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
} }
return_ok: return_ok:
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
mutex_unlock(&pch_phub_mutex); mutex_unlock(&pch_phub_mutex);
return addr_offset; return addr_offset;
return_err: return_err:
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
exrom_map_err:
mutex_unlock(&pch_phub_mutex); mutex_unlock(&pch_phub_mutex);
return err; return err;
} }
...@@ -598,8 +622,14 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr, ...@@ -598,8 +622,14 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr,
{ {
u8 mac[8]; u8 mac[8];
struct pch_phub_reg *chip = dev_get_drvdata(dev); struct pch_phub_reg *chip = dev_get_drvdata(dev);
ssize_t rom_size;
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
if (!chip->pch_phub_extrom_base_address)
return -ENOMEM;
pch_phub_read_gbe_mac_addr(chip, mac); pch_phub_read_gbe_mac_addr(chip, mac);
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
return sprintf(buf, "%pM\n", mac); return sprintf(buf, "%pM\n", mac);
} }
...@@ -608,6 +638,7 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr, ...@@ -608,6 +638,7 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
u8 mac[6]; u8 mac[6];
ssize_t rom_size;
struct pch_phub_reg *chip = dev_get_drvdata(dev); struct pch_phub_reg *chip = dev_get_drvdata(dev);
if (count != 18) if (count != 18)
...@@ -617,7 +648,12 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr, ...@@ -617,7 +648,12 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
(u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3], (u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3],
(u32 *)&mac[4], (u32 *)&mac[5]); (u32 *)&mac[4], (u32 *)&mac[5]);
chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
if (!chip->pch_phub_extrom_base_address)
return -ENOMEM;
pch_phub_write_gbe_mac_addr(chip, mac); pch_phub_write_gbe_mac_addr(chip, mac);
pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
return count; return count;
} }
...@@ -640,7 +676,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev, ...@@ -640,7 +676,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
int retval; int retval;
int ret; int ret;
ssize_t rom_size;
struct pch_phub_reg *chip; struct pch_phub_reg *chip;
chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL); chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL);
...@@ -677,19 +712,7 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev, ...@@ -677,19 +712,7 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
"in pch_phub_base_address variable is %p\n", __func__, "in pch_phub_base_address variable is %p\n", __func__,
chip->pch_phub_base_address); chip->pch_phub_base_address);
if (id->driver_data != 3) { chip->pdev = pdev; /* Save pci device struct */
chip->pch_phub_extrom_base_address =\
pci_map_rom(pdev, &rom_size);
if (chip->pch_phub_extrom_base_address == 0) {
dev_err(&pdev->dev, "%s: pci_map_rom FAILED", __func__);
ret = -ENOMEM;
goto err_pci_map;
}
dev_dbg(&pdev->dev, "%s : "
"pci_map_rom SUCCESS and value in "
"pch_phub_extrom_base_address variable is %p\n",
__func__, chip->pch_phub_extrom_base_address);
}
if (id->driver_data == 1) { /* EG20T PCH */ if (id->driver_data == 1) { /* EG20T PCH */
const char *board_name; const char *board_name;
...@@ -763,6 +786,22 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev, ...@@ -763,6 +786,22 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
chip->pch_opt_rom_start_address =\ chip->pch_opt_rom_start_address =\
PCH_PHUB_ROM_START_ADDR_ML7223; PCH_PHUB_ROM_START_ADDR_ML7223;
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;
} else if (id->driver_data == 5) { /* ML7831 */
retval = sysfs_create_file(&pdev->dev.kobj,
&dev_attr_pch_mac.attr);
if (retval)
goto err_sysfs_create;
retval = sysfs_create_bin_file(&pdev->dev.kobj, &pch_bin_attr);
if (retval)
goto exit_bin_attr;
/* set the prefech value */
iowrite32(0x000affaa, chip->pch_phub_base_address + 0x14);
/* set the interrupt delay value */
iowrite32(0x25, chip->pch_phub_base_address + 0x44);
chip->pch_opt_rom_start_address = PCH_PHUB_ROM_START_ADDR_EG20T;
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_EG20T;
} }
chip->ioh_type = id->driver_data; chip->ioh_type = id->driver_data;
...@@ -773,8 +812,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev, ...@@ -773,8 +812,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr); sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
err_sysfs_create: err_sysfs_create:
pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
err_pci_map:
pci_iounmap(pdev, chip->pch_phub_base_address); pci_iounmap(pdev, chip->pch_phub_base_address);
err_pci_iomap: err_pci_iomap:
pci_release_regions(pdev); pci_release_regions(pdev);
...@@ -792,7 +829,6 @@ static void __devexit pch_phub_remove(struct pci_dev *pdev) ...@@ -792,7 +829,6 @@ static void __devexit pch_phub_remove(struct pci_dev *pdev)
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr); sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
sysfs_remove_bin_file(&pdev->dev.kobj, &pch_bin_attr); sysfs_remove_bin_file(&pdev->dev.kobj, &pch_bin_attr);
pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
pci_iounmap(pdev, chip->pch_phub_base_address); pci_iounmap(pdev, chip->pch_phub_base_address);
pci_release_regions(pdev); pci_release_regions(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
...@@ -847,6 +883,7 @@ static struct pci_device_id pch_phub_pcidev_id[] = { ...@@ -847,6 +883,7 @@ static struct pci_device_id pch_phub_pcidev_id[] = {
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7213_PHUB), 2, }, { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7213_PHUB), 2, },
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7223_mPHUB), 3, }, { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7223_mPHUB), 3, },
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7223_nPHUB), 4, }, { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7223_nPHUB), 4, },
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ROHM_ML7831_PHUB), 5, },
{ } { }
}; };
MODULE_DEVICE_TABLE(pci, pch_phub_pcidev_id); MODULE_DEVICE_TABLE(pci, pch_phub_pcidev_id);
...@@ -873,5 +910,5 @@ static void __exit pch_phub_pci_exit(void) ...@@ -873,5 +910,5 @@ static void __exit pch_phub_pci_exit(void)
module_init(pch_phub_pci_init); module_init(pch_phub_pci_init);
module_exit(pch_phub_pci_exit); module_exit(pch_phub_pci_exit);
MODULE_DESCRIPTION("Intel EG20T PCH/OKI SEMICONDUCTOR IOH(ML7213/ML7223) PHUB"); MODULE_DESCRIPTION("Intel EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7223) PHUB");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -903,6 +903,6 @@ static void __exit spear_pcie_gadget_exit(void) ...@@ -903,6 +903,6 @@ static void __exit spear_pcie_gadget_exit(void)
} }
module_exit(spear_pcie_gadget_exit); module_exit(spear_pcie_gadget_exit);
MODULE_ALIAS("pcie-gadget-spear"); MODULE_ALIAS("platform:pcie-gadget-spear");
MODULE_AUTHOR("Pratyush Anand"); MODULE_AUTHOR("Pratyush Anand");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
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