Lines Matching refs:cgbc
59 static int cgbc_wait_device(struct cgbc_device_data *cgbc) in cgbc_wait_device() argument
64 ret = readx_poll_timeout(ioread16, cgbc->io_session + CGBC_SESSION_STATUS, status, in cgbc_wait_device()
67 if (ret || ioread32(cgbc->io_session + CGBC_SESSION_ACCESS)) in cgbc_wait_device()
73 static int cgbc_session_command(struct cgbc_device_data *cgbc, u8 cmd) in cgbc_session_command() argument
78 ret = readx_poll_timeout(ioread8, cgbc->io_session + CGBC_SESSION_CMD, val, in cgbc_session_command()
83 iowrite8(cmd, cgbc->io_session + CGBC_SESSION_CMD); in cgbc_session_command()
85 ret = readx_poll_timeout(ioread8, cgbc->io_session + CGBC_SESSION_CMD, val, in cgbc_session_command()
90 ret = (int)ioread8(cgbc->io_session + CGBC_SESSION_DATA); in cgbc_session_command()
92 iowrite8(CGBC_SESSION_STATUS_FREE, cgbc->io_session + CGBC_SESSION_STATUS); in cgbc_session_command()
97 static int cgbc_session_request(struct cgbc_device_data *cgbc) in cgbc_session_request() argument
101 ret = cgbc_wait_device(cgbc); in cgbc_session_request()
104 return dev_err_probe(cgbc->dev, ret, "device not found or not ready\n"); in cgbc_session_request()
106 cgbc->session = cgbc_session_command(cgbc, CGBC_SESSION_CMD_REQUEST); in cgbc_session_request()
109 if (cgbc->session < CGBC_SESSION_VALID_MIN || cgbc->session > CGBC_SESSION_VALID_MAX) in cgbc_session_request()
110 return dev_err_probe(cgbc->dev, -ECONNREFUSED, in cgbc_session_request()
116 static void cgbc_session_release(struct cgbc_device_data *cgbc) in cgbc_session_release() argument
118 if (cgbc_session_command(cgbc, cgbc->session) != cgbc->session) in cgbc_session_release()
119 dev_warn(cgbc->dev, "failed to release session\n"); in cgbc_session_release()
122 static bool cgbc_command_lock(struct cgbc_device_data *cgbc) in cgbc_command_lock() argument
124 iowrite8(cgbc->session, cgbc->io_cmd + CGBC_CMD_ACCESS); in cgbc_command_lock()
126 return ioread8(cgbc->io_cmd + CGBC_CMD_ACCESS) == cgbc->session; in cgbc_command_lock()
129 static void cgbc_command_unlock(struct cgbc_device_data *cgbc) in cgbc_command_unlock() argument
131 iowrite8(cgbc->session, cgbc->io_cmd + CGBC_CMD_ACCESS); in cgbc_command_unlock()
134 int cgbc_command(struct cgbc_device_data *cgbc, void *cmd, unsigned int cmd_size, void *data, in cgbc_command() argument
144 mutex_lock(&cgbc->lock); in cgbc_command()
147 ret = readx_poll_timeout(cgbc_command_lock, cgbc, lock, lock, 0, 100000); in cgbc_command()
152 ret = readx_poll_timeout(ioread8, cgbc->io_cmd + CGBC_CMD_STROBE, val, in cgbc_command()
159 iowrite8(CGBC_CMD_INDEX_CBM_MAN8, cgbc->io_cmd + CGBC_CMD_INDEX); in cgbc_command()
161 iowrite8(CGBC_CMD_INDEX_CBM_AUTO32, cgbc->io_cmd + CGBC_CMD_INDEX); in cgbc_command()
167 iowrite8(_cmd[i], cgbc->io_cmd + CGBC_CMD_DATA + (i % 4)); in cgbc_command()
170 iowrite8((i + 1) | CGBC_CMD_INDEX_CBM_MAN8, cgbc->io_cmd + CGBC_CMD_INDEX); in cgbc_command()
174 iowrite8(checksum, cgbc->io_cmd + CGBC_CMD_DATA + (i % 4)); in cgbc_command()
177 iowrite8(cgbc->session, cgbc->io_cmd + CGBC_CMD_STROBE); in cgbc_command()
180 iowrite8(CGBC_CMD_INDEX_CBM_AUTO32, cgbc->io_cmd + CGBC_CMD_INDEX); in cgbc_command()
184 cgbc->io_cmd + CGBC_CMD_STROBE); in cgbc_command()
188 istatus = ioread8(cgbc->io_cmd + CGBC_CMD_DATA); in cgbc_command()
197 _data[i] = ioread8(cgbc->io_cmd + CGBC_CMD_DATA + ((i + 1) % 4)); in cgbc_command()
200 data_checksum = ioread8(cgbc->io_cmd + CGBC_CMD_DATA + ((i + 1) % 4)); in cgbc_command()
205 data_checksum = ioread8(cgbc->io_cmd + CGBC_CMD_DATA + 1); in cgbc_command()
211 data_checksum = ioread8(cgbc->io_cmd + CGBC_CMD_DATA + 1); in cgbc_command()
222 cgbc_command_unlock(cgbc); in cgbc_command()
225 mutex_unlock(&cgbc->lock); in cgbc_command()
241 static int cgbc_map(struct cgbc_device_data *cgbc) in cgbc_map() argument
243 struct device *dev = cgbc->dev; in cgbc_map()
251 cgbc->io_session = devm_ioport_map(dev, ioport->start, resource_size(ioport)); in cgbc_map()
252 if (!cgbc->io_session) in cgbc_map()
259 cgbc->io_cmd = devm_ioport_map(dev, ioport->start, resource_size(ioport)); in cgbc_map()
260 if (!cgbc->io_cmd) in cgbc_map()
282 struct cgbc_device_data *cgbc = dev_get_drvdata(dev); in cgbc_version_show() local
284 return sysfs_emit(buf, "CGBCP%c%c%c\n", cgbc->version.feature, cgbc->version.major, in cgbc_version_show()
285 cgbc->version.minor); in cgbc_version_show()
295 ATTRIBUTE_GROUPS(cgbc);
297 static int cgbc_get_version(struct cgbc_device_data *cgbc) in cgbc_get_version() argument
303 ret = cgbc_command(cgbc, &cmd, 1, &data, sizeof(data), NULL); in cgbc_get_version()
307 cgbc->version.feature = data[0]; in cgbc_get_version()
308 cgbc->version.major = data[1]; in cgbc_get_version()
309 cgbc->version.minor = data[2]; in cgbc_get_version()
314 static int cgbc_init_device(struct cgbc_device_data *cgbc) in cgbc_init_device() argument
318 ret = cgbc_session_request(cgbc); in cgbc_init_device()
322 ret = cgbc_get_version(cgbc); in cgbc_init_device()
326 ret = mfd_add_devices(cgbc->dev, -1, cgbc_devs, ARRAY_SIZE(cgbc_devs), in cgbc_init_device()
334 cgbc_session_release(cgbc); in cgbc_init_device()
341 struct cgbc_device_data *cgbc; in cgbc_probe() local
344 cgbc = devm_kzalloc(dev, sizeof(*cgbc), GFP_KERNEL); in cgbc_probe()
345 if (!cgbc) in cgbc_probe()
348 cgbc->dev = dev; in cgbc_probe()
350 ret = cgbc_map(cgbc); in cgbc_probe()
354 mutex_init(&cgbc->lock); in cgbc_probe()
356 platform_set_drvdata(pdev, cgbc); in cgbc_probe()
358 return cgbc_init_device(cgbc); in cgbc_probe()
363 struct cgbc_device_data *cgbc = platform_get_drvdata(pdev); in cgbc_remove() local
365 cgbc_session_release(cgbc); in cgbc_remove()