Message ID | 1477598154-4459-1-git-send-email-vadimp@mellanox.com (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Andy Shevchenko |
Headers | show |
Same comment regarding series (Use --thread to git send-email) On Thu, 2016-10-27 at 19:55 +0000, Vadim Pasternak wrote: > Add calls for mlxcpld-hotplug platform driver > registration/unregistration > and add platform hotplug data configurations. This driver, when > registered > within system will handle system hot-plug events for the power > suppliers, > power cables and fans (insertion and removing). These events are > controlled through CPLD Lattice device. > > Signed-off-by: Vadim Pasternak <vadimp@mellanox.com> > v1->v2: > Comments pointed out by Andy: > - Remove "from sender" from the message body; > - Add more information to commit message. (When CPLD spec will be > available at Mellanox portal - MAINTAINERS Web-page info is to > be updated); > - Do not change include order. Same comment. Put it below '---' line. > --- > > @@ -121,7 +123,87 @@ static struct i2c_mux_reg_platform_data > mlxplat_mux_data[] = { > > }; > > -static struct platform_device *mlxplat_dev; Why did you move it? Seems like it's not needed in this patch. > +/* Platform hotplug devices */ > +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_psu[] = I_really_like_long_names_of_variables. No, I don't. > +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_pwr[] = > +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_fan[] = > +static > +struct mlxcpld_hotplug_platform_data > mlxplat_mlxcpld_hotplug_default_data = { > + .top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a), | ?! Can you elaborate why it's ORred and not just added? Besides that redundant parens. > + .top_aggr_mask = 0x48, > + .top_aggr_psu_mask = 0x08, And above explanation might shed a light why you are using interesting masks like 0b101. > + .psu_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x58), > + .psu_mask = 0x03, GENMASK()? > + .psu_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_psu), > + .psu = mlxplat_mlxcpld_hotplug_psu, > + .top_aggr_pwr_mask = 0x08, > + .pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64), > + .pwr_mask = 0x03, > + .pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr), > + .pwr = mlxplat_mlxcpld_hotplug_pwr, > + .top_aggr_fan_mask = 0x40, > + .fan_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x88), > + .fan_mask = 0x0f, > + .fan_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_fan), > + .fan = mlxplat_mlxcpld_hotplug_fan, Wouldn't be cleaner like this: struct hotplug_dev_pdata { reg_offset; mask; count; void *somethig; }; struct hotplug_pdata { /* top stuff, will see later how to put it here */ struct hotplug_dev_data psu; struct hotplug_dev_data pwr; struct hotplug_dev_data fan; }; > +}; > + > +/* Platform hotplug MSN21xx system family data */ > +static > +struct mlxcpld_hotplug_platform_data > mlxplat_mlxcpld_hotplug_msn21xx_data = { > + .top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a), > + .top_aggr_mask = 0x04, > + .top_aggr_pwr_mask = 0x04, > + .pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64), > + .pwr_mask = 0x03, > + .pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr), > +}; > + > +static struct resource mlxplat_mlxcpld_hotplug_resources[] = { > + [0] = DEFINE_RES_IRQ_NAMED(17, "mlxcpld-hotplug"), > +}; > + > +struct platform_device *mlxplat_dev; > +struct mlxcpld_hotplug_platform_data *mlxplat_hotplug; > > static int __init mlxplat_dmi_default_matched(const struct > dmi_system_id *dmi) > { > @@ -132,6 +214,7 @@ static int __init > mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) > mlxplat_mux_data[i].n_values = > ARRAY_SIZE(mlxplat_default_channels[i > ]); > } > + mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_default_data; Is it only one hotplug device at a time? Otherwise it will be affected by race conditions. > > return 1; > }; > @@ -145,6 +228,7 @@ static int __init > mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi) > mlxplat_mux_data[i].n_values = > ARRAY_SIZE(mlxplat_msn21xx_channels); > } > + mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_msn21xx_data; > > return 1; > }; > @@ -230,6 +314,16 @@ static int __init mlxplat_init(void) > } > } > > + priv->pdev_hotplug = platform_device_register_resndata( > + &mlxplat_dev->dev, "mlxcpld-hotplug", > -1, Isn't it something like PLATFORM_DEVID_AUTO / NONE ? > + mlxplat_mlxcpld_hotplug_resources, > + ARRAY_SIZE(mlxplat_mlxcpld_hotplug_re > sources), > + mlxplat_hotplug, > sizeof(*mlxplat_hotplug)); > + if (IS_ERR(priv->pdev_hotplug)) { > + err = PTR_ERR(priv->pdev_hotplug); > + goto fail_platform_mux_register; > + } > + > return 0; > > fail_platform_mux_register: > @@ -248,6 +342,8 @@ static void __exit mlxplat_exit(void) > struct mlxplat_priv *priv = > platform_get_drvdata(mlxplat_dev); > int i; > > + platform_device_unregister(priv->pdev_hotplug); > + > for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--) > platform_device_unregister(priv->pdev_mux[i]); >
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW5keSBTaGV2Y2hlbmtv IFttYWlsdG86YW5kcml5LnNoZXZjaGVua29AbGludXguaW50ZWwuY29tXQ0KPiBTZW50OiBUaHVy c2RheSwgT2N0b2JlciAyNywgMjAxNiA5OjI1IFBNDQo+IFRvOiBWYWRpbSBQYXN0ZXJuYWsgPHZh ZGltcEBtZWxsYW5veC5jb20+OyBkdmhhcnRAaW5mcmFkZWFkLm9yZzsNCj4gZmVuZ2d1YW5nLnd1 QGludGVsLmNvbQ0KPiBDYzogZGF2ZW1AZGF2ZW1sb2Z0Lm5ldDsgZ2VlcnRAbGludXgtbTY4ay5v cmc7IGFrcG1AbGludXgtDQo+IGZvdW5kYXRpb24ub3JnOyBrdmFsb0Bjb2RlYXVyb3JhLm9yZzsg Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc7DQo+IG1jaGVoYWJAa2VybmVsLm9yZzsgbGludXhA cm9lY2stdXMubmV0OyBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOw0KPiBwbGF0Zm9ybS1k cml2ZXIteDg2QHZnZXIua2VybmVsLm9yZzsgamlyaUByZXNudWxsaS51cw0KPiBTdWJqZWN0OiBS ZTogW3BhdGNoIHYyIDIvMl0gZHJpdmVycy9wbGF0Zm9ybS94ODY6IGFkZCBtbHhjcGxkLWhvdHBs dWcgZHJpdmVyDQo+IHJlZ2lzdHJhdGlvbiB0byBtbHgtcGxhdGZvcm0gZHJpdmVyDQo+IA0KPiBT YW1lIGNvbW1lbnQgcmVnYXJkaW5nIHNlcmllcyAoVXNlIC0tdGhyZWFkIHRvIGdpdCBzZW5kLWVt YWlsKQ0KPiANCj4gT24gVGh1LCAyMDE2LTEwLTI3IGF0IDE5OjU1ICswMDAwLCBWYWRpbSBQYXN0 ZXJuYWsgd3JvdGU6DQo+ID4gQWRkIGNhbGxzIGZvciBtbHhjcGxkLWhvdHBsdWcgcGxhdGZvcm0g ZHJpdmVyDQo+ID4gcmVnaXN0cmF0aW9uL3VucmVnaXN0cmF0aW9uIGFuZCBhZGQgcGxhdGZvcm0g aG90cGx1ZyBkYXRhDQo+ID4gY29uZmlndXJhdGlvbnMuIFRoaXMgZHJpdmVyLCB3aGVuIHJlZ2lz dGVyZWQgd2l0aGluIHN5c3RlbSB3aWxsIGhhbmRsZQ0KPiA+IHN5c3RlbSBob3QtcGx1ZyBldmVu dHMgZm9yIHRoZSBwb3dlciBzdXBwbGllcnMsIHBvd2VyIGNhYmxlcyBhbmQgZmFucw0KPiA+IChp bnNlcnRpb24gYW5kIHJlbW92aW5nKS4gVGhlc2UgZXZlbnRzIGFyZSBjb250cm9sbGVkIHRocm91 Z2ggQ1BMRA0KPiA+IExhdHRpY2UgZGV2aWNlLg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogVmFk aW0gUGFzdGVybmFrIDx2YWRpbXBAbWVsbGFub3guY29tPg0KPiANCj4gPiB2MS0+djI6DQo+ID4g wqBDb21tZW50cyBwb2ludGVkIG91dCBieSBBbmR5Og0KPiA+IMKgIC0gUmVtb3ZlICJmcm9tIHNl bmRlciIgZnJvbSB0aGUgbWVzc2FnZSBib2R5Ow0KPiA+IMKgIC0gQWRkIG1vcmUgaW5mb3JtYXRp b24gdG8gY29tbWl0IG1lc3NhZ2UuIChXaGVuIENQTEQgc3BlYyB3aWxsIGJlDQo+ID4gwqDCoMKg wqBhdmFpbGFibGUgYXQgTWVsbGFub3ggcG9ydGFsIC0gTUFJTlRBSU5FUlMgV2ViLXBhZ2UgaW5m byBpcyB0bw0KPiA+IMKgwqDCoMKgYmUgdXBkYXRlZCk7DQo+ID4gwqAgLSBEbyBub3QgY2hhbmdl IGluY2x1ZGUgb3JkZXIuDQo+IA0KPiBTYW1lIGNvbW1lbnQuIFB1dCBpdCBiZWxvdyAnLS0tJyBs aW5lLg0KPiANCj4gPiAtLS0NCj4gPg0KPiANCj4gPiBAQCAtMTIxLDcgKzEyMyw4NyBAQCBzdGF0 aWMgc3RydWN0IGkyY19tdXhfcmVnX3BsYXRmb3JtX2RhdGENCj4gPiBtbHhwbGF0X211eF9kYXRh W10gPSB7DQo+ID4NCj4gPiDCoH07DQo+ID4NCj4gDQo+ID4gLXN0YXRpYyBzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICptbHhwbGF0X2RldjsNCj4gDQo+IFdoeSBkaWQgeW91IG1vdmUgaXQ/IFNlZW1z IGxpa2UgaXQncyBub3QgbmVlZGVkIGluIHRoaXMgcGF0Y2guDQoNCkp1c3QgYnkgbWlzdGFrZS4N ClNvcnJ5Lg0KDQo+IA0KPiA+ICsvKiBQbGF0Zm9ybSBob3RwbHVnIGRldmljZXMgKi8NCj4gPiAr c3RhdGljIHN0cnVjdCBtbHhjcGxkX2hvdHBsdWdfZGV2aWNlIG1seHBsYXRfbWx4Y3BsZF9ob3Rw bHVnX3BzdVtdID0NCj4gDQo+IElfcmVhbGx5X2xpa2VfbG9uZ19uYW1lc19vZl92YXJpYWJsZXMu IE5vLCBJIGRvbid0Lg0KDQpJIGtlZXAgcHJlZml4IG1seHBsYXRfbWx4Y3BsZCBmb3IgY29uc2lz dGVuY3kuDQpNYXliZSBJIGNhbiByZW1vdmUgIiBob3RwbHVnXyIgdG8gbWFrZSB2YXJpYWJsZSBz aG9ydGVyPw0KDQo+IA0KPiA+ICtzdGF0aWMgc3RydWN0IG1seGNwbGRfaG90cGx1Z19kZXZpY2Ug bWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcHdyW10gPQ0KPiA+ICtzdGF0aWMgc3RydWN0IG1seGNw bGRfaG90cGx1Z19kZXZpY2UgbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfZmFuW10gPQ0KPiA+ICtz dGF0aWMgc3RydWN0IG1seGNwbGRfaG90cGx1Z19wbGF0Zm9ybV9kYXRhDQo+ID4gbWx4cGxhdF9t bHhjcGxkX2hvdHBsdWdfZGVmYXVsdF9kYXRhID0gew0KPiANCj4gDQo+ID4gKwkudG9wX2FnZ3Jf b2Zmc2V0ID0gKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiB8IDB4M2EpLA0KPiANCj4g fCA/ISBDYW4geW91IGVsYWJvcmF0ZSB3aHkgaXQncyBPUnJlZCBhbmQgbm90IGp1c3QgYWRkZWQ/ DQo+IA0KPiBCZXNpZGVzIHRoYXQgcmVkdW5kYW50IHBhcmVucy4NCg0KV2lsbCByZW1vdmUgcGFy ZW5zIGFuZCBjaGFuZ2UgIm9yIiB0byArIChubyBzcGVjaWFsIHJlYXNvbikuDQoNCj4gDQo+ID4g KwkudG9wX2FnZ3JfbWFzayA9IDB4NDgsDQo+ID4gKwkudG9wX2FnZ3JfcHN1X21hc2sgPSAweDA4 LA0KPiANCj4gQW5kIGFib3ZlIGV4cGxhbmF0aW9uIG1pZ2h0IHNoZWQgYSBsaWdodCB3aHkgeW91 IGFyZSB1c2luZyBpbnRlcmVzdGluZw0KPiBtYXNrcyBsaWtlIDBiMTAxLg0KDQpXaWxsIGFkZCBj b21tZW50cyBmb3IgbWFza3MgKGp1c3QgMHg0MCBpcyBtYXNraW5nIGluIENQTEQgYWdncmVnYXRp b24gcmVnaXN0ZXIgUFNVIGFuZCBQV1IgZXZlbnRzLCAweDA4IC0gRkFOIGV2ZW50cykgZm9yIGRl ZmF1bHQgc3lzdGVtIHR5cGUuDQoNCj4gDQo+ID4gKwkucHN1X3JlZ19vZmZzZXQgPSAoTUxYUExB VF9DUExEX0xQQ19SRUdfQkFTRV9BRFJSIHwgMHg1OCksDQo+ID4gKwkucHN1X21hc2sgPSAweDAz LA0KPiANCj4gR0VOTUFTSygpPw0KDQpPSywgd2lsbCBjaGFuZ2UgaXQgdG8NCi5wc3VfbWFzayA9 IEdFTk1BU0soMCwgMSkgYW5kIG90aGVyIGFwcGVhcmFuY2VzLg0KDQo+IA0KPiA+ICsJLnBzdV9j b3VudCA9IEFSUkFZX1NJWkUobWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcHN1KSwNCj4gPiArCS5w c3UgPSBtbHhwbGF0X21seGNwbGRfaG90cGx1Z19wc3UsDQo+ID4gKwkudG9wX2FnZ3JfcHdyX21h c2sgPSAweDA4LA0KPiA+ICsJLnB3cl9yZWdfb2Zmc2V0ID0gKE1MWFBMQVRfQ1BMRF9MUENfUkVH X0JBU0VfQURSUiB8IDB4NjQpLA0KPiA+ICsJLnB3cl9tYXNrID0gMHgwMywNCj4gPiArCS5wd3Jf Y291bnQgPSBBUlJBWV9TSVpFKG1seHBsYXRfbWx4Y3BsZF9ob3RwbHVnX3B3ciksDQo+ID4gKwku cHdyID0gbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcHdyLA0KPiA+ICsJLnRvcF9hZ2dyX2Zhbl9t YXNrID0gMHg0MCwNCj4gPiArCS5mYW5fcmVnX29mZnNldCA9IChNTFhQTEFUX0NQTERfTFBDX1JF R19CQVNFX0FEUlIgfCAweDg4KSwNCj4gPiArCS5mYW5fbWFzayA9IDB4MGYsDQo+ID4gKwkuZmFu X2NvdW50ID0gQVJSQVlfU0laRShtbHhwbGF0X21seGNwbGRfaG90cGx1Z19mYW4pLA0KPiA+ICsJ LmZhbiA9IG1seHBsYXRfbWx4Y3BsZF9ob3RwbHVnX2ZhbiwNCj4gDQo+IFdvdWxkbid0IGJlIGNs ZWFuZXIgbGlrZSB0aGlzOg0KPiANCj4gc3RydWN0IGhvdHBsdWdfZGV2X3BkYXRhIHsNCj4gIHJl Z19vZmZzZXQ7DQo+ICBtYXNrOw0KPiAgY291bnQ7DQo+ICB2b2lkICpzb21ldGhpZzsNCj4gfTsN Cj4gDQo+IHN0cnVjdCBob3RwbHVnX3BkYXRhIHsNCj4gIC8qIHRvcCBzdHVmZiwgd2lsbCBzZWUg bGF0ZXIgaG93IHRvIHB1dCBpdCBoZXJlICovDQo+IA0KPiAgc3RydWN0IGhvdHBsdWdfZGV2X2Rh dGEgcHN1Ow0KPiAgc3RydWN0IGhvdHBsdWdfZGV2X2RhdGEgcHdyOw0KPiAgc3RydWN0IGhvdHBs dWdfZGV2X2RhdGEgZmFuOw0KPiB9Ow0KDQpJIHdpbGwgY29uc2lkZXIgdGhpcyBjaGFuZ2UgZm9y IHRoZSBuZXh0IHBhdGNoLg0KDQo+IA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyogUGxhdGZvcm0g aG90cGx1ZyBNU04yMXh4IHN5c3RlbSBmYW1pbHkgZGF0YSAqLw0KPiA+ICtzdGF0aWMNCj4gPiAr c3RydWN0IG1seGNwbGRfaG90cGx1Z19wbGF0Zm9ybV9kYXRhDQo+ID4gbWx4cGxhdF9tbHhjcGxk X2hvdHBsdWdfbXNuMjF4eF9kYXRhID0gew0KPiA+ICsJLnRvcF9hZ2dyX29mZnNldCA9IChNTFhQ TEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIgfCAweDNhKSwNCj4gPiArCS50b3BfYWdncl9tYXNr ID0gMHgwNCwNCj4gPiArCS50b3BfYWdncl9wd3JfbWFzayA9IDB4MDQsDQo+ID4gKwkucHdyX3Jl Z19vZmZzZXQgPSAoTUxYUExBVF9DUExEX0xQQ19SRUdfQkFTRV9BRFJSIHwgMHg2NCksDQo+ID4g KwkucHdyX21hc2sgPSAweDAzLA0KPiA+ICsJLnB3cl9jb3VudCA9IEFSUkFZX1NJWkUobWx4cGxh dF9tbHhjcGxkX2hvdHBsdWdfcHdyKSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1 Y3QgcmVzb3VyY2UgbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcmVzb3VyY2VzW10gPSB7DQo+ID4g KwlbMF0gPSBERUZJTkVfUkVTX0lSUV9OQU1FRCgxNywgIm1seGNwbGQtaG90cGx1ZyIpLA0KPiA+ ICt9Ow0KPiA+ICsNCj4gPiArc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWx4cGxhdF9kZXY7DQo+ ID4gK3N0cnVjdCBtbHhjcGxkX2hvdHBsdWdfcGxhdGZvcm1fZGF0YSAqbWx4cGxhdF9ob3RwbHVn Ow0KPiA+DQo+ID4gwqBzdGF0aWMgaW50IF9faW5pdCBtbHhwbGF0X2RtaV9kZWZhdWx0X21hdGNo ZWQoY29uc3Qgc3RydWN0DQo+ID4gZG1pX3N5c3RlbV9pZCAqZG1pKQ0KPiA+IMKgew0KPiA+IEBA IC0xMzIsNiArMjE0LDcgQEAgc3RhdGljIGludCBfX2luaXQNCj4gPiBtbHhwbGF0X2RtaV9kZWZh dWx0X21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmRtaSkNCj4gPiDCoAkJbWx4 cGxhdF9tdXhfZGF0YVtpXS5uX3ZhbHVlcyA9DQo+ID4gwqAJCQkJQVJSQVlfU0laRShtbHhwbGF0 X2RlZmF1bHRfY2hhbm5lbHNbaQ0KPiA+IF0pOw0KPiA+IMKgCX0NCj4gDQo+ID4gKwltbHhwbGF0 X2hvdHBsdWcgPSAmbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfZGVmYXVsdF9kYXRhOw0KPiANCj4g SXMgaXQgb25seSBvbmUgaG90cGx1ZyBkZXZpY2UgYXQgYSB0aW1lPyBPdGhlcndpc2UgaXQgd2ls bCBiZSBhZmZlY3RlZA0KPiBieSByYWNlIGNvbmRpdGlvbnMuDQo+IA0KDQpPbmx5IG9uZSBDUExE IHBlciBib3gsIHdoaWNoIGhhbmRsZXMgYWxsIHRoZSBldmVudHMuDQoNCj4gPg0KPiA+IMKgCXJl dHVybiAxOw0KPiA+IMKgfTsNCj4gPiBAQCAtMTQ1LDYgKzIyOCw3IEBAIHN0YXRpYyBpbnQgX19p bml0DQo+ID4gbWx4cGxhdF9kbWlfbXNuMjF4eF9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lz dGVtX2lkICpkbWkpDQo+ID4gwqAJCW1seHBsYXRfbXV4X2RhdGFbaV0ubl92YWx1ZXMgPQ0KPiA+ IMKgCQkJCUFSUkFZX1NJWkUobWx4cGxhdF9tc24yMXh4X2NoYW5uZWxzKTsNCj4gPiDCoAl9DQo+ ID4gKwltbHhwbGF0X2hvdHBsdWcgPSAmbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfbXNuMjF4eF9k YXRhOw0KPiA+DQo+ID4gwqAJcmV0dXJuIDE7DQo+ID4gwqB9Ow0KPiA+IEBAIC0yMzAsNiArMzE0 LDE2IEBAIHN0YXRpYyBpbnQgX19pbml0IG1seHBsYXRfaW5pdCh2b2lkKQ0KPiA+IMKgCQl9DQo+ ID4gwqAJfQ0KPiA+DQo+ID4gKwlwcml2LT5wZGV2X2hvdHBsdWcgPSBwbGF0Zm9ybV9kZXZpY2Vf cmVnaXN0ZXJfcmVzbmRhdGEoDQo+ID4gKwkJCQkmbWx4cGxhdF9kZXYtPmRldiwgIm1seGNwbGQt aG90cGx1ZyIsDQo+IA0KPiA+IC0xLA0KPiANCj4gSXNuJ3QgaXQgc29tZXRoaW5nIGxpa2UgUExB VEZPUk1fREVWSURfQVVUTyAvIE5PTkUgPw0KDQpXaWxsIGNoYW5nZSAtMSB0byBQTEFURk9STV9E RVZJRF9OT05FLg0KDQo+IA0KPiA+ICsJCQkJbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcmVzb3Vy Y2VzLA0KPiA+ICsJCQkJQVJSQVlfU0laRShtbHhwbGF0X21seGNwbGRfaG90cGx1Z19yZQ0KPiA+ IHNvdXJjZXMpLA0KPiA+ICsJCQkJbWx4cGxhdF9ob3RwbHVnLA0KPiA+IHNpemVvZigqbWx4cGxh dF9ob3RwbHVnKSk7DQo+ID4gKwlpZiAoSVNfRVJSKHByaXYtPnBkZXZfaG90cGx1ZykpIHsNCj4g PiArCQllcnIgPSBQVFJfRVJSKHByaXYtPnBkZXZfaG90cGx1Zyk7DQo+ID4gKwkJZ290byBmYWls X3BsYXRmb3JtX211eF9yZWdpc3RlcjsNCj4gPiArCX0NCj4gPiArDQo+ID4gwqAJcmV0dXJuIDA7 DQo+ID4NCj4gPiDCoGZhaWxfcGxhdGZvcm1fbXV4X3JlZ2lzdGVyOg0KPiA+IEBAIC0yNDgsNiAr MzQyLDggQEAgc3RhdGljIHZvaWQgX19leGl0IG1seHBsYXRfZXhpdCh2b2lkKQ0KPiA+IMKgCXN0 cnVjdCBtbHhwbGF0X3ByaXYgKnByaXYgPQ0KPiA+IHBsYXRmb3JtX2dldF9kcnZkYXRhKG1seHBs YXRfZGV2KTsNCj4gPiDCoAlpbnQgaTsNCj4gPg0KPiA+ICsJcGxhdGZvcm1fZGV2aWNlX3VucmVn aXN0ZXIocHJpdi0+cGRldl9ob3RwbHVnKTsNCj4gPiArDQo+ID4gwqAJZm9yIChpID0gQVJSQVlf U0laRShtbHhwbGF0X211eF9kYXRhKSAtIDE7IGkgPj0gMCA7IGktLSkNCj4gPiDCoAkJcGxhdGZv cm1fZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cGRldl9tdXhbaV0pOw0KPiA+DQo+IA0KPiAtLQ0K PiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4NCj4g SW50ZWwgRmlubGFuZCBPeQ0KDQpUaGFuayB5b3UgZm9yIHJldmlldywNClZhZGltLg0K -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c index 86a1356..569d79a 100644 --- a/drivers/platform/x86/mlx-platform.c +++ b/drivers/platform/x86/mlx-platform.c @@ -39,6 +39,7 @@ #include <linux/module.h> #include <linux/platform_device.h> #include <linux/platform_data/i2c-mux-reg.h> +#include <linux/platform_data/mlxcpld-hotplug.h> #define MLX_PLAT_DEVICE_NAME "mlxplat" @@ -70,6 +71,7 @@ struct mlxplat_priv { struct platform_device *pdev_i2c; struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS]; + struct platform_device *pdev_hotplug; }; /* Regions for LPC I2C controller and LPC base register space */ @@ -121,7 +123,87 @@ static struct i2c_mux_reg_platform_data mlxplat_mux_data[] = { }; -static struct platform_device *mlxplat_dev; +/* Platform hotplug devices */ +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_psu[] = { + { + .brdinfo = { I2C_BOARD_INFO("24c02", 0x51) }, + .bus = 10, + }, + { + .brdinfo = { I2C_BOARD_INFO("24c02", 0x50) }, + .bus = 10, + }, +}; + +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_pwr[] = { + { + .brdinfo = { I2C_BOARD_INFO("dps460", 0x59) }, + .bus = 10, + }, + { + .brdinfo = { I2C_BOARD_INFO("dps460", 0x58) }, + .bus = 10, + }, +}; + +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_fan[] = { + { + .brdinfo = { I2C_BOARD_INFO("24c32", 0x50) }, + .bus = 11, + }, + { + .brdinfo = { I2C_BOARD_INFO("24c32", 0x50) }, + .bus = 12, + }, + { + .brdinfo = { I2C_BOARD_INFO("24c32", 0x50) }, + .bus = 13, + }, + { + .brdinfo = { I2C_BOARD_INFO("24c32", 0x50) }, + .bus = 14, + }, +}; + +/* Platform hotplug default data */ +static +struct mlxcpld_hotplug_platform_data mlxplat_mlxcpld_hotplug_default_data = { + .top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a), + .top_aggr_mask = 0x48, + .top_aggr_psu_mask = 0x08, + .psu_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x58), + .psu_mask = 0x03, + .psu_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_psu), + .psu = mlxplat_mlxcpld_hotplug_psu, + .top_aggr_pwr_mask = 0x08, + .pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64), + .pwr_mask = 0x03, + .pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr), + .pwr = mlxplat_mlxcpld_hotplug_pwr, + .top_aggr_fan_mask = 0x40, + .fan_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x88), + .fan_mask = 0x0f, + .fan_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_fan), + .fan = mlxplat_mlxcpld_hotplug_fan, +}; + +/* Platform hotplug MSN21xx system family data */ +static +struct mlxcpld_hotplug_platform_data mlxplat_mlxcpld_hotplug_msn21xx_data = { + .top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a), + .top_aggr_mask = 0x04, + .top_aggr_pwr_mask = 0x04, + .pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64), + .pwr_mask = 0x03, + .pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr), +}; + +static struct resource mlxplat_mlxcpld_hotplug_resources[] = { + [0] = DEFINE_RES_IRQ_NAMED(17, "mlxcpld-hotplug"), +}; + +struct platform_device *mlxplat_dev; +struct mlxcpld_hotplug_platform_data *mlxplat_hotplug; static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) { @@ -132,6 +214,7 @@ static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi) mlxplat_mux_data[i].n_values = ARRAY_SIZE(mlxplat_default_channels[i]); } + mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_default_data; return 1; }; @@ -145,6 +228,7 @@ static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi) mlxplat_mux_data[i].n_values = ARRAY_SIZE(mlxplat_msn21xx_channels); } + mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_msn21xx_data; return 1; }; @@ -230,6 +314,16 @@ static int __init mlxplat_init(void) } } + priv->pdev_hotplug = platform_device_register_resndata( + &mlxplat_dev->dev, "mlxcpld-hotplug", -1, + mlxplat_mlxcpld_hotplug_resources, + ARRAY_SIZE(mlxplat_mlxcpld_hotplug_resources), + mlxplat_hotplug, sizeof(*mlxplat_hotplug)); + if (IS_ERR(priv->pdev_hotplug)) { + err = PTR_ERR(priv->pdev_hotplug); + goto fail_platform_mux_register; + } + return 0; fail_platform_mux_register: @@ -248,6 +342,8 @@ static void __exit mlxplat_exit(void) struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev); int i; + platform_device_unregister(priv->pdev_hotplug); + for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--) platform_device_unregister(priv->pdev_mux[i]);
Add calls for mlxcpld-hotplug platform driver registration/unregistration and add platform hotplug data configurations. This driver, when registered within system will handle system hot-plug events for the power suppliers, power cables and fans (insertion and removing). These events are controlled through CPLD Lattice device. Signed-off-by: Vadim Pasternak <vadimp@mellanox.com> v1->v2: Comments pointed out by Andy: - Remove "from sender" from the message body; - Add more information to commit message. (When CPLD spec will be available at Mellanox portal - MAINTAINERS Web-page info is to be updated); - Do not change include order. --- drivers/platform/x86/mlx-platform.c | 98 ++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-)