diff options
Diffstat (limited to 'drivers/misc/pch_phub.c')
| -rw-r--r-- | drivers/misc/pch_phub.c | 81 | 
1 files changed, 59 insertions, 22 deletions
diff --git a/drivers/misc/pch_phub.c b/drivers/misc/pch_phub.c index dee33addcae..10fc4785dba 100644 --- a/drivers/misc/pch_phub.c +++ b/drivers/misc/pch_phub.c @@ -1,5 +1,5 @@  /* - * 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   * it under the terms of the GNU General Public License as published by @@ -41,10 +41,10 @@  #define PCH_PHUB_ROM_START_ADDR_EG20T 0x80 /* ROM data area start address offset  					      (Intel EG20T PCH)*/  #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 -						offset(OKI SEMICONDUCTOR ML7223) +						offset(LAPIS Semicon ML7223)  					      */  /* MAX number of INT_REDUCE_CONTROL registers */ @@ -73,6 +73,9 @@  #define PCI_DEVICE_ID_ROHM_ML7223_mPHUB	0x8012 /* for Bus-m */  #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 */  #define PCH_WORD_ADDR_MASK (~((1 << 2) - 1)) @@ -115,6 +118,7 @@   * @pch_mac_start_address:		MAC address area start address   * @pch_opt_rom_start_address:		Option ROM start address   * @ioh_type:				Save IOH type + * @pdev:				pointer to pci device struct   */  struct pch_phub_reg {  	u32 phub_id_reg; @@ -136,6 +140,7 @@ struct pch_phub_reg {  	u32 pch_mac_start_address;  	u32 pch_opt_rom_start_address;  	int ioh_type; +	struct pci_dev *pdev;  };  /* 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)  	int retval;  	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);  	else	/* ML7223 */  		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,  	unsigned int orom_size;  	int ret;  	int err; +	ssize_t rom_size;  	struct pch_phub_reg *chip =  		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,  	}  	/* 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,  				(unsigned char *)&rom_signature);  	rom_signature &= 0xff; @@ -539,10 +549,13 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,  		goto return_err;  	}  return_ok: +	pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);  	mutex_unlock(&pch_phub_mutex);  	return addr_offset;  return_err: +	pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address); +exrom_map_err:  	mutex_unlock(&pch_phub_mutex);  return_err_nomutex:  	return err; @@ -555,6 +568,7 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,  	int err;  	unsigned int addr_offset;  	int ret; +	ssize_t rom_size;  	struct pch_phub_reg *chip =  		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,  		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++) {  		if (PCH_PHUB_OROM_SIZE < off + addr_offset)  			goto return_ok; @@ -585,10 +605,14 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,  	}  return_ok: +	pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);  	mutex_unlock(&pch_phub_mutex);  	return addr_offset;  return_err: +	pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address); + +exrom_map_err:  	mutex_unlock(&pch_phub_mutex);  	return err;  } @@ -598,8 +622,14 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr,  {  	u8 mac[8];  	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); +	pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);  	return sprintf(buf, "%pM\n", mac);  } @@ -608,6 +638,7 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,  			     const char *buf, size_t count)  {  	u8 mac[6]; +	ssize_t rom_size;  	struct pch_phub_reg *chip = dev_get_drvdata(dev);  	if (count != 18) @@ -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[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); +	pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);  	return count;  } @@ -640,7 +676,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,  	int retval;  	int ret; -	ssize_t rom_size;  	struct pch_phub_reg *chip;  	chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL); @@ -677,19 +712,7 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,  		"in pch_phub_base_address variable is %p\n", __func__,  		chip->pch_phub_base_address); -	if (id->driver_data != 3) { -		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); -	} +	chip->pdev = pdev; /* Save pci device struct */  	if (id->driver_data == 1) { /* EG20T PCH */  		const char *board_name; @@ -763,6 +786,22 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,  		chip->pch_opt_rom_start_address =\  						 PCH_PHUB_ROM_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; @@ -773,8 +812,6 @@ exit_bin_attr:  	sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);  err_sysfs_create: -	pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address); -err_pci_map:  	pci_iounmap(pdev, chip->pch_phub_base_address);  err_pci_iomap:  	pci_release_regions(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_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_release_regions(pdev);  	pci_disable_device(pdev); @@ -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_ML7223_mPHUB), 3,  },  	{ 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); @@ -873,5 +910,5 @@ static void __exit pch_phub_pci_exit(void)  module_init(pch_phub_pci_init);  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");  |