Lines Matching +full:surface +full:- +full:sam
1 // SPDX-License-Identifier: GPL-2.0+
3 * AC driver for 7th-generation Microsoft Surface devices via Surface System
6 * Copyright (C) 2019-2021 Maximilian Luz <[email protected]>
19 /* -- SAM interface. -------------------------------------------------------- */
43 /* -- Device structures. ---------------------------------------------------- */
65 /* -- State management. ----------------------------------------------------- */
69 __le32 old = ac->state; in spwr_ac_update_unlocked()
72 lockdep_assert_held(&ac->lock); in spwr_ac_update_unlocked()
74 status = ssam_retry(ssam_bat_get_psrc, ac->sdev, &ac->state); in spwr_ac_update_unlocked()
78 return old != ac->state; in spwr_ac_update_unlocked()
85 mutex_lock(&ac->lock); in spwr_ac_update()
87 mutex_unlock(&ac->lock); in spwr_ac_update()
98 power_supply_changed(ac->psy); in spwr_ac_recheck()
110 dev_dbg(&ac->sdev->dev, "power event (cid = %#04x, iid = %#04x, tid = %#04x)\n", in spwr_notify_ac()
111 event->command_id, event->instance_id, event->target_id); in spwr_notify_ac()
122 switch (event->command_id) { in spwr_notify_ac()
133 /* -- Properties. ----------------------------------------------------------- */
145 mutex_lock(&ac->lock); in spwr_ac_get_property()
153 val->intval = !!le32_to_cpu(ac->state); in spwr_ac_get_property()
157 status = -EINVAL; in spwr_ac_get_property()
162 mutex_unlock(&ac->lock); in spwr_ac_get_property()
167 /* -- Device setup. --------------------------------------------------------- */
177 mutex_init(&ac->lock); in spwr_ac_init()
178 strscpy(ac->name, name, sizeof(ac->name)); in spwr_ac_init()
180 ac->sdev = sdev; in spwr_ac_init()
182 ac->notif.base.priority = 1; in spwr_ac_init()
183 ac->notif.base.fn = spwr_notify_ac; in spwr_ac_init()
184 ac->notif.event.reg = registry; in spwr_ac_init()
185 ac->notif.event.id.target_category = sdev->uid.category; in spwr_ac_init()
186 ac->notif.event.id.instance = 0; in spwr_ac_init()
187 ac->notif.event.mask = SSAM_EVENT_MASK_NONE; in spwr_ac_init()
188 ac->notif.event.flags = SSAM_EVENT_SEQUENCED; in spwr_ac_init()
190 ac->psy_desc.name = ac->name; in spwr_ac_init()
191 ac->psy_desc.type = POWER_SUPPLY_TYPE_MAINS; in spwr_ac_init()
192 ac->psy_desc.properties = spwr_ac_props; in spwr_ac_init()
193 ac->psy_desc.num_properties = ARRAY_SIZE(spwr_ac_props); in spwr_ac_init()
194 ac->psy_desc.get_property = spwr_ac_get_property; in spwr_ac_init()
204 status = ssam_retry(ssam_bat_get_sta, ac->sdev, &sta); in spwr_ac_register()
209 return -ENODEV; in spwr_ac_register()
215 ac->psy = devm_power_supply_register(&ac->sdev->dev, &ac->psy_desc, &psy_cfg); in spwr_ac_register()
216 if (IS_ERR(ac->psy)) in spwr_ac_register()
217 return PTR_ERR(ac->psy); in spwr_ac_register()
219 return ssam_device_notifier_register(ac->sdev, &ac->notif); in spwr_ac_register()
223 /* -- Driver setup. --------------------------------------------------------- */
238 return -ENODEV; in surface_ac_probe()
240 ac = devm_kzalloc(&sdev->dev, sizeof(*ac), GFP_KERNEL); in surface_ac_probe()
242 return -ENOMEM; in surface_ac_probe()
244 spwr_ac_init(ac, sdev, p->registry, p->name); in surface_ac_probe()
254 ssam_device_notifier_unregister(sdev, &ac->notif); in surface_ac_remove()
263 { SSAM_SDEV(BAT, SAM, 0x01, 0x01), (unsigned long)&spwr_psy_props_adp1 },
281 MODULE_DESCRIPTION("AC driver for Surface System Aggregator Module");