2727/* OP MODE require at least 153 us to clear regs */
2828#define LP55XX_CMD_SLEEP 200
2929
30- #define LP55xx_PROGRAM_LENGTH 32
30+ #define LP55xx_PROGRAM_PAGES 16
31+ #define LP55xx_MAX_PROGRAM_LENGTH (LP55xx_BYTES_PER_PAGE * 4) /* 128 bytes (4 pages) */
3132
3233/*
3334 * Program Memory Operations
@@ -172,12 +173,16 @@ int lp55xx_update_program_memory(struct lp55xx_chip *chip,
172173{
173174 enum lp55xx_engine_index idx = chip -> engine_idx ;
174175 const struct lp55xx_device_config * cfg = chip -> cfg ;
175- u8 pattern [LP55xx_PROGRAM_LENGTH ] = { };
176+ u8 pattern [LP55xx_MAX_PROGRAM_LENGTH ] = { };
176177 u8 start_addr = cfg -> prog_mem_base .addr ;
177- int i = 0 , offset = 0 ;
178- int ret ;
178+ int page , i = 0 , offset = 0 ;
179+ int program_length , ret ;
180+
181+ program_length = LP55xx_BYTES_PER_PAGE ;
182+ if (cfg -> pages_per_engine )
183+ program_length *= cfg -> pages_per_engine ;
179184
180- while ((offset < size - 1 ) && (i < LP55xx_PROGRAM_LENGTH )) {
185+ while ((offset < size - 1 ) && (i < program_length )) {
181186 unsigned int cmd ;
182187 int nrchars ;
183188 char c [3 ];
@@ -206,12 +211,20 @@ int lp55xx_update_program_memory(struct lp55xx_chip *chip,
206211 * For LED chip that support page, PAGE is already set in load_engine.
207212 */
208213 if (!cfg -> pages_per_engine )
209- start_addr += LP55xx_PROGRAM_LENGTH * idx ;
214+ start_addr += LP55xx_BYTES_PER_PAGE * idx ;
210215
211- for (i = 0 ; i < LP55xx_PROGRAM_LENGTH ; i ++ ) {
212- ret = lp55xx_write (chip , start_addr + i , pattern [i ]);
213- if (ret )
214- return - EINVAL ;
216+ for (page = 0 ; page < program_length / LP55xx_BYTES_PER_PAGE ; page ++ ) {
217+ /* Write to the next page each 32 bytes (if supported) */
218+ if (cfg -> pages_per_engine )
219+ lp55xx_write (chip , LP55xx_REG_PROG_PAGE_SEL ,
220+ LP55xx_PAGE_OFFSET (idx , cfg -> pages_per_engine ) + page );
221+
222+ for (i = 0 ; i < LP55xx_BYTES_PER_PAGE ; i ++ ) {
223+ ret = lp55xx_write (chip , start_addr + i ,
224+ pattern [i + (page * LP55xx_BYTES_PER_PAGE )]);
225+ if (ret )
226+ return - EINVAL ;
227+ }
215228 }
216229
217230 return size ;
@@ -224,13 +237,19 @@ EXPORT_SYMBOL_GPL(lp55xx_update_program_memory);
224237
225238void lp55xx_firmware_loaded_cb (struct lp55xx_chip * chip )
226239{
240+ const struct lp55xx_device_config * cfg = chip -> cfg ;
227241 const struct firmware * fw = chip -> fw ;
242+ int program_length ;
243+
244+ program_length = LP55xx_BYTES_PER_PAGE ;
245+ if (cfg -> pages_per_engine )
246+ program_length *= cfg -> pages_per_engine ;
228247
229248 /*
230249 * the firmware is encoded in ascii hex character, with 2 chars
231250 * per byte
232251 */
233- if (fw -> size > LP55xx_PROGRAM_LENGTH * 2 ) {
252+ if (fw -> size > program_length * 2 ) {
234253 dev_err (& chip -> cl -> dev , "firmware data size overflow: %zu\n" ,
235254 fw -> size );
236255 return ;
@@ -1276,7 +1295,7 @@ static struct lp55xx_platform_data *lp55xx_of_populate_pdata(struct device *dev,
12761295int lp55xx_probe (struct i2c_client * client )
12771296{
12781297 const struct i2c_device_id * id = i2c_client_get_device_id (client );
1279- int ret ;
1298+ int program_length , ret ;
12801299 struct lp55xx_chip * chip ;
12811300 struct lp55xx_led * led ;
12821301 struct lp55xx_platform_data * pdata = dev_get_platdata (& client -> dev );
@@ -1300,6 +1319,17 @@ int lp55xx_probe(struct i2c_client *client)
13001319 }
13011320 }
13021321
1322+ /* Validate max program page */
1323+ program_length = LP55xx_BYTES_PER_PAGE ;
1324+ if (chip -> cfg -> pages_per_engine )
1325+ program_length *= chip -> cfg -> pages_per_engine ;
1326+
1327+ /* support a max of 128bytes */
1328+ if (program_length > LP55xx_MAX_PROGRAM_LENGTH ) {
1329+ dev_err (& client -> dev , "invalid pages_per_engine configured\n" );
1330+ return - EINVAL ;
1331+ }
1332+
13031333 led = devm_kcalloc (& client -> dev ,
13041334 pdata -> num_channels , sizeof (* led ), GFP_KERNEL );
13051335 if (!led )
0 commit comments