diff options
Diffstat (limited to 'drivers/pci/hotplug/pnv_php.c')
| -rw-r--r-- | drivers/pci/hotplug/pnv_php.c | 38 | 
1 files changed, 24 insertions, 14 deletions
| diff --git a/drivers/pci/hotplug/pnv_php.c b/drivers/pci/hotplug/pnv_php.c index 3276a5e4c430..ee54f5bacad1 100644 --- a/drivers/pci/hotplug/pnv_php.c +++ b/drivers/pci/hotplug/pnv_php.c @@ -275,14 +275,13 @@ static int pnv_php_add_devtree(struct pnv_php_slot *php_slot)  		goto free_fdt1;  	} -	fdt = kzalloc(fdt_totalsize(fdt1), GFP_KERNEL); +	fdt = kmemdup(fdt1, fdt_totalsize(fdt1), GFP_KERNEL);  	if (!fdt) {  		ret = -ENOMEM;  		goto free_fdt1;  	}  	/* Unflatten device tree blob */ -	memcpy(fdt, fdt1, fdt_totalsize(fdt1));  	dt = of_fdt_unflatten_tree(fdt, php_slot->dn, NULL);  	if (!dt) {  		ret = -EINVAL; @@ -328,10 +327,15 @@ out:  	return ret;  } +static inline struct pnv_php_slot *to_pnv_php_slot(struct hotplug_slot *slot) +{ +	return container_of(slot, struct pnv_php_slot, slot); +} +  int pnv_php_set_slot_power_state(struct hotplug_slot *slot,  				 uint8_t state)  { -	struct pnv_php_slot *php_slot = slot->private; +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);  	struct opal_msg msg;  	int ret; @@ -363,7 +367,7 @@ EXPORT_SYMBOL_GPL(pnv_php_set_slot_power_state);  static int pnv_php_get_power_state(struct hotplug_slot *slot, u8 *state)  { -	struct pnv_php_slot *php_slot = slot->private; +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);  	uint8_t power_state = OPAL_PCI_SLOT_POWER_ON;  	int ret; @@ -378,7 +382,6 @@ static int pnv_php_get_power_state(struct hotplug_slot *slot, u8 *state)  			 ret);  	} else {  		*state = power_state; -		slot->info->power_status = power_state;  	}  	return 0; @@ -386,7 +389,7 @@ static int pnv_php_get_power_state(struct hotplug_slot *slot, u8 *state)  static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)  { -	struct pnv_php_slot *php_slot = slot->private; +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);  	uint8_t presence = OPAL_PCI_SLOT_EMPTY;  	int ret; @@ -397,7 +400,6 @@ static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)  	ret = pnv_pci_get_presence_state(php_slot->id, &presence);  	if (ret >= 0) {  		*state = presence; -		slot->info->adapter_status = presence;  		ret = 0;  	} else {  		pci_warn(php_slot->pdev, "Error %d getting presence\n", ret); @@ -406,10 +408,20 @@ static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)  	return ret;  } +static int pnv_php_get_attention_state(struct hotplug_slot *slot, u8 *state) +{ +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); + +	*state = php_slot->attention_state; +	return 0; +} +  static int pnv_php_set_attention_state(struct hotplug_slot *slot, u8 state)  { +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot); +  	/* FIXME: Make it real once firmware supports it */ -	slot->info->attention_status = state; +	php_slot->attention_state = state;  	return 0;  } @@ -501,15 +513,14 @@ scan:  static int pnv_php_enable_slot(struct hotplug_slot *slot)  { -	struct pnv_php_slot *php_slot = container_of(slot, -						     struct pnv_php_slot, slot); +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);  	return pnv_php_enable(php_slot, true);  }  static int pnv_php_disable_slot(struct hotplug_slot *slot)  { -	struct pnv_php_slot *php_slot = slot->private; +	struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);  	int ret;  	if (php_slot->state != PNV_PHP_STATE_POPULATED) @@ -530,9 +541,10 @@ static int pnv_php_disable_slot(struct hotplug_slot *slot)  	return ret;  } -static struct hotplug_slot_ops php_slot_ops = { +static const struct hotplug_slot_ops php_slot_ops = {  	.get_power_status	= pnv_php_get_power_state,  	.get_adapter_status	= pnv_php_get_adapter_state, +	.get_attention_status	= pnv_php_get_attention_state,  	.set_attention_status	= pnv_php_set_attention_state,  	.enable_slot		= pnv_php_enable_slot,  	.disable_slot		= pnv_php_disable_slot, @@ -594,8 +606,6 @@ static struct pnv_php_slot *pnv_php_alloc_slot(struct device_node *dn)  	php_slot->id	                = id;  	php_slot->power_state_check     = false;  	php_slot->slot.ops              = &php_slot_ops; -	php_slot->slot.info             = &php_slot->slot_info; -	php_slot->slot.private          = php_slot;  	INIT_LIST_HEAD(&php_slot->children);  	INIT_LIST_HEAD(&php_slot->link); |